From ed48feeae8e257d4ff0b9b3033d02b015f7011b2 Mon Sep 17 00:00:00 2001 From: Brad King Date: Fri, 27 Mar 2026 11:51:18 -0400 Subject: [PATCH] clang-cl: Add support for C++ modules Since commit 4a4986d28a (cxxmodules: support command templates for BMI compilation, 2026-03-25, v4.3.1~2^2~1) we can express module interface unit compilation to either object files or BMI-only in a way that works with `clang-scan-deps` and `clang-cl` together. Fixes: #25731 --- .gitlab/ci/configure_windows_clang_ninja.cmake | 4 +--- Help/manual/cmake-cxxmodules.7.rst | 6 ++++++ Help/release/dev/clang-cl-cxxmodules.rst | 5 +++++ Modules/Compiler/Clang-CXX.cmake | 17 ++++++++++++----- 4 files changed, 24 insertions(+), 8 deletions(-) create mode 100644 Help/release/dev/clang-cl-cxxmodules.rst diff --git a/.gitlab/ci/configure_windows_clang_ninja.cmake b/.gitlab/ci/configure_windows_clang_ninja.cmake index 214c754891..e8a017148e 100644 --- a/.gitlab/ci/configure_windows_clang_ninja.cmake +++ b/.gitlab/ci/configure_windows_clang_ninja.cmake @@ -1,4 +1,2 @@ -if("$ENV{CMAKE_CI_BUILD_NAME}" MATCHES "(^|_)gnu(_|$)") - set(CMake_TEST_MODULE_COMPILATION "named,compile_commands,collation,partitions,internal_partitions,export_bmi,install_bmi,shared,bmionly,build_database" CACHE STRING "") -endif() +set(CMake_TEST_MODULE_COMPILATION "named,compile_commands,collation,partitions,internal_partitions,export_bmi,install_bmi,shared,bmionly,build_database" CACHE STRING "") include("${CMAKE_CURRENT_LIST_DIR}/configure_windows_clang_common.cmake") diff --git a/Help/manual/cmake-cxxmodules.7.rst b/Help/manual/cmake-cxxmodules.7.rst index 9dc14d2353..396438645f 100644 --- a/Help/manual/cmake-cxxmodules.7.rst +++ b/Help/manual/cmake-cxxmodules.7.rst @@ -69,7 +69,13 @@ The list of compilers for which CMake supports scanning sources for C++ modules includes: * MSVC toolset 14.34 and newer (provided with Visual Studio 17.4 and newer) + * LLVM/Clang 16.0 and newer + + .. versionadded:: 4.4 + + ``clang-cl`` version 19.1 and newer + * GCC 14 and newer ``import std`` Support diff --git a/Help/release/dev/clang-cl-cxxmodules.rst b/Help/release/dev/clang-cl-cxxmodules.rst new file mode 100644 index 0000000000..7a3a23fc09 --- /dev/null +++ b/Help/release/dev/clang-cl-cxxmodules.rst @@ -0,0 +1,5 @@ +clang-cl-cxxmodules +------------------- + +* C++ 20 named modules are now supported with ``clang-cl``. + See :manual:`cmake-cxxmodules(7)`. diff --git a/Modules/Compiler/Clang-CXX.cmake b/Modules/Compiler/Clang-CXX.cmake index 45e06a4e21..7b3bd4557f 100644 --- a/Modules/Compiler/Clang-CXX.cmake +++ b/Modules/Compiler/Clang-CXX.cmake @@ -20,7 +20,8 @@ if("x${CMAKE_CXX_COMPILER_FRONTEND_VARIANT}" STREQUAL "xMSVC") set(CMAKE_CXX_INCLUDE_WHAT_YOU_USE_DRIVER_MODE "cl") endif() -if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 16.0 AND CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "GNU") +if((CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 16.0 AND CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "GNU") OR + (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19.1 AND CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC")) if (CMAKE_CXX_COMPILER_CLANG_RESOURCE_DIR) set(_clang_scan_deps_resource_dir " -resource-dir \"${CMAKE_CXX_COMPILER_CLANG_RESOURCE_DIR}\"") @@ -34,15 +35,20 @@ if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 16.0 AND CMAKE_CXX_COMPILER_ else () set(_clang_scan_deps_mv "mv") endif () + if(CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC") + set(_clang "-clang:") + else() + set(_clang "") + endif() string(CONCAT CMAKE_CXX_SCANDEP_SOURCE "\"${CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS}\"" " -format=p1689" " --" " " - " -x c++ -c -o " + " -x c++ -c ${_clang}-o ${_clang}" "${_clang_scan_deps_resource_dir}" - " -MT " - " -MD -MF " + " ${_clang}-MT ${_clang}" + " ${_clang}-MD ${_clang}-MF ${_clang}" # Write to a temporary file. If the scan fails, we do not want to update # the actual output file as `ninja` (at least) assumes that failed # commands either delete or leave output files alone. See Issue#25419. @@ -56,5 +62,6 @@ if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 16.0 AND CMAKE_CXX_COMPILER_ set(CMAKE_CXX_MODULE_MAP_FORMAT "clang") set(CMAKE_CXX_MODULE_MAP_FLAG "@") set(CMAKE_CXX_COMPILE_BMI - " -o --precompile ") + " ${_clang}-o ${_clang} --precompile ") + unset(_clang) endif()