Date: Fri, 7 Jul 2023 18:04:38 +0000
[Mark]
> The proposed path seems not a good path for Windows. I hope the
> Microsoft developers have a suggestion. Would it be possible for other
> libraries to match with MSVC STL does?
For context, MSVC puts the Standard Library Modules in a directory named "modules/" sibling to the "include/" directory for standard headers. That is the contract with MSVC users and all devtools targeting MSVC.
See for example, what I did here: https://github.com/GabrielDosReis/cmake-for-modules/blob/main/CXXModuleExperimentalSupport.cmake
-- Gaby
-----Original Message-----
From: SG15 <sg15-bounces_at_[hidden]> On Behalf Of Mark de Wever via SG15
Sent: Sunday, July 2, 2023 8:41 AM
To: sg15_at_[hidden]
Cc: Mark de Wever <koraq_at_[hidden]>; Louis Dionne <ldionne_at_[hidden]>; Casey Carter <casey.carter_at_[hidden]>; Aaron Mondal <aaron_at_[hidden]>; Stephan T. Lavavej <stl_at_[hidden]>; Chuanqi Xu <yedeng.yd_at_[hidden]>
Subject: [SG15] Provide build systems with ways to build the std(.compat) modules
I'm a libc++ developer working on implementing the std and the
std.compat module. I have an experimental version of the std module [1].
Using the module requires manually building the BMI using the files in
the local libc++ build directory. This works for early adaptors, but is
not a solution that can be used in production.
There was an discussion about the installation location on LLVM's
discourse [2]. There it has been suggested to discuss this in SG15. I
spoke with Louis Dionne, the maintainer of libc++. He spoke with Michael
Spencer and it indeed seems in the purview of SG15 to discuss this.
Louis asked me to send an email to the reflector to give more
information for a discussion during a telecon.
The goal is to find a good installation directory for (standard) library
module sources so they can be used by build systems to build the
required BMIs. This means the library should provide the information
needed for build systems. There is a p1689 format for modules, which
seems good starting point for supplying this information.
With this information users can import the std(.compat) module in their
projects and it works out of the box, just like including standard
headers and linking against the standard library.
MSVC has the files std.ixx, std.compat.ixx, and modules.json in their
source tree. I've no experience with MSVC and what is required to build
BMIs from these source files.
Libc++ has std.cppm, std/<header>.cppm for every header, and a
CMakeLists.txt. In order to build the BMI clang needs to use special
build flags. For example, -Wno-reserved-module-identifier is needed to
allow building modules with implementation reserved names. AFAIK
specifying build flags is not possible in the p1689 format without
vendor extensions.
When the standard libraries have a good location it seems natural that
other libraries want to use a similar location. It would be good to have
a uniform way to store module information, which then can be used by
build systems to build the required BMI files.
The suggestion on LLVM's discourse for the path would be
${PREFIX}/usr/share/c++/modules/<library>/
For example, Apple uses ${SDKROOT} as ${PREFIX} where it's an empty
string on Linux systems.
The <library> is the name of the library where every name starting with
the library name is reserved. Some examples:
${PREFIX}/usr/share/c++/modules/libc++/v1/std.cppm
${PREFIX}/usr/share/c++/modules/libc++/v1/std.compat.cppm
${PREFIX}/usr/share/c++/modules/libstdc++/14/std.cppm
${PREFIX}/usr/share/c++/modules/libstdc++/14/std.compat.cppm
${PREFIX}/usr/share/c++/modules/qt/core.cppm
${PREFIX}/usr/share/c++/modules/qt/network.cppm
${PREFIX}/usr/share/c++/modules/boost181/boost.cppm
${PREFIX}/usr/share/c++/modules/boost182/boost.cppm
In the latter case the boost181 and boost182 belong to the boost
library namespace.
The proposed path seems not a good path for Windows. I hope the
Microsoft developers have a suggestion. Would it be possible for other
libraries to match with MSVC STL does?
The things I would like to discuss are:
- Are we happy with the proposed locations on non-Windows systems?
- What would be a good location on Windows?
- What information do build system vendors need to turn the sources into
BMI files and how is this information provided.
[1] https://libcxx.llvm.org/Modules.html
[2] https://discourse.llvm.org/t/rfc-about-the-default-location-for-std-modules/69191
Cheers,
Mark
_______________________________________________
SG15 mailing list
SG15_at_[hidden]
https://lists.isocpp.org/mailman/listinfo.cgi/sg15
> The proposed path seems not a good path for Windows. I hope the
> Microsoft developers have a suggestion. Would it be possible for other
> libraries to match with MSVC STL does?
For context, MSVC puts the Standard Library Modules in a directory named "modules/" sibling to the "include/" directory for standard headers. That is the contract with MSVC users and all devtools targeting MSVC.
See for example, what I did here: https://github.com/GabrielDosReis/cmake-for-modules/blob/main/CXXModuleExperimentalSupport.cmake
-- Gaby
-----Original Message-----
From: SG15 <sg15-bounces_at_[hidden]> On Behalf Of Mark de Wever via SG15
Sent: Sunday, July 2, 2023 8:41 AM
To: sg15_at_[hidden]
Cc: Mark de Wever <koraq_at_[hidden]>; Louis Dionne <ldionne_at_[hidden]>; Casey Carter <casey.carter_at_[hidden]>; Aaron Mondal <aaron_at_[hidden]>; Stephan T. Lavavej <stl_at_[hidden]>; Chuanqi Xu <yedeng.yd_at_[hidden]>
Subject: [SG15] Provide build systems with ways to build the std(.compat) modules
I'm a libc++ developer working on implementing the std and the
std.compat module. I have an experimental version of the std module [1].
Using the module requires manually building the BMI using the files in
the local libc++ build directory. This works for early adaptors, but is
not a solution that can be used in production.
There was an discussion about the installation location on LLVM's
discourse [2]. There it has been suggested to discuss this in SG15. I
spoke with Louis Dionne, the maintainer of libc++. He spoke with Michael
Spencer and it indeed seems in the purview of SG15 to discuss this.
Louis asked me to send an email to the reflector to give more
information for a discussion during a telecon.
The goal is to find a good installation directory for (standard) library
module sources so they can be used by build systems to build the
required BMIs. This means the library should provide the information
needed for build systems. There is a p1689 format for modules, which
seems good starting point for supplying this information.
With this information users can import the std(.compat) module in their
projects and it works out of the box, just like including standard
headers and linking against the standard library.
MSVC has the files std.ixx, std.compat.ixx, and modules.json in their
source tree. I've no experience with MSVC and what is required to build
BMIs from these source files.
Libc++ has std.cppm, std/<header>.cppm for every header, and a
CMakeLists.txt. In order to build the BMI clang needs to use special
build flags. For example, -Wno-reserved-module-identifier is needed to
allow building modules with implementation reserved names. AFAIK
specifying build flags is not possible in the p1689 format without
vendor extensions.
When the standard libraries have a good location it seems natural that
other libraries want to use a similar location. It would be good to have
a uniform way to store module information, which then can be used by
build systems to build the required BMI files.
The suggestion on LLVM's discourse for the path would be
${PREFIX}/usr/share/c++/modules/<library>/
For example, Apple uses ${SDKROOT} as ${PREFIX} where it's an empty
string on Linux systems.
The <library> is the name of the library where every name starting with
the library name is reserved. Some examples:
${PREFIX}/usr/share/c++/modules/libc++/v1/std.cppm
${PREFIX}/usr/share/c++/modules/libc++/v1/std.compat.cppm
${PREFIX}/usr/share/c++/modules/libstdc++/14/std.cppm
${PREFIX}/usr/share/c++/modules/libstdc++/14/std.compat.cppm
${PREFIX}/usr/share/c++/modules/qt/core.cppm
${PREFIX}/usr/share/c++/modules/qt/network.cppm
${PREFIX}/usr/share/c++/modules/boost181/boost.cppm
${PREFIX}/usr/share/c++/modules/boost182/boost.cppm
In the latter case the boost181 and boost182 belong to the boost
library namespace.
The proposed path seems not a good path for Windows. I hope the
Microsoft developers have a suggestion. Would it be possible for other
libraries to match with MSVC STL does?
The things I would like to discuss are:
- Are we happy with the proposed locations on non-Windows systems?
- What would be a good location on Windows?
- What information do build system vendors need to turn the sources into
BMI files and how is this information provided.
[1] https://libcxx.llvm.org/Modules.html
[2] https://discourse.llvm.org/t/rfc-about-the-default-location-for-std-modules/69191
Cheers,
Mark
_______________________________________________
SG15 mailing list
SG15_at_[hidden]
https://lists.isocpp.org/mailman/listinfo.cgi/sg15
Received on 2023-07-07 18:04:41