diff --git a/win/build-deps.cmd b/win/build-deps.cmd index 66378c06da..fa34b3803d 100644 --- a/win/build-deps.cmd +++ b/win/build-deps.cmd @@ -749,70 +749,120 @@ IF /I "%VS_TOOLSET%"=="v142" set QT6_MSVC_YEAR=2019 IF /I "%VS_TOOLSET%"=="v143" set QT6_MSVC_YEAR=2022 IF /I "%VS_TOOLSET%"=="v145" set QT6_MSVC_YEAR=2026 -set QT6_ARCH= -set QT6_INSTALL_SUFFIX= -IF /I "%TARGET_ARCH%"=="x64" ( - set QT6_ARCH=win64_msvc%QT6_MSVC_YEAR%_64 - set QT6_INSTALL_SUFFIX=msvc%QT6_MSVC_YEAR%_64 -) -IF /I "%TARGET_ARCH%"=="arm64" ( - set QT6_ARCH=win64_msvc%QT6_MSVC_YEAR%_arm64_cross_compiled - set QT6_INSTALL_SUFFIX=msvc%QT6_MSVC_YEAR%_arm64 -) +set QT6_ARCH= +set QT6_INSTALL_SUFFIX= +set QT6_HOST_ARCH= +set QT6_HOST_INSTALL_SUFFIX= +IF /I "%TARGET_ARCH%"=="x64" ( + set QT6_ARCH=win64_msvc%QT6_MSVC_YEAR%_64 + set QT6_INSTALL_SUFFIX=msvc%QT6_MSVC_YEAR%_64 +) +IF /I "%TARGET_ARCH%"=="arm64" ( + set QT6_ARCH=win64_msvc%QT6_MSVC_YEAR%_arm64_cross_compiled + set QT6_INSTALL_SUFFIX=msvc%QT6_MSVC_YEAR%_arm64 + REM Qt publishes Windows ARM64 packages as cross-compiled Qt. Even on the + REM windows-11-arm runner, Qt CMake requires host tools such as moc/rcc. + REM Use the x64 host tools; Windows 11 on Arm runs them through x64 + REM emulation while cl.exe still builds ARM64 binaries against target Qt. + set QT6_HOST_ARCH=win64_msvc%QT6_MSVC_YEAR%_64 + set QT6_HOST_INSTALL_SUFFIX=msvc%QT6_MSVC_YEAR%_64 +) IF "%QT6_ARCH%"=="" ( call cecho.cmd 0 12 "Automatic Qt6 installation is only supported for x64 and arm64 builds." GOTO :Error ) -set DEPENDENCY_INSTALL_NAME=qt6-%QT6_VERSION%-%QT6_INSTALL_SUFFIX% -set QT6_AQT_OUTPUT_DIR=%INSTALL_DIR%\%DEPENDENCY_INSTALL_NAME% -set QT6_INSTALL_DIR=%QT6_AQT_OUTPUT_DIR%\%QT6_VERSION%\%QT6_INSTALL_SUFFIX% -set QT_DIR=%QT6_INSTALL_DIR% -set QT6_CONFIG_DLL=Qt6Core.dll -IF /I "%BUILD_CFG%"=="Debug" ( - set QT6_CONFIG_DLL=Qt6Cored.dll -) +set DEPENDENCY_INSTALL_NAME=qt6-%QT6_VERSION%-%QT6_INSTALL_SUFFIX% +set QT6_AQT_OUTPUT_DIR=%INSTALL_DIR%\%DEPENDENCY_INSTALL_NAME% +set QT6_INSTALL_DIR=%QT6_AQT_OUTPUT_DIR%\%QT6_VERSION%\%QT6_INSTALL_SUFFIX% +set QT_DIR=%QT6_INSTALL_DIR% +set QT6_HOST_AQT_OUTPUT_DIR= +set QT6_HOST_INSTALL_DIR= +set QT_HOST_PATH= +IF NOT "%QT6_HOST_INSTALL_SUFFIX%"=="" ( + set QT6_HOST_AQT_OUTPUT_DIR=%INSTALL_DIR%\qt6-%QT6_VERSION%-%QT6_HOST_INSTALL_SUFFIX% + set QT6_HOST_INSTALL_DIR=%INSTALL_DIR%\qt6-%QT6_VERSION%-%QT6_HOST_INSTALL_SUFFIX%\%QT6_VERSION%\%QT6_HOST_INSTALL_SUFFIX% + set QT_HOST_PATH=%INSTALL_DIR%\qt6-%QT6_VERSION%-%QT6_HOST_INSTALL_SUFFIX%\%QT6_VERSION%\%QT6_HOST_INSTALL_SUFFIX% +) +set QT6_CONFIG_DLL=Qt6Core.dll +IF /I "%BUILD_CFG%"=="Debug" ( + set QT6_CONFIG_DLL=Qt6Cored.dll +) set NEXT_DEPENDENCY_LABEL=Successful IF NOT "%IFCOS_INSTALL_QT6%"=="TRUE" ( call cecho.cmd 0 13 "IFCOS_INSTALL_QT6 not 'TRUE', skipping installation of Qt6." goto :Successful ) - -echo QT6_INSTALL_DIR=%QT6_INSTALL_DIR%>>"%~dp0\%BUILD_DEPS_CACHE_PATH%" -echo QT_DIR=%QT_DIR%>>"%~dp0\%BUILD_DEPS_CACHE_PATH%" - -call :CheckInstallation -if %ERRORLEVEL%==200 GOTO %NEXT_DEPENDENCY_LABEL% - -IF EXIST "%QT6_INSTALL_DIR%\bin\%QT6_CONFIG_DLL%" ( - echo Found existing "%QT6_INSTALL_DIR%" for %BUILD_CFG%, skipping - call :MarkInstallation - goto :Successful -) + +echo QT6_INSTALL_DIR=%QT6_INSTALL_DIR%>>"%~dp0\%BUILD_DEPS_CACHE_PATH%" +echo QT_DIR=%QT_DIR%>>"%~dp0\%BUILD_DEPS_CACHE_PATH%" +IF DEFINED QT6_HOST_INSTALL_DIR ( + echo QT6_HOST_INSTALL_DIR=%QT6_HOST_INSTALL_DIR%>>"%~dp0\%BUILD_DEPS_CACHE_PATH%" + echo QT_HOST_PATH=%QT_HOST_PATH%>>"%~dp0\%BUILD_DEPS_CACHE_PATH%" +) + +set QT6_TARGET_INSTALLED=FALSE +IF EXIST "%QT6_INSTALL_DIR%\lib\cmake\Qt6\Qt6Config.cmake" IF EXIST "%QT6_INSTALL_DIR%\bin\%QT6_CONFIG_DLL%" set QT6_TARGET_INSTALLED=TRUE +set QT6_HOST_INSTALLED=TRUE +IF DEFINED QT6_HOST_INSTALL_DIR ( + set QT6_HOST_INSTALLED=FALSE + IF EXIST "%QT6_HOST_INSTALL_DIR%\lib\cmake\Qt6\Qt6Config.cmake" IF EXIST "%QT6_HOST_INSTALL_DIR%\bin\moc.exe" IF EXIST "%QT6_HOST_INSTALL_DIR%\bin\rcc.exe" set QT6_HOST_INSTALLED=TRUE +) + +IF "%QT6_TARGET_INSTALLED%"=="TRUE" IF "%QT6_HOST_INSTALLED%"=="TRUE" ( + echo Found existing "%QT6_INSTALL_DIR%" for %BUILD_CFG%, skipping + IF DEFINED QT6_HOST_INSTALL_DIR echo Found existing Qt host tools at "%QT6_HOST_INSTALL_DIR%", skipping + call :MarkInstallation + goto :Successful +) set AQT_PYTHON=python IF "%IFCOS_INSTALL_PYTHON%"=="TRUE" IF EXIST "%PYTHONHOME%\python.exe" set AQT_PYTHON="%PYTHONHOME%\python.exe" -%AQT_PYTHON% -m pip install --upgrade aqtinstall -IF NOT %ERRORLEVEL%==0 GOTO :Error - -%AQT_PYTHON% -m aqt install-qt windows desktop %QT6_VERSION% %QT6_ARCH% -O "%QT6_AQT_OUTPUT_DIR%" --archives qtbase -IF NOT %ERRORLEVEL%==0 GOTO :Error - -IF NOT EXIST "%QT6_INSTALL_DIR%\lib\cmake\Qt6\Qt6Config.cmake" ( - call cecho.cmd 0 12 "Qt6 installation did not produce Qt6Config.cmake at %QT6_INSTALL_DIR%." +%AQT_PYTHON% -m pip install --upgrade aqtinstall +IF NOT %ERRORLEVEL%==0 GOTO :Error + +IF NOT "%QT6_TARGET_INSTALLED%"=="TRUE" ( + %AQT_PYTHON% -m aqt install-qt windows desktop %QT6_VERSION% %QT6_ARCH% -O "%QT6_AQT_OUTPUT_DIR%" --archives qtbase + IF ERRORLEVEL 1 GOTO :Error +) + +IF DEFINED QT6_HOST_INSTALL_DIR ( + IF NOT "%QT6_HOST_INSTALLED%"=="TRUE" ( + %AQT_PYTHON% -m aqt install-qt windows desktop %QT6_VERSION% %QT6_HOST_ARCH% -O "%QT6_HOST_AQT_OUTPUT_DIR%" --archives qtbase + IF ERRORLEVEL 1 GOTO :Error + ) +) + +IF NOT EXIST "%QT6_INSTALL_DIR%\lib\cmake\Qt6\Qt6Config.cmake" ( + call cecho.cmd 0 12 "Qt6 installation did not produce Qt6Config.cmake at %QT6_INSTALL_DIR%." GOTO :Error ) IF NOT EXIST "%QT6_INSTALL_DIR%\bin\%QT6_CONFIG_DLL%" ( call cecho.cmd 0 12 "Qt6 installation did not produce %BUILD_CFG% runtime %QT6_CONFIG_DLL% at %QT6_INSTALL_DIR%\bin." - GOTO :Error -) - -call :MarkInstallation -goto :Successful + GOTO :Error +) + +IF DEFINED QT6_HOST_INSTALL_DIR ( + IF NOT EXIST "%QT6_HOST_INSTALL_DIR%\lib\cmake\Qt6\Qt6Config.cmake" ( + call cecho.cmd 0 12 "Qt6 host installation did not produce Qt6Config.cmake at %QT6_HOST_INSTALL_DIR%." + GOTO :Error + ) + IF NOT EXIST "%QT6_HOST_INSTALL_DIR%\bin\moc.exe" ( + call cecho.cmd 0 12 "Qt6 host installation did not produce moc.exe at %QT6_HOST_INSTALL_DIR%\bin." + GOTO :Error + ) + IF NOT EXIST "%QT6_HOST_INSTALL_DIR%\bin\rcc.exe" ( + call cecho.cmd 0 12 "Qt6 host installation did not produce rcc.exe at %QT6_HOST_INSTALL_DIR%\bin." + GOTO :Error + ) +) + +call :MarkInstallation +goto :Successful :manifold set DEPENDENCY_NAME=manifold diff --git a/win/run-cmake.bat b/win/run-cmake.bat index 98d291f8ce..6099b5da39 100755 --- a/win/run-cmake.bat +++ b/win/run-cmake.bat @@ -127,6 +127,7 @@ set USD_INSTALL_DIR=%INSTALL_DIR%\usd set ROCKSDB_INSTALL_DIR=%INSTALL_DIR%\rocksdb set ZSTD_INSTALL_DIR=%INSTALL_DIR%\zstd if not defined QT_DIR if defined QT6_INSTALL_DIR set QT_DIR=%QT6_INSTALL_DIR% +if not defined QT_HOST_PATH if defined QT6_HOST_INSTALL_DIR set QT_HOST_PATH=%QT6_HOST_INSTALL_DIR% echo. call cecho.cmd 0 10 "Script configuration:" @@ -161,6 +162,7 @@ echo USD_INSTALL_DIR = %USD_INSTALL_DIR% echo ROCKSDB_INSTALL_DIR = %ROCKSDB_INSTALL_DIR% echo ZSTD_INSTALL_DIR = %ZSTD_INSTALL_DIR% echo QT_DIR = %QT_DIR% +echo QT_HOST_PATH = %QT_HOST_PATH% echo CCACHE_INSTALL_DIR = %CCACHE_INSTALL_DIR% echo. echo CMAKE_INSTALL_PREFIX = %CMAKE_INSTALL_PREFIX% @@ -181,6 +183,8 @@ if defined QT_DIR set CMAKE_PREFIX_PATH=%CMAKE_PREFIX_PATH%;%QT_DIR% set QT_DIR_OPTION= if defined QT_DIR set QT_DIR_OPTION=-DQT_DIR="%QT_DIR%" +set QT_HOST_PATH_OPTION= +if defined QT_HOST_PATH set QT_HOST_PATH_OPTION=-DQT_HOST_PATH="%QT_HOST_PATH%" :: Not fully supported - not available from install-ifcopenshell :: and some logs are still showing Visual Studio generators. @@ -202,6 +206,7 @@ cmake.exe %CMAKELISTS_DIR% -G %GENERATOR% %ARCH_OPTION% %VS_TOOLSET_OPTION% ^ -DWITH_ROCKSDB=On -DWITH_ZSTD=On ^ -DCMAKE_PREFIX_PATH="%CMAKE_PREFIX_PATH%" ^ %QT_DIR_OPTION% ^ + %QT_HOST_PATH_OPTION% ^ -DADD_COMMIT_SHA=%ADD_COMMIT_SHA% -DVERSION_OVERRIDE=%VERSION_OVERRIDE% ^ %ARGUMENTS%