-
Notifications
You must be signed in to change notification settings - Fork 13.7k
[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
[libc++][doc] Updates module build instructions. #89413
Conversation
@llvm/pr-subscribers-libcxx Author: Mark de Wever (mordante) ChangesCMake 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:
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>`__.
|
libcxx/docs/Modules.rst
Outdated
# This seems to be required to be on. | ||
set(CMAKE_CXX_EXTENSIONS ON) |
There was a problem hiding this comment.
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?
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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.
There was a problem hiding this 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.
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. |
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.
Co-authored-by: Will Hawkins <[email protected]>
- Addresses review comment. - Updates CMake status regarding disabling compiler extensions.
79e6d88
to
e5aae31
Compare
This was suggested during the review of llvm#89413 This does not change the experimental state of modules.
This was suggested during the review of llvm#89413 This does not change the experimental state of modules.
This was suggested during the review of #89413 This does not change the experimental state of modules.
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
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.