aboutsummaryrefslogtreecommitdiff
path: root/libbuild2/cxx
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2023-12-07 09:24:08 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2023-12-07 09:24:08 +0200
commitf5e6c30650dbb135cb758431944f8d350eeee61e (patch)
treef73c26a8dbe549cb34335af3962f744c395c5171 /libbuild2/cxx
parentd4234c2c011d0fdcce6dc9006741373f048db942 (diff)
C++20 named modules support for MSVC, take 2
Diffstat (limited to 'libbuild2/cxx')
-rw-r--r--libbuild2/cxx/init.cxx39
1 files changed, 19 insertions, 20 deletions
diff --git a/libbuild2/cxx/init.cxx b/libbuild2/cxx/init.cxx
index 626c795..8a2ad88 100644
--- a/libbuild2/cxx/init.cxx
+++ b/libbuild2/cxx/init.cxx
@@ -388,28 +388,24 @@ namespace build2
{
case compiler_type::msvc:
{
- // While modules are supported in VC 15.0 (19.10), there is a
- // bug in the separate interface/implementation unit support
- // which makes them pretty much unusable. This has been fixed in
- // 15.3 (19.11). And 15.5 (19.12) supports the `export module
- // M;` syntax. And 16.4 (19.24) supports the global module
- // fragment. And in 16.8 all the modules-related options have
- // been changed. Seeing that the whole thing is unusable anyway,
- // we disable it for 16.8 or later for now.
+ // Modules are enabled by default in /std:c++20 and
+ // /std:c++latest with both defining __cpp_modules to 201907
+ // (final C++20 module), at least as of 17.6 (LTS).
//
- if ((mj > 19 || (mj == 19 && mi >= (modules.value ? 10 : 12))) &&
- (mj < 19 || (mj == 19 && mi < 28) || modules.value))
+ // @@ Should we enable modules by default?
+ //
+ if (modules.value)
{
- prepend (
- mj > 19 || mi >= 24 ?
- "/D__cpp_modules=201810" : // p1103 (merged modules)
- mj == 19 || mi >= 12 ?
- "/D__cpp_modules=201704" : // p0629r0 (export module M;)
- "/D__cpp_modules=201703"); // n4647 ( module M;)
-
- prepend ("/experimental:module");
+ if (mj < 19 || (mj == 19 && mi < 36))
+ {
+ fail << "support for C++ modules requires MSVC 17.6 or later" <<
+ info << "C++ compiler is " << ci.signature <<
+ info << "required by " << project (rs) << '@' << rs;
+ }
+
modules = true;
}
+
break;
}
case compiler_type::gcc:
@@ -419,6 +415,10 @@ namespace build2
// generated headers via the mapper, we require the user to
// explicitly request modules.
//
+ // @@ Actually, now that we pre-generate headers by default,
+ // this is probably no longer the reason. But GCC modules being
+ // unusable due to bugs is a reason enough.
+ //
if (mj >= 11 && modules.value)
{
// Defines __cpp_modules:
@@ -870,8 +870,7 @@ namespace build2
"cxx.link",
"cxx.install",
- cm.x_info->id.type,
- cm.x_info->id.variant,
+ cm.x_info->id,
cm.x_info->class_,
cm.x_info->version.major,
cm.x_info->version.minor,