diff options
-rw-r--r-- | Modules/CMakeCXXCompiler.cmake.in | 1 | ||||
-rw-r--r-- | Modules/CMakeDetermineCompilerId.cmake | 22 | ||||
-rw-r--r-- | Modules/Compiler/Clang-CXX.cmake | 8 |
3 files changed, 31 insertions, 0 deletions
diff --git a/Modules/CMakeCXXCompiler.cmake.in b/Modules/CMakeCXXCompiler.cmake.in index 4459898..55f1113 100644 --- a/Modules/CMakeCXXCompiler.cmake.in +++ b/Modules/CMakeCXXCompiler.cmake.in @@ -89,3 +89,4 @@ set(CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES "@CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTOR set(CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "@CMAKE_CXX_IMPLICIT_LINK_LIBRARIES@") set(CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "@CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES@") set(CMAKE_CXX_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "@CMAKE_CXX_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES@") +set(CMAKE_CXX_COMPILER_CLANG_RESOURCE_DIR "@CMAKE_CXX_COMPILER_CLANG_RESOURCE_DIR@") diff --git a/Modules/CMakeDetermineCompilerId.cmake b/Modules/CMakeDetermineCompilerId.cmake index 1cf1e79..e46109f 100644 --- a/Modules/CMakeDetermineCompilerId.cmake +++ b/Modules/CMakeDetermineCompilerId.cmake @@ -289,6 +289,27 @@ function(CMAKE_DETERMINE_COMPILER_ID lang flagvar src) set(CMAKE_${lang}_COMPILER_FRONTEND_VARIANT "") endif() + # `clang-scan-deps` needs to know the resource directory. This only matters + # for C++ and the GNU-frontend variant. + set(CMAKE_${lang}_COMPILER_CLANG_RESOURCE_DIR "") + if ("x${lang}" STREQUAL "xCXX" AND + "x${CMAKE_${lang}_COMPILER_ID}" STREQUAL "xClang" AND + "x${CMAKE_${lang}_COMPILER_FRONTEND_VARIANT}" STREQUAL "xGNU") + execute_process( + COMMAND "${CMAKE_${lang}_COMPILER}" -print-resource-dir + OUTPUT_VARIABLE _clang_resource_dir_out + ERROR_VARIABLE _clang_resource_dir_err + RESULT_VARIABLE _clang_resource_dir_res + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_STRIP_TRAILING_WHITESPACE) + if (_clang_resource_dir_res EQUAL 0) + file(TO_CMAKE_PATH "${_clang_resource_dir_out}" _clang_resource_dir_out) + if(IS_DIRECTORY "${_clang_resource_dir_out}") + set(CMAKE_${lang}_COMPILER_CLANG_RESOURCE_DIR "${_clang_resource_dir_out}") + endif() + endif () + endif () + # Display the final identification result. if(CMAKE_${lang}_COMPILER_ID) if(CMAKE_${lang}_COMPILER_VERSION) @@ -331,6 +352,7 @@ function(CMAKE_DETERMINE_COMPILER_ID lang flagvar src) set(CMAKE_${lang}_EXTENSIONS_COMPUTED_DEFAULT "${CMAKE_${lang}_EXTENSIONS_COMPUTED_DEFAULT}" PARENT_SCOPE) set(CMAKE_${lang}_COMPILER_PRODUCED_OUTPUT "${COMPILER_${lang}_PRODUCED_OUTPUT}" PARENT_SCOPE) set(CMAKE_${lang}_COMPILER_PRODUCED_FILES "${COMPILER_${lang}_PRODUCED_FILES}" PARENT_SCOPE) + set(CMAKE_${lang}_COMPILER_CLANG_RESOURCE_DIR "${CMAKE_${lang}_COMPILER_CLANG_RESOURCE_DIR}" PARENT_SCOPE) endfunction() include(CMakeCompilerIdDetection) diff --git a/Modules/Compiler/Clang-CXX.cmake b/Modules/Compiler/Clang-CXX.cmake index a1ce6a1..46fc48d 100644 --- a/Modules/Compiler/Clang-CXX.cmake +++ b/Modules/Compiler/Clang-CXX.cmake @@ -32,6 +32,12 @@ endif() if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 16.0) if("x${CMAKE_CXX_COMPILER_FRONTEND_VARIANT}" STREQUAL "xGNU") + if (CMAKE_CXX_COMPILER_CLANG_RESOURCE_DIR) + set(_clang_scan_deps_resource_dir + " -resource-dir \"${CMAKE_CXX_COMPILER_CLANG_RESOURCE_DIR}\"") + else() + set(_clang_scan_deps_resource_dir "") + endif () if (CMAKE_HOST_WIN32) # `rename` doesn't overwrite and doesn't retry in case of "target file is # busy". @@ -45,6 +51,7 @@ if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 16.0) " --" " <CMAKE_CXX_COMPILER> <DEFINES> <INCLUDES> <FLAGS>" " -x c++ <SOURCE> -c -o <OBJECT>" + "${_clang_scan_deps_resource_dir}" " -MT <DYNDEP_FILE>" " -MD -MF <DEP_FILE>" # Write to a temporary file. If the scan fails, we do not want to update @@ -55,6 +62,7 @@ if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 16.0) # analogous to `ninja`'s `restat = 1`. It would also leave behind the # `.tmp` file. " && ${_clang_scan_deps_mv} <DYNDEP_FILE>.tmp <DYNDEP_FILE>") + unset(_clang_scan_deps_resource_dir) unset(_clang_scan_deps_mv) set(CMAKE_CXX_MODULE_MAP_FORMAT "clang") set(CMAKE_CXX_MODULE_MAP_FLAG "@<MODULE_MAP_FILE>") |