Skip to content

feat: Qt-free source/ library with full hardware stack and test coverage - #90

Open
Bryant Forsgren (bryantf-qc) wants to merge 20 commits into
qualcomm:developfrom
bryantf-qc:pr/qt-free-source-library
Open

Bryant Forsgren (bryantf-qc) wants to merge 20 commits into
qualcomm:developfrom
bryantf-qc:pr/qt-free-source-library

Conversation

@bryantf-qc

@bryantf-qc Bryant Forsgren (bryantf-qc) commented Sep 17, 2026 •

Copy link
Copy Markdown
Contributor

Adds a standalone Qt-free source/ subtree that mirrors the production qcommon-console library but uses only std::, qtac::, and hidapi — no Qt dependency required to build the core library.

Hardware support:

  • TACLite (FTDI D2XX): full protocol stack and drive thread
  • TACPSOC (serial): full protocol stack and drive thread
  • TACPIC32CX (serial): full protocol stack and drive thread
  • TACSTM32 (hidapi HID): new full protocol stack and drive thread for BugHopper V2 hardware

Platform configurations:

  • FTDIPlatformConfiguration: GPIO pin/button/variable layouts
  • PSOCPlatformConfiguration: GPIO + optional I2C slave variant
  • PIC32CXPlatformConfiguration: GPIO pin/button layouts
  • STM32PlatformConfiguration: fixed GPIO pin layout (hardcoded)

New types ported from upstream:

  • PSOCVariant / PSOCIICVariant enums with string converters
  • PSOCI2CSlave / PSOCI2CData / PSOCI2CEntries / PSOCI2CSlaves types and full I2C slave management API on _PSOCPlatformConfiguration
  • Notification value type (std::chrono instead of QDateTime)
  • STM32PinData struct and STM32PlatformConfiguration

Build system:

  • source/CMakeLists.txt: new standalone entry point for source/ subtree
  • source/library/CMakeLists.txt: portable path refs via CMAKE_CURRENT_SOURCE_DIR; link_ftd2xx() helper for FTDI linkage
  • source/app/CMakeLists.txt: use link_ftd2xx() helper; remove hard-coded CMAKE_SOURCE_DIR lib-search paths
  • Root CMakeLists.txt unchanged (continues to build src/ only)
  • All build scripts updated to use -S source; no hard-coded paths
  • FTDI bootstrap is fully automatic (downloads CDM archive on configure)

Documentation:

  • source/BUILD.md: correct cmake -S source invocation, FTDI bootstrap description, Linux test paths, project structure

Tests (10 test binaries, all passing):

  • test_bytearray, test_coders_commands, test_containers, test_platform_configs, test_signal, test_string, test_stringutils, test_hardware_ftdi, test_hardware_psoc, test_tacdev_api

Change-Id: Ib64b44df0c0dc23b8a23a3f3b7cc5c16facc5e16

Pull Request

Description
A clear and concise description of what this pull request does.

Related Issue
Link to the issue that this pull request addresses (e.g., Fixes #123).

Type of Change
Please delete options that are not relevant.

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • Documentation update

Checklist

  • My code follows the style guidelines of this project
  • I have performed a self-review of my own code
  • I have commented my code, particularly in hard-to-understand areas
  • I have made corresponding changes to the documentation
  • My changes generate no new warnings
  • I have added tests that prove my fix is effective or that my feature works
  • New and existing unit tests pass locally with my changes
  • Any dependent changes have been merged and published in downstream modules

Additional Context
Add any other context or screenshots about the pull request here.

Adds a standalone Qt-free source/ subtree that mirrors the production
qcommon-console library but uses only std::, qtac::, and hidapi — no Qt
dependency required to build the core library.

Hardware support:
- TACLite (FTDI D2XX): full protocol stack and drive thread
- TACPSOC (serial): full protocol stack and drive thread
- TACPIC32CX (serial): full protocol stack and drive thread
- TACSTM32 (hidapi HID): new full protocol stack and drive thread
  for BugHopper V2 hardware

Platform configurations:
- FTDIPlatformConfiguration: GPIO pin/button/variable layouts
- PSOCPlatformConfiguration: GPIO + optional I2C slave variant
- PIC32CXPlatformConfiguration: GPIO pin/button layouts
- STM32PlatformConfiguration: fixed GPIO pin layout (hardcoded)

New types ported from upstream:
- PSOCVariant / PSOCIICVariant enums with string converters
- PSOCI2CSlave / PSOCI2CData / PSOCI2CEntries / PSOCI2CSlaves types
  and full I2C slave management API on _PSOCPlatformConfiguration
- Notification value type (std::chrono instead of QDateTime)
- STM32PinData struct and STM32PlatformConfiguration

Build system:
- source/CMakeLists.txt: new standalone entry point for source/ subtree
- source/library/CMakeLists.txt: portable path refs via
  CMAKE_CURRENT_SOURCE_DIR; link_ftd2xx() helper for FTDI linkage
- source/app/CMakeLists.txt: use link_ftd2xx() helper; remove
  hard-coded CMAKE_SOURCE_DIR lib-search paths
- Root CMakeLists.txt unchanged (continues to build src/ only)
- All build scripts updated to use -S source; no hard-coded paths
- FTDI bootstrap is fully automatic (downloads CDM archive on configure)

Documentation:
- source/BUILD.md: correct cmake -S source invocation, FTDI bootstrap
  description, Linux test paths, project structure

Tests (10 test binaries, all passing):
- test_bytearray, test_coders_commands, test_containers,
  test_platform_configs, test_signal, test_string, test_stringutils,
  test_hardware_ftdi, test_hardware_psoc, test_tacdev_api

Signed-off-by: Bryant Featherstone <bryantf@qti.qualcomm.com>

Change-Id: Ib64b44df0c0dc23b8a23a3f3b7cc5c16facc5e16
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Signed-off-by: Forsgren, Bryant <bryantf@qti.qualcomm.com>

@github-advanced-security github-advanced-security AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Semgrep OSS found more than 20 potential problems in the proposed changes. Check the Files changed tab for more details.

Add nosemgrep suppressions for two known false positives:
- cxx.funcret.gen.non-void-function-no-return on Qt UI namespace
  forward declarations in TACDeviceSelection.h and TACWindow.h
- cpp.mismatched.new-delete-array on correct delete[] usage in
  FTDIChipset.cpp (both Linux and Windows traversal paths)

Add .semgrepignore to exclude third-party/ from all Semgrep scans
so vendored Boost headers are not flagged.

Change-Id: Ib0a7551fa147ead98e7fb7f60d4eada730b3abe6
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Comment thread source/app/TACDeviceSelection.h Fixed
Comment thread source/app/TACWindow.h Fixed
Comment thread source/app/TACWindow.h
namespace Ui { class TACWindowClass; } // nosemgrep: cxx.funcret.gen.non-void-function-no-return
QT_END_NAMESPACE

namespace qtac { class TACDriveThread; }
Comment thread source/library/src/FTDIChipset.cpp Fixed
Comment thread source/library/src/FTDIChipset.cpp Fixed
Short rule ID suffixes are not matched by Semgrep — the full
qualified ID including the reusable-workflows.semgrep_rules prefix
is required for inline suppression to take effect.

Change-Id: If1d1aca65366288ebee2bab8ec47eaa89474ac91
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Comment thread source/app/TACDeviceSelection.h Fixed
Comment thread source/app/TACWindow.h Fixed
Comment thread source/library/src/FTDIChipset.cpp Fixed
Comment thread source/library/src/FTDIChipset.cpp Fixed
Rule-ID-qualified nosemgrep comments did not suppress the findings.
Switching to plain // nosemgrep which suppresses all rules on that
line unconditionally.

Change-Id: I6549e3bcc3ba0baf8ceb86bdf357337b0cb3afc8
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
#include <QByteArray>

QT_BEGIN_NAMESPACE
namespace Ui { class TACDeviceSelectionClass; } // nosemgrep
Comment thread source/app/TACWindow.h
#include <QTimer>

QT_BEGIN_NAMESPACE
namespace Ui { class TACWindowClass; } // nosemgrep
}
}

delete[] devInfoList; // nosemgrep
}
}

delete[] devInfoList; // nosemgrep
- Set author to "bryantf-qc"
- Bump fileVersion from 0 to 1 (minimum is 1)
- Add required fields: platform_type, reset_enabled, script, tabs
- Remove unexpected field: pineVersion

Change-Id: If438d48cab8fb17e1b4ba56d8c846ae21de28c5c
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Change-Id: Ib80356914b4367bfd0a089e2a7bdce36e7ab84f2
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ibrary

Change-Id: If4a544d4f33022c5abe933abbc2345208a38ec98
ftd2xx.h and WinTypes.h are third-party vendor headers bundled in
source/library. Add explicit exclusions to .semgrepignore so they
are not scanned alongside project code.

Change-Id: I009383e83a796dedd2d3fd5d4568bf6fff0576a9
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ource-library

Change-Id: Ic1bd5d9775462a2bfe6221d5ee0adc2bd84982d8
The qt-adapter library was already moved to source/libraries/qt-adapter
and the src/libraries/CMakeLists.txt had it commented out. Remove the
now-dead directory and clean up the stale comment.

Change-Id: I350f61e5847115ec17c34fa2dae9c47d87363163
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Add three new CI jobs that build, test, and package the refactored
Qt-free source/ subtree:

- build-source-linux: configures with -S source, runs ctest, deploys
  Qt runtime manually, and packages a .deb via package_QTAC.sh
- build-source-windows: uses build_app.ps1 with QTDIR set, runs
  ctest, and builds a Windows x64 installer
- build-source-windows-arm64: inlines vcvarsall.bat arm64 setup
  (build_app.ps1 is x64-only), runs ctest, builds ARM64 installer

All three jobs run in parallel with the existing src/ jobs, share
the same FTDI fetch/cache and build-docs dependencies, and produce
named artifacts with a -source- infix to distinguish them.

Change-Id: I5b90c73ea14db4a3c2ddf39f66283c566499b86d
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Remove 1216 vendored Boost header files from third-party/include/boost/
and fetch boost::json, boost::predef, and their transitive dependencies
(config, assert, mp11, throw_exception, container_hash, describe) via
CMake FetchContent at configure time.

All fetched include paths are collected into a boost_headers INTERFACE
target which qtac-core links against, keeping the same BOOST_ALL_NO_LIB
define to suppress Windows auto-link pragmas.

Change-Id: I4b7eff9ae39fecfea362c214061ba50749ea47cc
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@bryantf-qc
Bryant Forsgren (bryantf-qc) requested a review from a team as a code owner October 6, 2026 19:58
The per-module approach (8 separate boostorg/* repos) failed to build
because boost::json has deep transitive dependencies within the Boost
superproject (e.g. boost/utility/string_view.hpp) that were not covered
by the explicitly fetched modules.

Replace with a single FetchContent download of the complete Boost 1.78.0
headers-only tarball (boost_1_78_0.tar.gz, ~125 MB). This provides all
headers required by boost::json without needing to enumerate the full
transitive dependency graph. The tarball is cached by CMake/FetchContent
after the first run.

Also use FetchContent_Populate (via CMP0169 OLD) to prevent CMake from
processing Boost's CMakeLists.txt as a subdirectory.

Change-Id: I3c483eed6788876ae9bb3ce8dcae5c6d853dcc48
Signed-off-by: bryantf <bryantf@qti.qualcomm.com>
Comment on lines +304 to +405
build-source-linux:
needs: [fetch-ftdi-linux, build-docs]
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-22.04, ubuntu-latest]
qt_version: ['6.9.2', '6.10.0']

steps:
- uses: actions/checkout@v6

- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install -y python3-pip wget libxkbcommon-x11-0 x11-common libxcb-xinerama0-dev build-essential libgl1-mesa-dev mesa-common-dev uuid-dev libpulse-dev ninja-build libudev-dev

- name: Cache Qt installation on Linux
uses: actions/cache@v5
with:
path: ${{ matrix.qt_version }}/gcc_64
key: ${{ matrix.os }}-qt-${{ matrix.qt_version }}

- name: Install aqtinstall
run: pip install aqtinstall

- name: Install Qt ${{ matrix.qt_version }} on ${{ matrix.os }}
run: |
aqt install-qt linux desktop ${{ matrix.qt_version }} linux_gcc_64 -m qtmultimedia qtserialport
echo "QTBIN=$HOME/work/qcom-test-automation-controller/qcom-test-automation-controller/${{ matrix.qt_version }}/gcc_64/bin" >> $GITHUB_ENV

- name: Restore FTDI archive on Linux
uses: actions/cache/restore@v5
with:
path: third-party/libftd2xx-linux-x86_64-1.4.33.tgz
key: ftdi-linux-1.4.33

- name: Configure
run: |
export PATH="$QTBIN:$PATH"
cmake -S source -B build/source/Release \
-DCMAKE_PREFIX_PATH="$(dirname $QTBIN)" \
-DCMAKE_COLOR_DIAGNOSTICS=ON \
-DCMAKE_GENERATOR=Ninja \
-DCMAKE_BUILD_TYPE=Release

- name: Build
run: cmake --build build/source/Release

- name: Run tests
run: |
cd build/source/Release
ctest --output-on-failure

- name: Install patchelf
run: sudo apt-get install -y patchelf

- name: Deploy Qt runtime
run: |
export PATH="$QTBIN:$PATH"
QT_ROOT="$(dirname $QTBIN)"
DEPLOY_BIN_DIR="__Builds/Linux/Release/bin"
DEPLOY_LIB_DIR="__Builds/Linux/Release/lib"
DEPLOY_PLUGIN_DIR="__Builds/Linux/Release/plugins"
mkdir -p "$DEPLOY_LIB_DIR" "$DEPLOY_PLUGIN_DIR"
find "$DEPLOY_BIN_DIR" -type f -executable -exec ldd {} \; 2>/dev/null \
| awk '/=>/ {print $3}' | sort -u \
| grep "$QT_ROOT" \
| xargs -I{} cp -an {} "$DEPLOY_LIB_DIR/" || true
find "$QT_ROOT/lib" -maxdepth 1 -name "libQt6*.so*" -exec cp -an {} "$DEPLOY_LIB_DIR/" \; || true
for plugin_dir in iconengines imageformats platforminputcontexts platforms platformthemes xcbglintegrations; do
if [ -d "$QT_ROOT/plugins/$plugin_dir" ]; then
mkdir -p "$DEPLOY_PLUGIN_DIR/$plugin_dir"
cp -a "$QT_ROOT/plugins/$plugin_dir/." "$DEPLOY_PLUGIN_DIR/$plugin_dir/"
fi
done
find "$DEPLOY_BIN_DIR" -type f -executable | while read exe; do
patchelf --set-rpath '$ORIGIN/../lib' "$exe" || true
done

- name: Download built docs artifact
uses: actions/download-artifact@v4
with:
name: qtac-docs-html
path: docs-html

- name: Replace docs source with built HTML
run: |
rm -rf docs
mv docs-html docs

- name: Package QTAC (source)
run: |
chmod +x packaging/linux/package_QTAC.sh
PKG_NAME=qualcomm-qtac-source ./packaging/linux/package_QTAC.sh

- name: Upload installer artifact
uses: actions/upload-artifact@v4
with:
name: QTAC-source-${{ matrix.os }}-qt${{ matrix.qt_version }}.deb
path: packaging/linux/build/*.deb
if-no-files-found: error
Comment on lines +407 to +477
build-source-windows:
needs: [fetch-ftdi-windows, build-docs]
runs-on: windows-2022
strategy:
fail-fast: false
matrix:
qt_version: ['6.9.2', '6.10.0']

steps:
- uses: actions/checkout@v6

- name: Install Python dependencies
shell: pwsh
run: pip install aqtinstall

- name: Cache Qt installation on Windows
uses: actions/cache@v5
with:
path: C:\Qt\${{ matrix.qt_version }}\msvc2022_64
key: ${{ runner.os }}-qt-${{ matrix.qt_version }}

- name: Install Qt ${{ matrix.qt_version }} for MSVC
shell: pwsh
run: |
aqt install-qt windows desktop ${{ matrix.qt_version }} win64_msvc2022_64 --outputdir "C:\Qt" -m qtserialport qtmultimedia
echo "QTBIN=C:\Qt\${{ matrix.qt_version }}\msvc2022_64\bin" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append

- name: Restore FTDI archive on Windows
uses: actions/cache/restore@v5
with:
path: third-party\CDM-v2.12.36.4-WHQL-Certified.zip
key: ftdi-windows-2.12.36.4

- name: Install .NET Framework 4.8 Developer Pack
shell: pwsh
run: choco install netfx-4.8-devpack -y

- name: Build (source)
shell: pwsh
run: |
$env:QTDIR = "C:\Qt\${{ matrix.qt_version }}\msvc2022_64"
.\build_app.ps1

- name: Run tests
shell: pwsh
run: |
cd build\Release
ctest --output-on-failure

- name: Download built docs artifact
uses: actions/download-artifact@v4
with:
name: qtac-docs-html
path: docs-html

- name: Replace docs source with built HTML
shell: pwsh
run: |
Remove-Item -Recurse -Force docs
Move-Item docs-html docs

- name: Build installer (QTAC-source-windows-x64.exe)
shell: pwsh
run: .\packaging\windows\build-installer.ps1

- name: Upload installer artifact
uses: actions/upload-artifact@v4
with:
name: QTAC-source-windows-x64-qt${{ matrix.qt_version }}
path: __Builds\installer\QTAC-windows-x64.exe
if-no-files-found: error
Comment on lines +479 to +568
build-source-windows-arm64:
needs: [fetch-ftdi-windows-arm64, build-docs]
runs-on: windows-11-arm
strategy:
fail-fast: false
matrix:
qt_version: ['6.9.2', '6.10.0']

steps:
- uses: actions/checkout@v6

- name: Install Python dependencies
shell: pwsh
run: pip install aqtinstall

- name: Cache Qt installation for ARM64
uses: actions/cache@v5
with:
path: C:\Qt\${{ matrix.qt_version }}\msvc2022_arm64
key: windows-arm64-qt-${{ matrix.qt_version }}

- name: Install Qt ${{ matrix.qt_version }} for MSVC ARM64
shell: pwsh
run: |
aqt install-qt windows_arm64 desktop ${{ matrix.qt_version }} win64_msvc2022_arm64 --outputdir "C:\Qt" --autodesktop -m qtserialport qtmultimedia
echo "QTBIN=C:\Qt\${{ matrix.qt_version }}\msvc2022_arm64\bin" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append

- name: Restore FTDI archive for ARM64
uses: actions/cache/restore@v5
with:
path: third-party\CDM-v2.12.36.20-for-ARM64-WHQL-Certified.zip
key: ftdi-windows-arm64-2.12.36.20

- name: Build (source)
shell: pwsh
run: |
$env:QTDIR = "C:\Qt\${{ matrix.qt_version }}\msvc2022_arm64"
$vswhere = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe"
$vsPath = ""
if (Test-Path $vswhere) {
$vsPath = & $vswhere -nologo -latest -property installationPath 2>$null
}
if (-not $vsPath) {
foreach ($e in @('Enterprise','Community','Professional')) {
$p = "C:\Program Files\Microsoft Visual Studio\2022\$e"
if (Test-Path $p) { $vsPath = $p; break }
}
}
if (-not $vsPath) { throw "VS2022 not found" }
$vcvarsall = "$vsPath\VC\Auxiliary\Build\vcvarsall.bat"
$envLines = cmd /c "`"$vcvarsall`" arm64 && set" 2>&1
$envLines | Where-Object { $_ -match '^[A-Za-z_][A-Za-z0-9_]+=.' } | ForEach-Object {
$kv = $_ -split '=', 2
if ($kv.Count -eq 2) { [System.Environment]::SetEnvironmentVariable($kv[0], $kv[1]) }
}
$qtRoot = $env:QTDIR
$env:PATH = "$qtRoot\bin;$env:PATH"
cmake -S source -B build\Release -DCMAKE_PREFIX_PATH="$qtRoot" -G Ninja -DCMAKE_BUILD_TYPE=Release
if ($LASTEXITCODE -ne 0) { throw "Configure failed" }
cmake --build build\Release
if ($LASTEXITCODE -ne 0) { throw "Build failed" }

- name: Run tests
shell: pwsh
run: |
cd build\Release
ctest --output-on-failure

- name: Download built docs artifact
uses: actions/download-artifact@v4
with:
name: qtac-docs-html
path: docs-html

- name: Replace docs source with built HTML
shell: pwsh
run: |
Remove-Item -Recurse -Force docs
Move-Item docs-html docs

- name: Build installer (QTAC-source-windows-arm64.exe)
shell: pwsh
run: .\packaging\windows\build-installer.ps1

- name: Upload installer artifact
uses: actions/upload-artifact@v4
with:
name: QTAC-source-windows-arm64-qt${{ matrix.qt_version }}
path: __Builds\installer\QTAC-windows-arm64.exe
if-no-files-found: error
qt_version: ['6.9.2', '6.10.0']

steps:
- uses: actions/checkout@v6
qt_version: ['6.9.2', '6.10.0']

steps:
- uses: actions/checkout@v6
qt_version: ['6.9.2', '6.10.0']

steps:
- uses: actions/checkout@v6
run: .\packaging\windows\build-installer.ps1

- name: Upload installer artifact
uses: actions/upload-artifact@v4
ctest --output-on-failure

- name: Download built docs artifact
uses: actions/download-artifact@v4
echo "QTBIN=C:\Qt\${{ matrix.qt_version }}\msvc2022_arm64\bin" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append

- name: Restore FTDI archive for ARM64
uses: actions/cache/restore@v5
run: pip install aqtinstall

- name: Cache Qt installation for ARM64
uses: actions/cache@v5
qt_version: ['6.9.2', '6.10.0']

steps:
- uses: actions/checkout@v6
qt_version: ['6.9.2', '6.10.0']

steps:
- uses: actions/checkout@v6
PKG_NAME=qualcomm-qtac-source ./packaging/linux/package_QTAC.sh

- name: Upload installer artifact
uses: actions/upload-artifact@v4
echo "QTBIN=$HOME/work/qcom-test-automation-controller/qcom-test-automation-controller/${{ matrix.qt_version }}/gcc_64/bin" >> $GITHUB_ENV

- name: Restore FTDI archive on Linux
uses: actions/cache/restore@v5
sudo apt-get install -y python3-pip wget libxkbcommon-x11-0 x11-common libxcb-xinerama0-dev build-essential libgl1-mesa-dev mesa-common-dev uuid-dev libpulse-dev ninja-build libudev-dev

- name: Cache Qt installation on Linux
uses: actions/cache@v5
qt_version: ['6.9.2', '6.10.0']

steps:
- uses: actions/checkout@v6
Linux: source/ subtree builds output to source/__Builds/ (CMAKE_SOURCE_DIR
is the source/ subdirectory when using -S source). Update the CI deploy
and package steps to reference source/__Builds/Linux/Release/. Also
update package_QTAC.sh to honor a SRC_DIR env var override so it can be
pointed at out-of-tree build outputs.

ARM64 Windows: tacdev/CMakeLists.txt had hardcoded x64 paths in
target_link_directories and linked ftd2xx by bare name. On ARM64 the lib
lives under __Builds/ARM64/Release/lib/. Fix by detecting the target arch
(ARM64/x64/Win32) locally and using link_ftd2xx() which resolves the
correct imported target for the build configuration.

Change-Id: I131d20a3acb7a527f47524bf52237c3df6689cf1
Signed-off-by: bryantf <bryantf@qti.qualcomm.com>
Two bugs fixed:

1. ARM64 (LNK2019 unresolved FT_* symbols):
   QtacCommon.cmake only checked for Win32 vs x64, defaulting all
   64-bit builds to x64 — including ARM64. Add an ARM64 branch using
   CMAKE_SYSTEM_PROCESSOR / CMAKE_GENERATOR_PLATFORM so qtac-core.lib
   is output to __Builds/ARM64/Release/lib/ on ARM64 hosts.

2. Linux bin/ missing (packaging failure):
   CMAKE_RUNTIME_OUTPUT_DIRECTORY was set inside library/'s subdirectory
   scope (via QtacCommon.cmake include), so sibling subdirectories app/
   and test/ did not inherit it. Executables landed in the Ninja build
   tree instead of source/__Builds/Linux/Release/bin/. Fix by setting
   the output directories at the source/CMakeLists.txt scope, before
   add_subdirectory() calls, using the same arch/config detection logic.

Change-Id: Iae48fcf3c62555b5b1f89b920255198c777033c1
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
ARM64 (LNK2019 __imp_FT_*):
  The ARM64 FTDI package provides FTD2XXstatic.lib (no DLL / import lib),
  but ftd2xx.h defaults to __declspec(dllimport), which produces __imp_FT_*
  symbol references that the static lib cannot satisfy.  Define FTD2XX_STATIC
  for Windows ARM64 builds so the header emits undecorated symbols that
  match the static library.

Linux (libicui18n/libicuuc/libicudata not found):
  Qt plugins (platforminputcontexts) depend on ICU shared libs that ship
  alongside Qt in the aqtinstall distribution but were not copied into the
  deploy lib directory.  Add a copy step for libicu*.so* from the Qt root
  lib directory, matching what linuxdeployqt does.

Change-Id: Ie48cee56d6a8a1a63d10ae0a48375162b9e30424
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
_CONTEXT on ARM64 has Pc/Fp/Sp instead of Rip/Rbp/Rsp, and
StackWalk64 does not support ARM64.  Add a _M_ARM64 branch that
logs the PC via SymFromAddr instead of attempting a full stack walk.
The existing x64 / x86 path is unchanged.

Change-Id: I3c886fe563d3bfad9e302b22388d46db1948ffad
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The original path (src/libraries/qcommon-console/version.cmake) only
exists in the full repo layout.  Fall back to version.h in the source/
subtree so build-source-windows and build-source-windows-arm64 produce
correctly versioned installers instead of defaulting to 0.0.0.

Change-Id: I03531637b838afaadaa24a690627332356752be8
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Adds a headless/automation packaging variant (NO_GUI=1 / -NoGui) that
ships libTACDev + Python interfaces + configurations + docs + examples
without the GUI binary, Qt plugins, or xcb runtime dependencies.

package_QTAC.sh:
  - New NO_GUI env var (default 0).  When set: skips bin/ copy/validation,
    plugins copy/validation, Qt plugin dependency check, XCB runtime
    check, patchelf RUNPATH fix, UpdateDeviceList postinst step, and
    libxcb-cursor0 install.  Drops xcb Depends from the control file.

build-installer.ps1:
  - New -NoGui switch.  When set: copies only TACDev.dll + TACDev.lib
    from the build output instead of the full bin/ directory.

build.yml:
  - build-source-linux: adds "Package QTAC (source, no-GUI)" step;
    both .deb files are uploaded together in a single artifact.
  - build-source-windows: adds no-GUI installer step with explicit
    -BinDir pointing to source/__Builds/x64/Release/bin.
  - build-source-windows-arm64: same for ARM64 path.
  - Upload artifact paths updated to *.exe glob to capture both
    GUI and no-GUI installers.

Change-Id: I0429f2e40be63aed308e7a97ee052d3ac485e841
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Fix 1 (missing Qt DLLs in Windows GUI installer):
  Add windeployqt step before the GUI installer step in both
  build-source-windows and build-source-windows-arm64, deploying
  Qt runtime DLLs into source/__Builds/<arch>/Release/bin/.

Fix 3 (wrong BinDir for GUI installer):
  Pass -BinDir "source\__Builds\<arch>\Release\bin" explicitly to
  both GUI installer invocations so build-installer.ps1 reads from
  the source/ subtree output, not the repo-root __Builds/.

Fix 2 (no publish-release for source builds):
  Add publish-release-source-linux and publish-release-source-windows
  jobs that trigger on tags, verify the commit is on main, download
  QTAC-source-* artifacts, and upload them to the GitHub release.
  Mirrors the existing publish-release-linux/windows pattern.

Change-Id: I01c0886806f08443cb08ae43998614780672cf88
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants