Repository navigation
feat: Qt-free source/ library with full hardware stack and test coverage - #90
Open
Bryant Forsgren (bryantf-qc) wants to merge 20 commits into
Open
Bryant Forsgren (bryantf-qc) wants to merge 20 commits into
Bryant Forsgren (bryantf-qc) wants to merge 20 commits into
Conversation
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>
Bryant Forsgren (bryantf-qc)
requested review from
Biswajit Roy (Biswajee) and
Adnan Syed (asyed-qcom)
and removed request for
Biswajit Roy (Biswajee)
September 17, 2026 03:13
There was a problem hiding this comment.
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>
| namespace Ui { class TACWindowClass; } // nosemgrep: cxx.funcret.gen.non-void-function-no-return | ||
| QT_END_NAMESPACE | ||
|
|
||
| namespace qtac { class TACDriveThread; } |
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>
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 |
| #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>
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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:
Platform configurations:
New types ported from upstream:
Build system:
Documentation:
Tests (10 test binaries, all passing):
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.
Checklist
Additional Context
Add any other context or screenshots about the pull request here.