Skip to content

[libc++][doc] Updates module build instructions. #89413

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Apr 23, 2024

Conversation

mordante
Copy link
Member

CMake has landed experimental support for using the Standard modules. This will be part of the CMake 3.30 release. This updates the build instructions to use modules with CMake.

The changes have been tested locally.

@mordante mordante requested a review from a team as a code owner April 19, 2024 16:29
@mordante mordante changed the title [lib++][doc] Updates module build instructions. [libc++][doc] Updates module build instructions. Apr 19, 2024
@llvmbot llvmbot added the libc++ libc++ C++ Standard Library. Not GNU libstdc++. Not libc++abi. label Apr 19, 2024
@llvmbot
Copy link
Member

llvmbot commented Apr 19, 2024

@llvm/pr-subscribers-libcxx

Author: Mark de Wever (mordante)

Changes

CMake has landed experimental support for using the Standard modules. This will be part of the CMake 3.30 release. This updates the build instructions to use modules with CMake.

The changes have been tested locally.


Full diff: https://github.com/llvm/llvm-project/pull/89413.diff

1 Files Affected:

  • (modified) libcxx/docs/Modules.rst (+67-6)
diff --git a/libcxx/docs/Modules.rst b/libcxx/docs/Modules.rst
index 5b027ed1bd0729..fd37394725e1ea 100644
--- a/libcxx/docs/Modules.rst
+++ b/libcxx/docs/Modules.rst
@@ -69,8 +69,6 @@ Some of the current limitations
  * The path to the compiler may not be a symlink, ``clang-scan-deps`` does
    not handle that case properly
  * Libc++ is not tested with modules instead of headers
- * Clang supports modules using GNU extensions, but libc++ does not work using
-   GNU extensions.
  * Clang:
     * Including headers after importing the ``std`` module may fail. This is
       hard to solve and there is a work-around by first including all headers
@@ -105,9 +103,17 @@ Users need to be able to build their own BMI files.
    system vendors, with the goal that building the BMI files is done by
    the build system.
 
-Currently this requires a local build of libc++ with modules enabled. Since
-modules are not part of the installation yet, they are used from the build
-directory. First libc++ needs to be build with module support enabled.
+Currently there are two ways to build modules
+
+  * Use a local build of modules from the build directory. This requires
+    Clang 17 or later and CMake 3.26 or later.
+
+  * Use the installed modules. This requires Clang 18.1.2 or later and
+    a recent build of CMake. The CMake changes will be part CMake 3.30. This
+    method requires you or your distribution to enable module installation.
+
+Using the local build
+~~~~~~~~~~~~~~~~~~~~~
 
 .. code-block:: bash
 
@@ -146,7 +152,6 @@ This is a small sample program that uses the module ``std``. It consists of a
 
   set(CMAKE_CXX_STANDARD 23)
   set(CMAKE_CXX_STANDARD_REQUIRED YES)
-  # Libc++ doesn't support compiler extensions for modules.
   set(CMAKE_CXX_EXTENSIONS OFF)
 
   #
@@ -214,6 +219,62 @@ Building this project is done with the following steps, assuming the files
 
              ``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]``
 
+
+Using the installed modules
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+CMake has added experimental support for importing the standard modules. This
+is available in the current nightly builds and will be part of the 3.30
+release. Currently CMake only supports importing the Standard modules in C++23
+and later. Enabling this for C++20 is on the TODO list of the CMake
+developers.
+
+The example uses the same ``main.cpp`` as above. It uses the following
+``CMakeLists.txt``
+
+.. code-block:: cmake
+
+  # This requires a recent nightly build.
+  # This will be part of CMake 3.30.0.
+  cmake_minimum_required(VERSION 3.29.0 FATAL_ERROR)
+
+  # Enables the Standard module support. This needs to be done
+  # before selecting the languages.
+  set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD "0e5b6991-d74f-4b3d-a41c-cf096e0b2508")
+  set(CMAKE_CXX_MODULE_STD ON)
+
+  project("module"
+    LANGUAGES CXX
+  )
+
+  #
+  # Set language version used
+  #
+
+  set(CMAKE_CXX_STANDARD 23)
+  set(CMAKE_CXX_STANDARD_REQUIRED YES)
+  # This seems to be required to be on.
+  set(CMAKE_CXX_EXTENSIONS ON)
+
+  add_executable(main)
+  target_sources(main
+    PRIVATE
+      main.cpp
+  )
+
+Building this project is done with the following steps, assuming the files
+``main.cpp`` and ``CMakeLists.txt`` are copied in the current directory.
+
+.. code-block:: bash
+
+  $ mkdir build
+  $ cmake -G Ninja -S . -B build -DCMAKE_CXX_COMPILER=<path-to-compiler> -DCMAKE_CXX_FLAGS=-stdlib=libc++
+  $ ninja -C build
+  $ build/main
+
+.. warning:: ``<path-to-compiler>`` should point point to the real binary and
+             not to a symlink.
+
 If you have questions about modules feel free to ask them in the ``#libcxx``
 channel on `LLVM's Discord server <https://discord.gg/jzUbyP26tQ>`__.
 

Comment on lines 256 to 259
# This seems to be required to be on.
set(CMAKE_CXX_EXTENSIONS ON)
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@mathstuf Is requiring the CMAKE_CXX_EXTENSIONS a known limitation?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

CMake doesn't care about this in the relevant codepaths, so if it is, it's a compiler thing.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it's a CMake issue, I've filed https://gitlab.kitware.com/cmake/cmake/-/issues/25916 with additional information.

Copy link
Contributor

@hawkinsw hawkinsw left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for adding this helpful documentation! I hope that my little bit of feedback is helpful.

@ldionne
Copy link
Member

ldionne commented Apr 23, 2024

At this point, I think we should consider installing the modules source files by default. It will still be up to the vendors whether they want to ship them. Once vendors start installing them (even if they're still experimental), this would get the ball rolling for build systems to add support for modules. It's a bit of a chicken-and-egg problem, someone needs to decide to ship something that isn't 100% ready yet. I think is has to be us.

mordante and others added 3 commits April 23, 2024 19:53
CMake has landed experimental support for using the Standard modules. This
will be part of the CMake 3.30 release. This updates the build
instructions to use modules with CMake.

The changes have been tested locally.
- Addresses review comment.
- Updates CMake status regarding disabling compiler extensions.
@mordante mordante force-pushed the review/updates_module_documentation branch from 79e6d88 to e5aae31 Compare April 23, 2024 17:53
@mordante mordante merged commit 033453a into llvm:main Apr 23, 2024
@mordante mordante deleted the review/updates_module_documentation branch April 23, 2024 18:08
mordante added a commit to mordante/llvm-project that referenced this pull request Apr 25, 2024
This was suggested during the review of
llvm#89413

This does not change the experimental state of modules.
mordante added a commit to mordante/llvm-project that referenced this pull request Apr 28, 2024
This was suggested during the review of
llvm#89413

This does not change the experimental state of modules.
mordante added a commit that referenced this pull request Apr 28, 2024
This was suggested during the review of
#89413

This does not change the experimental state of modules.
blueboxd pushed a commit to blueboxd/libcxx that referenced this pull request Apr 19, 2025
This was suggested during the review of
llvm/llvm-project#89413

This does not change the experimental state of modules.

NOKEYCHECK=True
GitOrigin-RevId: 19d2d3fe50c301272350d12c53c801b17e29e64e
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
libc++ libc++ C++ Standard Library. Not GNU libstdc++. Not libc++abi.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants