diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 0b240ce0c8..be09210b28 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -178,26 +178,31 @@ if((BUILD_CONVERT OR BUILD_GEOMSERVER OR BUILD_IFCPYTHON) AND(NOT BUILD_IFCGEOM) set(BUILD_IFCGEOM ON) endif() -find_program(CCACHE_FOUND ccache) -if(CCACHE_FOUND) - message(STATUS "`ccache` is found, using it as a compiler launcher.") - set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CCACHE_FOUND}") - if(MSVC) - # By default Visual Studio generators will use /Zi which is not compatible - # with ccache, so tell Visual Studio to use /Z7 instead. - set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT "$<$:Embedded>") - # Not needed for Ninja. - if(CMAKE_GENERATOR MATCHES "Visual Studio") - file(COPY_FILE - ${CCACHE_FOUND} ${CMAKE_BINARY_DIR}/cl.exe - ONLY_IF_DIFFERENT) - set(CMAKE_VS_GLOBALS - "CLToolExe=cl.exe" - "CLToolPath=${CMAKE_BINARY_DIR}" - "UseMultiToolTask=true" - ) +option(USE_CCACHE "Use ccache as a compiler launcher if it is found" ON) +if(USE_CCACHE) + find_program(CCACHE_FOUND ccache) + if(CCACHE_FOUND) + message(STATUS "`ccache` is found, using it as a compiler launcher.") + set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CCACHE_FOUND}") + if(MSVC) + # By default Visual Studio generators will use /Zi which is not compatible + # with ccache, so tell Visual Studio to use /Z7 instead. + set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT "$<$:Embedded>") + # Not needed for Ninja. + if(CMAKE_GENERATOR MATCHES "Visual Studio") + file(COPY_FILE + ${CCACHE_FOUND} ${CMAKE_BINARY_DIR}/cl.exe + ONLY_IF_DIFFERENT) + set(CMAKE_VS_GLOBALS + "CLToolExe=cl.exe" + "CLToolPath=${CMAKE_BINARY_DIR}" + "UseMultiToolTask=true" + ) + endif() endif() endif() +else() + message(STATUS "ccache usage disabled via USE_CCACHE=OFF") endif() if(MSVC AND MSVC_PARALLEL_BUILD) diff --git a/win/build-deps.cmd b/win/build-deps.cmd index 9cf9b63da2..aa430f1707 100644 --- a/win/build-deps.cmd +++ b/win/build-deps.cmd @@ -464,6 +464,10 @@ cd "%DEPENDENCY_DIR%" :: so disable it from the build altogether as we have no use for it findstr #add_subdirectory(COLLADAValidator) CMakeLists.txt>NUL IF NOT %ERRORLEVEL%==0 git apply --reject --whitespace=fix "%~dp0patches\OpenCOLLADA_CMakeLists.txt.patch" --ignore-whitespace +:: std::tr1::unordered_map was a legacy MSVC compatibility shim kept around through VS2022's STL, but newer +:: toolsets (e.g. VS2026/v145) no longer provide it, breaking the build with error C2039: 'tr1' is not a member of 'std'. +findstr /C:"typedef std::unordered_map MarkIdToFilePos;" common\libBuffer\include\CommonFWriteBufferFlusher.h>NUL +IF NOT %ERRORLEVEL%==0 git apply --reject --whitespace=fix "%~dp0patches\OpenCOLLADA_CommonFWriteBufferFlusher_tr1.patch" --ignore-whitespace :: NOTE OpenCOLLADA has been observed to have problems with switching between debug and release builds so :: uncomment to following line in order to delete the CMakeCache.txt always if experiencing problems. REM IF EXIST "%DEPENDENCY_DIR%\%BUILD_DIR%\CMakeCache.txt". del "%DEPENDENCY_DIR%\%BUILD_DIR%\CMakeCache.txt" @@ -747,7 +751,12 @@ set QT6_MSVC_YEAR=%VS_VER% IF /I "%VS_TOOLSET%"=="v141" set QT6_MSVC_YEAR=2017 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 +:: Qt has not published prebuilt msvc2026 binaries yet (aqt only lists win64_msvc2022_64 as of +:: Qt 6.7-6.10). The v14x MSVC toolsets share a stable ABI/CRT, so fall back to the msvc2022 +:: binaries until Qt ships msvc2026 ones. Revisit once `aqt list-qt windows desktop --arch ` +:: shows a msvc2026 entry. +IF /I "%VS_TOOLSET%"=="v145" set QT6_MSVC_YEAR=2022 +IF "%VS_VER%"=="2026" set QT6_MSVC_YEAR=2022 set QT6_ARCH= set QT6_INSTALL_SUFFIX= diff --git a/win/patches/OpenCOLLADA_CommonFWriteBufferFlusher_tr1.patch b/win/patches/OpenCOLLADA_CommonFWriteBufferFlusher_tr1.patch new file mode 100644 index 0000000000..527441f819 --- /dev/null +++ b/win/patches/OpenCOLLADA_CommonFWriteBufferFlusher_tr1.patch @@ -0,0 +1,16 @@ +diff --git a/common/libBuffer/include/CommonFWriteBufferFlusher.h b/common/libBuffer/include/CommonFWriteBufferFlusher.h +index c7af45b2..62b0f991 100644 +--- a/common/libBuffer/include/CommonFWriteBufferFlusher.h ++++ b/common/libBuffer/include/CommonFWriteBufferFlusher.h +@@ -58,7 +58,11 @@ namespace Common + #else + typedef __int64 FilePosType; + #endif ++#if defined(__GNUC__) && !defined(_LIBCPP_VERSION) && !((defined(WIN64) || defined(_WIN64) || defined(__WIN64__)) || (defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__) || defined(__APPLE__))) + typedef std::tr1::unordered_map MarkIdToFilePos; ++#else ++ typedef std::unordered_map MarkIdToFilePos; ++#endif + + public: + static const size_t DEFAUL_BUFFER_SIZE = 64*1024; diff --git a/win/run-cmake.bat b/win/run-cmake.bat index 09244debb1..d21234115b 100755 --- a/win/run-cmake.bat +++ b/win/run-cmake.bat @@ -20,10 +20,14 @@ :: Example usage: :: run-cmake.bat vs2022-x64 :: run-cmake.bat vs2022-x64 -DGLTF_SUPPORT=ON +:: run-cmake.bat vs2022-x64 -DUSE_CCACHE=OFF :: :: Used environment variables: :: - `ADD_COMMIT_SHA` - if defined then `ADD_COMMIT_SHA` and `VERSION_OVERRIDE` cmake args will be set to `ON`. :: - `USE_NINJA` - if defined then the Ninja generator will be used instead of the Visual Studio. +:: +:: -DUSE_CCACHE=OFF (also accepts 0/FALSE/NO/N) disables ccache: the bundled ccache +:: install dir is kept out of CMAKE_PREFIX_PATH, and CMakeLists.txt skips detecting it. @if not defined ECHO_ON ( echo off ) @@ -81,6 +85,27 @@ if not (%1)==() ( call set ARGUMENTS=%%ARGUMENTS:%1=%% ) +:: Honor -DUSE_CCACHE=OFF (also accepts 0/FALSE/NO/N, case-insensitive) by keeping +:: the bundled ccache out of CMAKE_PREFIX_PATH so it can't be auto-detected below. +set USE_CCACHE_VALUE= +for %%A in (%*) do ( + set "ARG=%%~A" + if not "!ARG:-DUSE_CCACHE=!"=="!ARG!" ( + for /f "tokens=2 delims==" %%V in ("!ARG!") do set "USE_CCACHE_VALUE=%%V" + ) +) +if defined USE_CCACHE_VALUE ( + if /I "!USE_CCACHE_VALUE!"=="OFF" set DISABLE_CCACHE=1 + if /I "!USE_CCACHE_VALUE!"=="0" set DISABLE_CCACHE=1 + if /I "!USE_CCACHE_VALUE!"=="FALSE" set DISABLE_CCACHE=1 + if /I "!USE_CCACHE_VALUE!"=="NO" set DISABLE_CCACHE=1 + if /I "!USE_CCACHE_VALUE!"=="N" set DISABLE_CCACHE=1 +) +if defined DISABLE_CCACHE ( + echo USE_CCACHE=%USE_CCACHE_VALUE% passed, disabling ccache. + set "CCACHE_INSTALL_DIR=" +) + pushd .. set CMAKE_INSTALL_PREFIX=%CD%\_installed-%GEN_SHORTHAND% popd