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:
Vito Gamberini authored and Brad King committed 2026-10-05 09:59:21 -04:00
1 parent b6bb95a8bf
commit 23df9ff972
3 files changed
+28

No files matched your search

+1
View File
@@ -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@")
+21
View File
@@ -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