diff options
author | Brad King <brad.king@kitware.com> | 2023-03-03 17:26:36 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2023-03-03 17:44:53 (GMT) |
commit | 3fe8e33f278312c7840672ebae4b1e99c69e59bf (patch) | |
tree | 2c3801ee7aab044bdcbce8720d7ed713844e176b | |
parent | a8b1fb7976741e6fbdb7d1e5bb241cf738e8433b (diff) | |
download | CMake-3fe8e33f278312c7840672ebae4b1e99c69e59bf.zip CMake-3fe8e33f278312c7840672ebae4b1e99c69e59bf.tar.gz CMake-3fe8e33f278312c7840672ebae4b1e99c69e59bf.tar.bz2 |
Clang: Record Clang 16.0 flags for our experimental C++ modules support
LLVM/Clang 16.0 now contains official support for what CMake needs.
-rw-r--r-- | .gitlab/ci/cxx_modules_rules_clang.cmake | 11 | ||||
-rw-r--r-- | Help/dev/experimental.rst | 41 | ||||
-rw-r--r-- | Modules/Compiler/Clang-CXX.cmake | 14 |
3 files changed, 44 insertions, 22 deletions
diff --git a/.gitlab/ci/cxx_modules_rules_clang.cmake b/.gitlab/ci/cxx_modules_rules_clang.cmake index fcb2281..8088330 100644 --- a/.gitlab/ci/cxx_modules_rules_clang.cmake +++ b/.gitlab/ci/cxx_modules_rules_clang.cmake @@ -1,17 +1,6 @@ set(CMake_TEST_CXXModules_UUID "a246741c-d067-4019-a8fb-3d16b0c9d1d3") set(CMAKE_EXPERIMENTAL_CXX_MODULE_DYNDEP 1) -string(CONCAT CMAKE_EXPERIMENTAL_CXX_SCANDEP_SOURCE - "${CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS}" - " -format=p1689" - " --" - " <CMAKE_CXX_COMPILER> <DEFINES> <INCLUDES> <FLAGS>" - " -x c++ <SOURCE> -c -o <OBJECT>" - " -MT <DYNDEP_FILE>" - " -MD -MF <DEP_FILE>" - " > <DYNDEP_FILE>") -set(CMAKE_EXPERIMENTAL_CXX_MODULE_MAP_FORMAT "clang") -set(CMAKE_EXPERIMENTAL_CXX_MODULE_MAP_FLAG "@<MODULE_MAP_FILE>") # Default to C++ extensions being off. Clang's modules support have trouble # with extensions right now. diff --git a/Help/dev/experimental.rst b/Help/dev/experimental.rst index c97d542..c7581e8 100644 --- a/Help/dev/experimental.rst +++ b/Help/dev/experimental.rst @@ -57,17 +57,36 @@ dependency scanning. This is similar to the Fortran modules support, but relies on external tools to scan C++20 translation units for module dependencies. The approach is described by Kitware's `D1483r1`_ paper. -The ``CMAKE_EXPERIMENTAL_CXX_MODULE_DYNDEP`` variable can be set to ``1`` -in order to activate this undocumented experimental infrastructure. This -is **intended to make the functionality available to compiler writers** so -they can use it to develop and test their dependency scanning tool. -The ``CMAKE_EXPERIMENTAL_CXX_SCANDEP_SOURCE`` variable must also be set -to tell CMake how to invoke the C++20 module dependency scanning tool. - -MSVC 19.34 (provided with Visual Studio 17.4) and above contains the support -that CMake needs and has these variables already set up as required and only -the UUID and the ``CMAKE_EXPERIMENTAL_CXX_MODULE_DYNDEP`` variables need to be -set. +In order to activate CMake's experimental support for C++20 module +dependencies, set the following variables: + +``CMAKE_EXPERIMENTAL_CXX_MODULE_CMAKE_API`` + Set this to the UUID documented above. + +``CMAKE_EXPERIMENTAL_CXX_MODULE_DYNDEP`` + Set this to ``1`` in order to activate this undocumented experimental + infrastructure. This is **intended to make the functionality available + to compiler writers** so they can use it to develop and test their + dependency scanning tool. + +Some compilers already have support for module dependency scanning: + +* MSVC 19.34 and newer (provided with Visual Studio 17.4 and newer) +* LLVM/Clang 16.0 and newer + +For those, only the above variables need to be set by project code. +For compilers with in-development support, additional variables must +be set as follows. + +``CMAKE_EXPERIMENTAL_CXX_SCANDEP_SOURCE`` + Set this to tell CMake how to invoke the C++20 module dependency + scanning tool. + +``CMAKE_EXPERIMENTAL_CXX_MODULE_MAP_FORMAT`` + Set this for compilers that generate module maps. See below. + +``CMAKE_EXPERIMENTAL_CXX_MODULE_MAP_FLAG`` + Set this for compilers that generate module maps. See below. For example, add code like the following to a test project: diff --git a/Modules/Compiler/Clang-CXX.cmake b/Modules/Compiler/Clang-CXX.cmake index 84b05d7..33154fd 100644 --- a/Modules/Compiler/Clang-CXX.cmake +++ b/Modules/Compiler/Clang-CXX.cmake @@ -29,3 +29,17 @@ if("x${CMAKE_CXX_COMPILER_FRONTEND_VARIANT}" STREQUAL "xMSVC") set(CMAKE_CXX_DEPENDS_USE_COMPILER TRUE) endif() endif() + +if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 16.0) + string(CONCAT CMAKE_EXPERIMENTAL_CXX_SCANDEP_SOURCE + "${CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS}" + " -format=p1689" + " --" + " <CMAKE_CXX_COMPILER> <DEFINES> <INCLUDES> <FLAGS>" + " -x c++ <SOURCE> -c -o <OBJECT>" + " -MT <DYNDEP_FILE>" + " -MD -MF <DEP_FILE>" + " > <DYNDEP_FILE>") + set(CMAKE_EXPERIMENTAL_CXX_MODULE_MAP_FORMAT "clang") + set(CMAKE_EXPERIMENTAL_CXX_MODULE_MAP_FLAG "@<MODULE_MAP_FILE>") +endif () |