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