diff --git a/CMakeLists.txt b/CMakeLists.txt index 827ea7c24543c..8731f56579772 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -102,6 +102,9 @@ if(WIN32) if(MSVC) set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") add_compile_options(/utf-8 /Zc:__cplusplus) + # Improve parallelism in MSBuild. + # See: https://devblogs.microsoft.com/cppblog/improved-parallelism-in-msbuild/. + list(APPEND CMAKE_VS_GLOBALS "UseMultiToolTask=true") endif() if(MINGW) diff --git a/cmake/optional.cmake b/cmake/optional.cmake index 812f93c4bbc67..3bc3fd6ccc941 100644 --- a/cmake/optional.cmake +++ b/cmake/optional.cmake @@ -5,31 +5,40 @@ # Optional features and packages. if(CCACHE) - find_program(CCACHE_EXECUTABLE ccache) - if(CCACHE_EXECUTABLE) - set(CCACHE ON) + find_program(CCACHE_COMMAND ccache) + if(CCACHE_COMMAND) if(MSVC) - # See https://github.com/ccache/ccache/wiki/MS-Visual-Studio - set(MSVC_CCACHE_WRAPPER_CONTENT "\"${CCACHE_EXECUTABLE}\" \"${CMAKE_CXX_COMPILER}\"") - set(MSVC_CCACHE_WRAPPER_FILENAME wrapped-cl.bat) - file(WRITE ${CMAKE_BINARY_DIR}/${MSVC_CCACHE_WRAPPER_FILENAME} "${MSVC_CCACHE_WRAPPER_CONTENT} %*") - set(CMAKE_VS_GLOBALS - "CLToolExe=${MSVC_CCACHE_WRAPPER_FILENAME}" - "CLToolPath=${CMAKE_BINARY_DIR}" - "TrackFileAccess=false" - "UseMultiToolTask=true" - "DebugInformationFormat=OldStyle" - ) + if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.24) + # ccache >= 4.8 requires compile batching turned off that is available since CMake 3.24. + # See https://github.com/ccache/ccache/wiki/MS-Visual-Studio + set(CCACHE ON) + set(MSVC_CCACHE_WRAPPER_CONTENT "\"${CCACHE_COMMAND}\" \"${CMAKE_CXX_COMPILER}\"") + set(MSVC_CCACHE_WRAPPER_FILENAME wrapped-cl.bat) + file(WRITE ${CMAKE_BINARY_DIR}/${MSVC_CCACHE_WRAPPER_FILENAME} "${MSVC_CCACHE_WRAPPER_CONTENT} %*") + list(APPEND CMAKE_VS_GLOBALS + "CLToolExe=${MSVC_CCACHE_WRAPPER_FILENAME}" + "CLToolPath=${CMAKE_BINARY_DIR}" + "DebugInformationFormat=OldStyle" + ) + set(CMAKE_VS_NO_COMPILE_BATCHING ON) + elseif(CCACHE STREQUAL "AUTO") + message(WARNING "ccache requested and found, but CMake >= 3.24 is required to use it properly. Disabling.\n" + "To skip ccache check, use \"-DCCACHE=OFF\".\n") + set(CCACHE OFF) + else() + message(FATAL_ERROR "ccache requested and found, but CMake >= 3.24 is required to use it properly.") + endif() else() - list(APPEND CMAKE_C_COMPILER_LAUNCHER ${CCACHE_EXECUTABLE}) - list(APPEND CMAKE_CXX_COMPILER_LAUNCHER ${CCACHE_EXECUTABLE}) + set(CCACHE ON) + list(APPEND CMAKE_C_COMPILER_LAUNCHER ${CCACHE_COMMAND}) + list(APPEND CMAKE_CXX_COMPILER_LAUNCHER ${CCACHE_COMMAND}) endif() elseif(CCACHE STREQUAL "AUTO") set(CCACHE OFF) else() message(FATAL_ERROR "ccache requested, but not found.") endif() - mark_as_advanced(CCACHE_EXECUTABLE) + mark_as_advanced(CCACHE_COMMAND) endif() if(WITH_NATPMP)