From 3119a589fb0c3fcd5545a11eabec23dc915322b6 Mon Sep 17 00:00:00 2001 From: NickVs2015 Date: Wed, 3 Dec 2025 23:11:15 +0300 Subject: [PATCH] feat: update support arm 64 new logic --- .github/workflows/deploy.yml | 42 +++++++++++++++++++---- client/CMakeLists.txt | 14 ++++++++ client/cmake/3rdparty.cmake | 20 ++++++++++- deploy/build_windows.bat | 66 ++++++++++++++++++++++++++++++++++-- 4 files changed, 132 insertions(+), 10 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 0126bc1ef..631626715 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -145,9 +145,9 @@ jobs: shell: cmd run: | set BUILD_ARCH=${{ env.BUILD_ARCH }} - set QT_BIN_DIR="${{ runner.temp }}\\Qt\\${{ env.QT_VERSION }}\\msvc2019_64\\bin" - set QIF_BIN_DIR="${{ runner.temp }}\\Qt\\Tools\\QtInstallerFramework\\${{ env.QIF_VERSION }}\\bin" - call deploy\\build_windows.bat + set "QT_BIN_DIR=${{ runner.temp }}\Qt\${{ env.QT_VERSION }}\msvc2019_64\bin" + set "QIF_BIN_DIR=${{ runner.temp }}\Qt\Tools\QtInstallerFramework\${{ env.QIF_VERSION }}\bin" + call deploy\build_windows.bat - name: 'Rename Windows installer' shell: cmd @@ -297,7 +297,7 @@ jobs: dir: ${{ runner.temp }} setup-python: 'false' tools: 'tools_ifw' - set-env: 'true' + set-env: 'false' aqtversion: '==3.3.0' py7zrversion: '==0.22.*' extra: '--external 7z --base ${{ env.QT_MIRROR }}' @@ -310,23 +310,51 @@ jobs: echo "Qt ARM64 directory: %QT_ARM64_DIR%" if exist "%QT_ARM64_DIR%" ( echo "Qt ARM64 directory exists" - dir "%QT_ARM64_DIR%" echo. echo "Checking bin directory..." if exist "%QT_ARM64_DIR%\bin" ( echo "bin directory exists" - dir "%QT_ARM64_DIR%\bin\Qt6*.dll" + dir "%QT_ARM64_DIR%\bin\Qt6*.dll" | findstr /C:"Qt6Core.dll" ) else ( echo "ERROR: bin directory does not exist" + exit /b 1 ) + echo. + echo "Checking lib directory..." + if exist "%QT_ARM64_DIR%\lib" ( + echo "lib directory exists" + dir "%QT_ARM64_DIR%\lib\Qt6Core*.lib" + ) else ( + echo "ERROR: lib directory does not exist" + exit /b 1 + ) + echo "Qt ARM64 installation verified successfully" ) else ( echo "ERROR: Qt ARM64 directory does not exist" + exit /b 1 ) - name: 'Setup mvsc' uses: ilammy/msvc-dev-cmd@v1 with: - arch: 'arm64' + arch: 'x64_arm64' + + - name: 'Check environment variables before build' + shell: cmd + run: | + echo "=== Environment Variables Check ===" + echo "Checking for Qt-related environment variables..." + set | findstr /I "Qt" + set | findstr /I "CMAKE" + echo. + echo "Checking for MSVC tools in PATH..." + where cl 2>nul && echo "cl.exe found" || echo "WARNING: cl.exe not found" + where dumpbin 2>nul && echo "dumpbin.exe found" || echo "NOTE: dumpbin.exe not found" + where link 2>nul && echo "link.exe found" || echo "WARNING: link.exe not found" + echo. + echo "MSVC environment variables:" + set | findstr /I "VCINSTALLDIR VSINSTALLDIR" + echo "====================================" - name: 'Build project' shell: cmd diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index 1d0a936ca..3bd91aed2 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -39,6 +39,20 @@ endif() find_package(Qt6 REQUIRED COMPONENTS ${PACKAGES}) +# Diagnostic: Print Qt configuration +message(STATUS "=== Qt Configuration Diagnostics ===") +message(STATUS "Qt6_DIR: ${Qt6_DIR}") +message(STATUS "CMAKE_PREFIX_PATH: ${CMAKE_PREFIX_PATH}") +message(STATUS "CMAKE_GENERATOR_PLATFORM: ${CMAKE_GENERATOR_PLATFORM}") +message(STATUS "CMAKE_SYSTEM_PROCESSOR: ${CMAKE_SYSTEM_PROCESSOR}") +if(TARGET Qt6::Core) + get_target_property(Qt6Core_LOCATION Qt6::Core LOCATION) + message(STATUS "Qt6::Core location: ${Qt6Core_LOCATION}") + get_target_property(Qt6Core_IMPLIB Qt6::Core IMPORTED_IMPLIB_RELEASE) + message(STATUS "Qt6::Core import library: ${Qt6Core_IMPLIB}") +endif() +message(STATUS "====================================") + set(LIBS ${LIBS} Qt6::Core Qt6::Gui Qt6::Network Qt6::Xml Qt6::RemoteObjects diff --git a/client/cmake/3rdparty.cmake b/client/cmake/3rdparty.cmake index 6c3726148..148313728 100644 --- a/client/cmake/3rdparty.cmake +++ b/client/cmake/3rdparty.cmake @@ -15,17 +15,35 @@ set(OPENSSL_LIBRARIES_DIR "${OPENSSL_ROOT_DIR}/lib") if(WIN32) set(OPENSSL_INCLUDE_DIR "${OPENSSL_ROOT_DIR}/windows/include") - if("${CMAKE_SIZEOF_VOID_P}" STREQUAL "8") + # Check for ARM64 architecture first (CMAKE_GENERATOR_PLATFORM is set to ARM64 for cross-compilation) + message(STATUS "=== 3rd Party Libraries Configuration ===") + message(STATUS "CMAKE_GENERATOR_PLATFORM: ${CMAKE_GENERATOR_PLATFORM}") + message(STATUS "CMAKE_SYSTEM_PROCESSOR: ${CMAKE_SYSTEM_PROCESSOR}") + message(STATUS "CMAKE_SIZEOF_VOID_P: ${CMAKE_SIZEOF_VOID_P}") + if("${CMAKE_GENERATOR_PLATFORM}" STREQUAL "ARM64" OR "${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "ARM64") + # ARM64: use ARM64 versions for both OpenSSL and libssh + message(STATUS "Building for Windows ARM64") + set(LIBSSH_LIB_PATH "${LIBSSH_ROOT_DIR}/windows/arm64/ssh.lib") + set(LIBSSH_INCLUDE_DIR "${LIBSSH_ROOT_DIR}/windows/arm64") + set(OPENSSL_LIB_SSL_PATH "${OPENSSL_ROOT_DIR}/windows/winarm64/libssl.lib") + set(OPENSSL_LIB_CRYPTO_PATH "${OPENSSL_ROOT_DIR}/windows/winarm64/libcrypto.lib") + message(STATUS "libssh: ${LIBSSH_LIB_PATH}") + message(STATUS "OpenSSL SSL: ${OPENSSL_LIB_SSL_PATH}") + message(STATUS "OpenSSL Crypto: ${OPENSSL_LIB_CRYPTO_PATH}") + elseif("${CMAKE_SIZEOF_VOID_P}" STREQUAL "8") + message(STATUS "Building for Windows x64") set(LIBSSH_LIB_PATH "${LIBSSH_ROOT_DIR}/windows/x86_64/ssh.lib") set(LIBSSH_INCLUDE_DIR "${LIBSSH_ROOT_DIR}/windows/x86_64") set(OPENSSL_LIB_SSL_PATH "${OPENSSL_ROOT_DIR}/windows/win64/libssl.lib") set(OPENSSL_LIB_CRYPTO_PATH "${OPENSSL_ROOT_DIR}/windows/win64/libcrypto.lib") else() + message(STATUS "Building for Windows x86") set(LIBSSH_LIB_PATH "${LIBSSH_ROOT_DIR}/windows/x86/ssh.lib") set(LIBSSH_INCLUDE_DIR "${LIBSSH_ROOT_DIR}/windows/x86") set(OPENSSL_LIB_SSL_PATH "${OPENSSL_ROOT_DIR}/windows/win32/libssl.lib") set(OPENSSL_LIB_CRYPTO_PATH "${OPENSSL_ROOT_DIR}/windows/win32/libcrypto.lib") endif() + message(STATUS "==========================================") elseif(APPLE AND NOT IOS) if(MACOS_NE) set(LIBSSH_LIB_PATH "${LIBSSH_ROOT_DIR}/macos/universal2/libssh.a") diff --git a/deploy/build_windows.bat b/deploy/build_windows.bat index 388602570..adb9a335d 100644 --- a/deploy/build_windows.bat +++ b/deploy/build_windows.bat @@ -50,6 +50,19 @@ del %TARGET_FILENAME% mkdir %WORK_DIR% +echo "Checking MSVC environment..." +where cl >nul 2>&1 +if %errorlevel% equ 0 ( + echo "MSVC compiler found" + cl 2>&1 | findstr /C:"Version" +) else ( + echo "ERROR: MSVC compiler not found in PATH" + echo "Please ensure 'Setup mvsc' step in GitHub Actions workflow is configured correctly" + echo "Trying to find cl.exe..." + where cl 2>&1 + exit /b 1 +) + call "%QT_BIN_DIR:"=%\qt-cmake" --version if defined QT_HOST_BIN_DIR ( "%QT_HOST_BIN_DIR:"=%\windeployqt" -v @@ -58,12 +71,61 @@ if defined QT_HOST_BIN_DIR ( ) cmake --version +REM Calculate Qt root directory BEFORE entering if blocks (batch variable expansion issue) +REM Remove \bin from QT_BIN_DIR to get Qt root +set "QT_ROOT_DIR=%QT_BIN_DIR:\bin=%" + cd %PROJECT_DIR% if defined QT_HOST_PATH ( REM ARM64 cross-compilation - set generator platform to ARM64 - call cmake . -B %WORK_DIR% -A ARM64 "-DCMAKE_BUILD_TYPE:STRING=Release" "-DCMAKE_PREFIX_PATH:PATH=%QT_BIN_DIR%" "-DQT_HOST_PATH:PATH=%QT_HOST_PATH%" + REM CMAKE_PREFIX_PATH must point to Qt root (not bin), so CMake can find lib directory + + echo "=== CMake Configuration for ARM64 ===" + echo "QT_BIN_DIR: %QT_BIN_DIR%" + echo "QT_ROOT_DIR: %QT_ROOT_DIR%" + echo "QT_HOST_PATH: %QT_HOST_PATH%" + echo "CMAKE_PREFIX_PATH: %QT_ROOT_DIR%" + echo "Generator Platform: ARM64" + echo "====================================" + + REM Verify Qt ARM64 directories exist + if not exist "%QT_ROOT_DIR%" ( + echo "ERROR: Qt ARM64 root directory not found at %QT_ROOT_DIR%" + exit /b 1 + ) + echo "Qt ARM64 root directory exists: %QT_ROOT_DIR%" + + if not exist "%QT_ROOT_DIR%\lib" ( + echo "ERROR: Qt ARM64 lib directory not found at %QT_ROOT_DIR%\lib" + exit /b 1 + ) + echo "Qt ARM64 lib directory found: %QT_ROOT_DIR%\lib" + dir "%QT_ROOT_DIR%\lib\Qt6Core*.lib" + + REM Check architecture of Qt6Core.lib (if dumpbin is available) + echo "Verifying Qt6Core.lib architecture..." + where dumpbin >nul 2>&1 + if %errorlevel% equ 0 ( + echo "dumpbin found, checking architecture..." + dumpbin /headers "%QT_ROOT_DIR%\lib\Qt6Core.lib" | findstr /C:"machine" + if %errorlevel% equ 0 ( + echo "Architecture check completed" + ) else ( + echo "WARNING: Could not extract machine type from Qt6Core.lib" + ) + ) else ( + echo "NOTE: dumpbin not available, skipping architecture verification" + echo "This is not critical - build will continue" + ) + + call cmake . -B %WORK_DIR% -A ARM64 "-DCMAKE_BUILD_TYPE:STRING=Release" "-DCMAKE_PREFIX_PATH:PATH=%QT_ROOT_DIR%" "-DQT_HOST_PATH:PATH=%QT_HOST_PATH%" ) else ( - call cmake . -B %WORK_DIR% "-DCMAKE_BUILD_TYPE:STRING=Release" "-DCMAKE_PREFIX_PATH:PATH=%QT_BIN_DIR%" + REM x64 build - QT_ROOT_DIR already calculated above + echo "=== CMake Configuration for x64 ===" + echo "QT_ROOT_DIR: %QT_ROOT_DIR%" + echo "====================================" + + call cmake . -B %WORK_DIR% "-DCMAKE_BUILD_TYPE:STRING=Release" "-DCMAKE_PREFIX_PATH:PATH=%QT_ROOT_DIR%" ) cd %WORK_DIR%