xref: /llvm-project/libcxx/docs/Modules.rst (revision 033453a9ad2a62914358747b5beb347482d3fdbd)
19b08c8a2SMark de Wever.. _ModulesInLibcxx:
29b08c8a2SMark de Wever
39b08c8a2SMark de Wever=================
49b08c8a2SMark de WeverModules in libc++
59b08c8a2SMark de Wever=================
69b08c8a2SMark de Wever
79b08c8a2SMark de Wever.. warning:: Modules are an experimental feature. It has additional build
89b08c8a2SMark de Wever             requirements and not all libc++ configurations are supported yet.
99b08c8a2SMark de Wever
1032870da3SChris Cotter             The work is still in an early development state and not
119b08c8a2SMark de Wever             considered stable nor complete
129b08c8a2SMark de Wever
139b08c8a2SMark de WeverThis page contains information regarding C++23 module support in libc++.
149b08c8a2SMark de WeverThere are two kinds of modules available in Clang
159b08c8a2SMark de Wever
169b08c8a2SMark de Wever * `Clang specific modules <https://clang.llvm.org/docs/Modules.html>`_
179b08c8a2SMark de Wever * `C++ modules <https://clang.llvm.org/docs/StandardCPlusPlusModules.html>`_
189b08c8a2SMark de Wever
199b08c8a2SMark de WeverThis page mainly discusses the C++ modules. In C++20 there are also header units,
209b08c8a2SMark de Weverthese are not part of this document.
219b08c8a2SMark de Wever
229b08c8a2SMark de WeverOverview
239b08c8a2SMark de Wever========
249b08c8a2SMark de Wever
259b08c8a2SMark de WeverThe module sources are stored in ``.cppm`` files. Modules need to be available
269b08c8a2SMark de Weveras BMIs, which are ``.pcm`` files for Clang. BMIs are not portable, they depend
279b08c8a2SMark de Weveron the compiler used and its compilation flags. Therefore there needs to be a
289b08c8a2SMark de Weverway to distribute the ``.cppm`` files to the user and offer a way for them to
299b08c8a2SMark de Weverbuild and use the ``.pcm`` files. It is expected this will be done by build
309b08c8a2SMark de Weversystems in the future. To aid early adaptor and build system vendors libc++
319b08c8a2SMark de Wevercurrently ships a CMake project to aid building modules.
329b08c8a2SMark de Wever
339b08c8a2SMark de Wever.. note:: This CMake file is intended to be a temporary solution and will
349b08c8a2SMark de Wever          be removed in the future. The timeline for the removal depends
359b08c8a2SMark de Wever          on the availability of build systems with proper module support.
369b08c8a2SMark de Wever
379b08c8a2SMark de WeverWhat works
389b08c8a2SMark de Wever~~~~~~~~~~
399b08c8a2SMark de Wever
409b08c8a2SMark de Wever * Building BMIs
410e059046SMark de Wever * Running tests using the ``std`` and ``std.compat`` module
420e059046SMark de Wever * Using the ``std``  and ``std.compat`` module in external projects
439b08c8a2SMark de Wever * The following "parts disabled" configuration options are supported
449b08c8a2SMark de Wever
459b08c8a2SMark de Wever   * ``LIBCXX_ENABLE_LOCALIZATION``
469b08c8a2SMark de Wever   * ``LIBCXX_ENABLE_WIDE_CHARACTERS``
47ef3a3916SMark de Wever   * ``LIBCXX_ENABLE_THREADS``
48c9c71a7eSMark de Wever   * ``LIBCXX_ENABLE_FILESYSTEM``
490e26efe3SMark de Wever   * ``LIBCXX_ENABLE_RANDOM_DEVICE``
50cfab8686SMark de Wever   * ``LIBCXX_ENABLE_UNICODE``
516f8b1770SMark de Wever   * ``LIBCXX_ENABLE_EXCEPTIONS`` [#note-no-windows]_
529b08c8a2SMark de Wever
53b9f24033SMark de Wever * A C++20 based extension
54b9f24033SMark de Wever
556f8b1770SMark de Wever.. note::
566f8b1770SMark de Wever
576f8b1770SMark de Wever   .. [#note-no-windows] This configuration will probably not work on Windows
586f8b1770SMark de Wever                         due to hard-coded compilation flags.
596f8b1770SMark de Wever
609b08c8a2SMark de WeverSome of the current limitations
619b08c8a2SMark de Wever~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
629b08c8a2SMark de Wever
639b08c8a2SMark de Wever * There is no official build system support, libc++ has experimental CMake support
64b9f24033SMark de Wever * Requires CMake 3.26 for C++20 support
6530f9b479SMark de Wever * Requires CMake 3.26 for C++23 support
6630f9b479SMark de Wever * Requires CMake 3.27 for C++26 support
679b08c8a2SMark de Wever * Requires Ninja 1.11
680e059046SMark de Wever * Requires Clang 17
699b08c8a2SMark de Wever * The path to the compiler may not be a symlink, ``clang-scan-deps`` does
709b08c8a2SMark de Wever   not handle that case properly
719b08c8a2SMark de Wever * Libc++ is not tested with modules instead of headers
729b08c8a2SMark de Wever * Clang:
739b08c8a2SMark de Wever    * Including headers after importing the ``std`` module may fail. This is
749b08c8a2SMark de Wever      hard to solve and there is a work-around by first including all headers
759b08c8a2SMark de Wever      `bug report <https://github.com/llvm/llvm-project/issues/61465>`__.
769b08c8a2SMark de Wever
779b08c8a2SMark de WeverBlockers
789b08c8a2SMark de Wever~~~~~~~~
799b08c8a2SMark de Wever
809b08c8a2SMark de Wever  * libc++
819b08c8a2SMark de Wever
829b08c8a2SMark de Wever    * Currently the tests only test with modules enabled, but do not import
839b08c8a2SMark de Wever      modules instead of headers. When converting tests to using modules there
849b08c8a2SMark de Wever      are still failures. These are under investigation.
859b08c8a2SMark de Wever
869b08c8a2SMark de Wever    * It has not been determined how to fully test libc++ with modules instead
879b08c8a2SMark de Wever      of headers.
889b08c8a2SMark de Wever
899b08c8a2SMark de Wever  * Clang
909b08c8a2SMark de Wever
919b08c8a2SMark de Wever    * Some concepts do not work properly
929b08c8a2SMark de Wever      `bug report <https://github.com/llvm/llvm-project/issues/62943>`__.
939b08c8a2SMark de Wever
949b08c8a2SMark de Wever
959b08c8a2SMark de WeverUsing in external projects
969b08c8a2SMark de Wever==========================
979b08c8a2SMark de Wever
989b08c8a2SMark de WeverUsers need to be able to build their own BMI files.
999b08c8a2SMark de Wever
1009b08c8a2SMark de Wever.. note:: The requirements for users to build their own BMI files will remain
10114292d9fSKazu Hirata   true for the foreseeable future. For now this needs to be done manually.
1029b08c8a2SMark de Wever   Once libc++'s implementation is more mature we will reach out to build
1039b08c8a2SMark de Wever   system vendors, with the goal that building the BMI files is done by
1049b08c8a2SMark de Wever   the build system.
1059b08c8a2SMark de Wever
106*033453a9SMark de WeverCurrently there are two ways to build modules
107*033453a9SMark de Wever
108*033453a9SMark de Wever  * Use a local build of modules from the build directory. This requires
109*033453a9SMark de Wever    Clang 17 or later and CMake 3.26 or later.
110*033453a9SMark de Wever
111*033453a9SMark de Wever  * Use the installed modules. This requires Clang 18.1.2 or later and
112*033453a9SMark de Wever    a recent build of CMake. The CMake changes will be part of CMake 3.30. This
113*033453a9SMark de Wever    method requires you or your distribution to enable module installation.
114*033453a9SMark de Wever
115*033453a9SMark de WeverUsing the local build
116*033453a9SMark de Wever~~~~~~~~~~~~~~~~~~~~~
1179b08c8a2SMark de Wever
1189b08c8a2SMark de Wever.. code-block:: bash
1199b08c8a2SMark de Wever
1209b08c8a2SMark de Wever  $ git clone https://github.com/llvm/llvm-project.git
1219b08c8a2SMark de Wever  $ cd llvm-project
1229b08c8a2SMark de Wever  $ mkdir build
1231d6b6132SMark de Wever  $ cmake -G Ninja -S runtimes -B build -DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi;libunwind"
1249b08c8a2SMark de Wever  $ ninja -C build
1259b08c8a2SMark de Wever
1269b08c8a2SMark de WeverThe above ``build`` directory will be referred to as ``<build>`` in the
1279b08c8a2SMark de Weverrest of these instructions.
1289b08c8a2SMark de Wever
1299b08c8a2SMark de WeverThis is a small sample program that uses the module ``std``. It consists of a
1309b08c8a2SMark de Wever``CMakeLists.txt`` and a ``main.cpp`` file.
1319b08c8a2SMark de Wever
1329b08c8a2SMark de Wever.. code-block:: cpp
1339b08c8a2SMark de Wever
1340e059046SMark de Wever  import std; // When importing std.compat it's not needed to import std.
1350e059046SMark de Wever  import std.compat;
1369b08c8a2SMark de Wever
1370e059046SMark de Wever  int main() {
1380e059046SMark de Wever    std::cout << "Hello modular world\n";
1390e059046SMark de Wever    ::printf("Hello compat modular world\n");
1400e059046SMark de Wever  }
1419b08c8a2SMark de Wever
1429b08c8a2SMark de Wever.. code-block:: cmake
1439b08c8a2SMark de Wever
1449b08c8a2SMark de Wever  cmake_minimum_required(VERSION 3.26.0 FATAL_ERROR)
145*033453a9SMark de Wever  project("example"
1469b08c8a2SMark de Wever    LANGUAGES CXX
1479b08c8a2SMark de Wever  )
1489b08c8a2SMark de Wever
1499b08c8a2SMark de Wever  #
1509b08c8a2SMark de Wever  # Set language version used
1519b08c8a2SMark de Wever  #
1529b08c8a2SMark de Wever
1539b08c8a2SMark de Wever  set(CMAKE_CXX_STANDARD 23)
1549b08c8a2SMark de Wever  set(CMAKE_CXX_STANDARD_REQUIRED YES)
1559b08c8a2SMark de Wever  set(CMAKE_CXX_EXTENSIONS OFF)
1569b08c8a2SMark de Wever
1579b08c8a2SMark de Wever  #
1589b08c8a2SMark de Wever  # Enable modules in CMake
1599b08c8a2SMark de Wever  #
1609b08c8a2SMark de Wever
1619b08c8a2SMark de Wever  # This is required to write your own modules in your project.
1620e059046SMark de Wever  if(CMAKE_VERSION VERSION_LESS "3.28.0")
1639b08c8a2SMark de Wever    if(CMAKE_VERSION VERSION_LESS "3.27.0")
1649b08c8a2SMark de Wever      set(CMAKE_EXPERIMENTAL_CXX_MODULE_CMAKE_API "2182bf5c-ef0d-489a-91da-49dbc3090d2a")
1659b08c8a2SMark de Wever    else()
1669b08c8a2SMark de Wever      set(CMAKE_EXPERIMENTAL_CXX_MODULE_CMAKE_API "aa1f7df0-828a-4fcd-9afc-2dc80491aca7")
1679b08c8a2SMark de Wever    endif()
1689b08c8a2SMark de Wever    set(CMAKE_EXPERIMENTAL_CXX_MODULE_DYNDEP 1)
1690e059046SMark de Wever  else()
1700e059046SMark de Wever    cmake_policy(VERSION 3.28)
1710e059046SMark de Wever  endif()
1729b08c8a2SMark de Wever
1739b08c8a2SMark de Wever  #
1749b08c8a2SMark de Wever  # Import the modules from libc++
1759b08c8a2SMark de Wever  #
1769b08c8a2SMark de Wever
1779b08c8a2SMark de Wever  include(FetchContent)
1789b08c8a2SMark de Wever  FetchContent_Declare(
1799b08c8a2SMark de Wever    std
1809b08c8a2SMark de Wever    URL "file://${LIBCXX_BUILD}/modules/c++/v1/"
1819b08c8a2SMark de Wever    DOWNLOAD_EXTRACT_TIMESTAMP TRUE
1820e059046SMark de Wever    SYSTEM
1839b08c8a2SMark de Wever  )
1840e059046SMark de Wever  FetchContent_MakeAvailable(std)
1859b08c8a2SMark de Wever
1869b08c8a2SMark de Wever  #
1879b08c8a2SMark de Wever  # Add the project
1889b08c8a2SMark de Wever  #
1899b08c8a2SMark de Wever
1909b08c8a2SMark de Wever  add_executable(main)
1912c703ed7SEric  add_dependencies(main std.compat)
1922c703ed7SEric  target_link_libraries(main std.compat)
1939b08c8a2SMark de Wever  target_sources(main
1949b08c8a2SMark de Wever    PRIVATE
1959b08c8a2SMark de Wever      main.cpp
1969b08c8a2SMark de Wever  )
1979b08c8a2SMark de Wever
1989b08c8a2SMark de WeverBuilding this project is done with the following steps, assuming the files
1999b08c8a2SMark de Wever``main.cpp`` and ``CMakeLists.txt`` are copied in the current directory.
2009b08c8a2SMark de Wever
2019b08c8a2SMark de Wever.. code-block:: bash
2029b08c8a2SMark de Wever
2039b08c8a2SMark de Wever  $ mkdir build
2049b08c8a2SMark de Wever  $ cmake -G Ninja -S . -B build -DCMAKE_CXX_COMPILER=<path-to-compiler> -DLIBCXX_BUILD=<build>
2059b08c8a2SMark de Wever  $ ninja -C build
2069b08c8a2SMark de Wever  $ build/main
2079b08c8a2SMark de Wever
2089b08c8a2SMark de Wever.. warning:: ``<path-to-compiler>`` should point point to the real binary and
2099b08c8a2SMark de Wever             not to a symlink.
2109b08c8a2SMark de Wever
2119b08c8a2SMark de Wever.. warning:: When using these examples in your own projects make sure the
2129b08c8a2SMark de Wever             compilation flags are the same for the ``std`` module and your
2139b08c8a2SMark de Wever             project. Some flags will affect the generated code, when these
2149b08c8a2SMark de Wever             are different the module cannot be used. For example using
2159b08c8a2SMark de Wever             ``-pthread`` in your project and not in the module will give
2169b08c8a2SMark de Wever             errors like
2179b08c8a2SMark de Wever
2189b08c8a2SMark de Wever             ``error: POSIX thread support was disabled in PCH file but is currently enabled``
2199b08c8a2SMark de Wever
2209b08c8a2SMark de Wever             ``error: module file _deps/std-build/CMakeFiles/std.dir/std.pcm cannot be loaded due to a configuration mismatch with the current compilation [-Wmodule-file-config-mismatch]``
2219b08c8a2SMark de Wever
222*033453a9SMark de Wever
223*033453a9SMark de WeverUsing the installed modules
224*033453a9SMark de Wever~~~~~~~~~~~~~~~~~~~~~~~~~~~
225*033453a9SMark de Wever
226*033453a9SMark de WeverCMake has added experimental support for importing the Standard modules. This
227*033453a9SMark de Weveris available in the current nightly builds and will be part of the 3.30
228*033453a9SMark de Weverrelease. Currently CMake only supports importing the Standard modules in C++23
229*033453a9SMark de Weverand later. Enabling this for C++20 is on the TODO list of the CMake
230*033453a9SMark de Weverdevelopers.
231*033453a9SMark de Wever
232*033453a9SMark de WeverThe example uses the same ``main.cpp`` as above. It uses the following
233*033453a9SMark de Wever``CMakeLists.txt``:
234*033453a9SMark de Wever
235*033453a9SMark de Wever.. code-block:: cmake
236*033453a9SMark de Wever
237*033453a9SMark de Wever  # This requires a recent nightly build.
238*033453a9SMark de Wever  # This will be part of CMake 3.30.0.
239*033453a9SMark de Wever  cmake_minimum_required(VERSION 3.29.0 FATAL_ERROR)
240*033453a9SMark de Wever
241*033453a9SMark de Wever  # Enables the Standard module support. This needs to be done
242*033453a9SMark de Wever  # before selecting the languages.
243*033453a9SMark de Wever  set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD "0e5b6991-d74f-4b3d-a41c-cf096e0b2508")
244*033453a9SMark de Wever  set(CMAKE_CXX_MODULE_STD ON)
245*033453a9SMark de Wever
246*033453a9SMark de Wever  project("example"
247*033453a9SMark de Wever    LANGUAGES CXX
248*033453a9SMark de Wever  )
249*033453a9SMark de Wever
250*033453a9SMark de Wever  #
251*033453a9SMark de Wever  # Set language version used
252*033453a9SMark de Wever  #
253*033453a9SMark de Wever
254*033453a9SMark de Wever  set(CMAKE_CXX_STANDARD 23)
255*033453a9SMark de Wever  set(CMAKE_CXX_STANDARD_REQUIRED YES)
256*033453a9SMark de Wever  # Currently CMake requires extensions enabled when using import std.
257*033453a9SMark de Wever  # https://gitlab.kitware.com/cmake/cmake/-/issues/25916
258*033453a9SMark de Wever  # https://gitlab.kitware.com/cmake/cmake/-/issues/25539
259*033453a9SMark de Wever  set(CMAKE_CXX_EXTENSIONS ON)
260*033453a9SMark de Wever
261*033453a9SMark de Wever  add_executable(main)
262*033453a9SMark de Wever  target_sources(main
263*033453a9SMark de Wever    PRIVATE
264*033453a9SMark de Wever      main.cpp
265*033453a9SMark de Wever  )
266*033453a9SMark de Wever
267*033453a9SMark de WeverBuilding this project is done with the following steps, assuming the files
268*033453a9SMark de Wever``main.cpp`` and ``CMakeLists.txt`` are copied in the current directory.
269*033453a9SMark de Wever
270*033453a9SMark de Wever.. code-block:: bash
271*033453a9SMark de Wever
272*033453a9SMark de Wever  $ mkdir build
273*033453a9SMark de Wever  $ cmake -G Ninja -S . -B build -DCMAKE_CXX_COMPILER=<path-to-compiler> -DCMAKE_CXX_FLAGS=-stdlib=libc++
274*033453a9SMark de Wever  $ ninja -C build
275*033453a9SMark de Wever  $ build/main
276*033453a9SMark de Wever
277*033453a9SMark de Wever.. warning:: ``<path-to-compiler>`` should point point to the real binary and
278*033453a9SMark de Wever             not to a symlink.
279*033453a9SMark de Wever
280af7c22b7SMark de WeverIf you have questions about modules feel free to ask them in the ``#libcxx``
2819b08c8a2SMark de Weverchannel on `LLVM's Discord server <https://discord.gg/jzUbyP26tQ>`__.
2829b08c8a2SMark de Wever
2839b08c8a2SMark de WeverIf you think you've found a bug please it using the `LLVM bug tracker
2849b08c8a2SMark de Wever<https://github.com/llvm/llvm-project/issues>`_. Please make sure the issue
2859b08c8a2SMark de Weveryou found is not one of the known bugs or limitations on this page.
286