Provided by: cmake-data_4.1.1+really3.31.6-2ubuntu1_all bug

NAME

       cmake-cxxmodules - CMake C++ Modules Support Reference

       Added in version 3.28.

       C++  20  introduced the concept of "modules" to the language.  The design requires build systems to order
       compilations among each other to satisfy import statements reliably.   CMake's  implementation  asks  the
       compiler  to  scan  source  files  for module dependencies during the build, collates scanning results to
       infer ordering constraints, and tells the build tool how to dynamically update the build graph.

COMPILATION STRATEGY

       With C++ modules, compiling a set of C++ sources is no longer embarrassingly parallel. That is, any given
       source may first require the compilation of another source  file  first  in  order  to  provide  a  "CMI"
       (compiled  module  interface) or "BMI" (binary module interface) that C++ compilers use to satisfy import
       statements in other sources. With headers, sources could share their declarations so that  any  consumers
       could  compile  independently.   With modules, declarations are now generated into these BMI files by the
       compiler during compilation based on the contents of the source file and its export statements.

       The order necessary for compilation requires build-time resolution of the ordering because the  order  is
       controlled  by  the contents of the sources. This means that the ordering needs extracted from the source
       during the build to avoid regenerating the build graph via a  configure  and  generate  phase  for  every
       source change to get a correct build.

       The  general strategy is to use a "scanner" to extract the ordering dependency information and update the
       build graph with new edges between existing edges by taking the per-source scan results  (represented  by
       P1689R5  <https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p1689r5.html>  files)  and "collating"
       the dependencies within a target and to modules produced by targets visible to the  target.  The  primary
       task  is to generate "module map" files to pass to each compile rule with the paths to the BMIs needed to
       satisfy import statements. The collator also has tasks to use the  build-time  information  to  fill  out
       information  including  install  rules for the module interface units, their BMIs, and properties for any
       exported targets with C++ modules.

       Note:
          CMake is focusing on correct builds before  looking  at  performance  improvements.  There  are  known
          tactics  within  the chosen strategy which may offer build performance improvements. However, they are
          being deferred until we have a working model against which to compare them. It is  also  important  to
          note  that  a tactic useful in one situation (e.g., clean builds) may not be performant in a different
          situation (e.g., incremental builds). Finding a balance and offering controls to select the tactics is
          future work.

SCANNING CONTROL

       Whether or not sources get scanned for C++ module usage is dependent on the following queries. The  first
       query that provides a yes/no answer is used.

       • If the source file belongs to a file set of type CXX_MODULES, it will be scanned.

       • If the target does not use at least C++ 20, it will not be scanned.

       • If the source file is not the language CXX, it will not be scanned.

       • If the CXX_SCAN_FOR_MODULES <#prop_sf:CXX_SCAN_FOR_MODULES> source file property is set, its value will
         be used.

       • If  the CXX_SCAN_FOR_MODULES <#prop_tgt:CXX_SCAN_FOR_MODULES> target property is set, its value will be
         used.  Set the CMAKE_CXX_SCAN_FOR_MODULES <#variable:CMAKE_CXX_SCAN_FOR_MODULES> variable to initialize
         this property on all targets as they are created.

       • Otherwise, the source file will be scanned if the compiler and generator support scanning.  See  policy
         CMP0155 <#policy:CMP0155>.

       Note   that   any   scanned   source   will  be  excluded  from  any  unity  build  (see  UNITY_BUILD  <#
       prop_tgt:UNITY_BUILD>) because module-related statements can only  happen  at  one  place  within  a  C++
       translation unit.

COMPILER SUPPORT

       Compilers which CMake natively supports module dependency scanning include:

       • MSVC toolset 14.34 and newer (provided with Visual Studio 17.4 and newer)

       • LLVM/Clang 16.0 and newer

       • GCC 14 (for the in-development branch, after 2023-09-20) and newer

IMPORT STD SUPPORT

       Support for import std is limited to the following toolchain and standard library combinations:

       • Clang 18.1.2 and newer with -stdlib=libc++

       • MSVC toolset 14.36 and newer (provided with Visual Studio 17.6 Preview 2 and newer)

       The  CMAKE_CXX_COMPILER_IMPORT_STD  <#variable:CMAKE_CXX_COMPILER_IMPORT_STD>  variable  may  be  used to
       detect support for a standard level with the active C++ toolchain.

       Note:
          This support is provided only when experimental support for  import  std;  has  been  enabled  by  the
          CMAKE_EXPERIMENTAL_CXX_IMPORT_STD gate.

GENERATOR SUPPORT

       The list of generators which support scanning sources for C++ modules include:

       • Ninja <#generator:Ninja>

       • Ninja Multi-Config <#generator:Ninja Multi-Config>

       • Visual Studio 17 2022 <#generator:Visual Studio 17 2022>

   Limitations
       There  are  a  number  of  known  limitations  of the current C++ module support in CMake.  This does not
       document known limitations or bugs in compilers as these can change over time.

       For all generators:

       • Header units are not supported.

       • No builtin support for import std; or other compiler-provided modules.

       For the Ninja Generators:

       • ninja 1.11 or newer is required.

       For the Visual Studio Generators <#visual-studio-generators>:

       • Only Visual Studio 2022 and MSVC toolsets 14.34 (Visual Studio 17.4) and newer.

       • No support for exporting or installing BMI or module information.

       • No support for compiling BMIs from IMPORTED targets with C++ modules (including import std).

       • No diagnosis of using modules provided by PRIVATE sources from PUBLIC module sources.

Copyright

       2000-2024 Kitware, Inc. and Contributors

3.31.6                                          December 01, 2025                            CMAKE-CXXMODULES(7)