mirror of
https://github.com/Kitware/CMake.git
synced 2026-11-06 05:16:58 +00:00
c++modules: Improve clang stdlib detection on Windows
Allow the stdlib probe to guide modules.json discovery when using a clang driver on Windows. Explicitly provided module metadata still takes precedence, and this check fails if clang itself can't discover the stdlib. Fixes: #28035
This commit is contained in:
1 parent
b6bb95a8bf
commit
23df9ff972
3 files changed
+28
No files matched your search
@@ -97,6 +97,7 @@ 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@")
|
||||
set(CMAKE_CXX_STANDARD_LIBRARY_INCLUDE_DIRECTORY "@CMAKE_CXX_STANDARD_LIBRARY_INCLUDE_DIRECTORY@")
|
||||
|
||||
set(CMAKE_CXX_COMPILER_IMPORT_STD_ERROR_MESSAGE "@CMAKE_CXX_COMPILER_IMPORT_STD_ERROR_MESSAGE@")
|
||||
set(CMAKE_CXX_STDLIB_MODULES_JSON "@CMAKE_CXX_STDLIB_MODULES_JSON@")
|
||||
@@ -393,6 +393,7 @@ function(CMAKE_DETERMINE_COMPILER_ID lang flagvar src)
|
||||
endif ()
|
||||
|
||||
set(CMAKE_${lang}_STANDARD_LIBRARY "")
|
||||
set(CMAKE_${lang}_STANDARD_LIBRARY_INCLUDE_DIRECTORY "")
|
||||
if ("x${lang}" STREQUAL "xCXX" AND
|
||||
EXISTS "${CMAKE_CURRENT_FUNCTION_LIST_DIR}/${lang}-DetectStdlib.h" AND
|
||||
("x${CMAKE_${lang}_COMPILER_ID}" STREQUAL "xClang") OR
|
||||
@@ -414,11 +415,23 @@ function(CMAKE_DETERMINE_COMPILER_ID lang flagvar src)
|
||||
endforeach()
|
||||
endif ()
|
||||
|
||||
# Locate the standard library headers selected by Clang, including toolsets
|
||||
# discovered by the driver without a developer command prompt environment.
|
||||
set(_stdlib_trace_flags)
|
||||
if (CMAKE_${lang}_COMPILER_ID STREQUAL "Clang")
|
||||
if (CMAKE_${lang}_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC")
|
||||
list(APPEND _stdlib_trace_flags -clang:-H)
|
||||
else ()
|
||||
list(APPEND _stdlib_trace_flags -H)
|
||||
endif ()
|
||||
endif ()
|
||||
|
||||
execute_process(
|
||||
COMMAND "${CMAKE_${lang}_COMPILER}"
|
||||
${CMAKE_${lang}_COMPILER_ID_ARG1}
|
||||
${_inc_dirs}
|
||||
${CMAKE_CXX_COMPILER_ID_FLAGS_LIST}
|
||||
${_stdlib_trace_flags}
|
||||
-E
|
||||
-x c++-header
|
||||
"${CMAKE_CURRENT_FUNCTION_LIST_DIR}/${lang}-DetectStdlib.h"
|
||||
@@ -429,6 +442,13 @@ function(CMAKE_DETERMINE_COMPILER_ID lang flagvar src)
|
||||
ERROR_STRIP_TRAILING_WHITESPACE)
|
||||
if (_lang_stdlib_res EQUAL 0)
|
||||
string(REGEX REPLACE ".*CMAKE-STDLIB-DETECT: (.+)\n.*" "\\1" "CMAKE_${lang}_STANDARD_LIBRARY" "${_lang_stdlib_out}")
|
||||
if (_stdlib_trace_flags AND
|
||||
_lang_stdlib_err MATCHES "(^|\n)\\. ([^\r\n]*[/\\\\]version)(\r?\n|$)")
|
||||
# Clang may escape backslashes in the include trace on Windows.
|
||||
string(REPLACE "\\\\" "/" _stdlib_version_header "${CMAKE_MATCH_2}")
|
||||
string(REPLACE "\\" "/" _stdlib_version_header "${_stdlib_version_header}")
|
||||
cmake_path(GET _stdlib_version_header PARENT_PATH CMAKE_${lang}_STANDARD_LIBRARY_INCLUDE_DIRECTORY)
|
||||
endif ()
|
||||
endif ()
|
||||
endif ()
|
||||
|
||||
@@ -506,6 +526,7 @@ function(CMAKE_DETERMINE_COMPILER_ID lang flagvar src)
|
||||
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)
|
||||
set(CMAKE_${lang}_STANDARD_LIBRARY "${CMAKE_${lang}_STANDARD_LIBRARY}" PARENT_SCOPE)
|
||||
set(CMAKE_${lang}_STANDARD_LIBRARY_INCLUDE_DIRECTORY "${CMAKE_${lang}_STANDARD_LIBRARY_INCLUDE_DIRECTORY}" PARENT_SCOPE)
|
||||
set(CMAKE_${lang}_COMPILER_APPLE_SYSROOT "${CMAKE_${lang}_COMPILER_APPLE_SYSROOT}" PARENT_SCOPE)
|
||||
endfunction()
|
||||
|
||||
|
||||
@@ -1,6 +1,12 @@
|
||||
function (_cmake_cxx_find_modules_json)
|
||||
if (CMAKE_CXX_STDLIB_MODULES_JSON)
|
||||
set(_msvc_modules_json_file "${CMAKE_CXX_STDLIB_MODULES_JSON}")
|
||||
elseif (CMAKE_CXX_STANDARD_LIBRARY_INCLUDE_DIRECTORY AND
|
||||
EXISTS "${CMAKE_CXX_STANDARD_LIBRARY_INCLUDE_DIRECTORY}/../modules/modules.json")
|
||||
# Prefer the toolset whose headers the compiler actually selected over
|
||||
# environment variables that may refer to a different installation.
|
||||
set(_msvc_modules_json_file "${CMAKE_CXX_STANDARD_LIBRARY_INCLUDE_DIRECTORY}/../modules/modules.json")
|
||||
cmake_path(NORMAL_PATH _msvc_modules_json_file)
|
||||
else ()
|
||||
find_file(_msvc_modules_json_file
|
||||
NAME modules.json
|
||||
|
||||
Reference in new issue
Block a user