diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java
index 420ea3f3ef9bbf..ce9d7667a74917 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java
@@ -880,10 +880,24 @@ public boolean experimentalCcImplementationDepsForStarlark(StarlarkThread thread
return experimentalCcImplementationDeps();
}
+ @StarlarkMethod(
+ name = "experimental_cpp20_modules",
+ documented = false,
+ useStarlarkThread = true)
+ public boolean experimentalCpp20ModulesForStarlark(StarlarkThread thread)
+ throws EvalException {
+ CcModule.checkPrivateStarlarkificationAllowlist(thread);
+ return experimentalCpp20Modules();
+ }
+
public boolean experimentalCcImplementationDeps() {
return cppOptions.experimentalCcImplementationDeps;
}
+ public boolean experimentalCpp20Modules() {
+ return cppOptions.experimentalCpp20Modules;
+ }
+
public boolean getExperimentalCppCompileResourcesEstimation() {
return cppOptions.experimentalCppCompileResourcesEstimation;
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppOptions.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppOptions.java
index 8b9b65f1c5c1fb..f5cd45dd77a367 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppOptions.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppOptions.java
@@ -1038,6 +1038,19 @@ public Label getMemProfProfileLabel() {
help = "If enabled, cc_library targets can use attribute `implementation_deps`.")
public boolean experimentalCcImplementationDeps;
+ @Option(
+ name = "experimental_cpp20_modules",
+ defaultValue = "false",
+ documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
+ effectTags = {
+ OptionEffectTag.LOADING_AND_ANALYSIS,
+ OptionEffectTag.EXECUTION,
+ OptionEffectTag.CHANGES_INPUTS
+ },
+ metadataTags = {OptionMetadataTag.EXPERIMENTAL},
+ help = "If enabled, cc_binary and cc_library targets can use attribute `module_interfaces`.")
+ public boolean experimentalCpp20Modules;
+
@Option(
name = "experimental_link_static_libraries_once",
defaultValue = "true",
diff --git a/src/main/starlark/builtins_bzl/common/builtin_exec_platforms.bzl b/src/main/starlark/builtins_bzl/common/builtin_exec_platforms.bzl
index 1a22a0b76c5915..705c0c96945ad8 100644
--- a/src/main/starlark/builtins_bzl/common/builtin_exec_platforms.bzl
+++ b/src/main/starlark/builtins_bzl/common/builtin_exec_platforms.bzl
@@ -278,6 +278,7 @@ bazel_fragments["CppOptions"] = fragment(
"//command_line_option:target libcTop label",
"//command_line_option:experimental_link_static_libraries_once",
"//command_line_option:experimental_cc_implementation_deps",
+ "//command_line_option:experimental_cpp20_modules",
"//command_line_option:start_end_lib",
"//command_line_option:experimental_inmemory_dotd_files",
"//command_line_option:incompatible_disable_legacy_cc_provider",
diff --git a/src/main/starlark/builtins_bzl/common/cc/attrs.bzl b/src/main/starlark/builtins_bzl/common/cc/attrs.bzl
index 0e4883b9382ec7..fe30326b360135 100644
--- a/src/main/starlark/builtins_bzl/common/cc/attrs.bzl
+++ b/src/main/starlark/builtins_bzl/common/cc/attrs.bzl
@@ -97,6 +97,8 @@ C++ Standard has no restriction about module interface file extension
MSVC use ixx
+For now usage is guarded by the flag
+--experimental_cpp20_modules
.
""",
),
"data": attr.label_list(
diff --git a/src/main/starlark/builtins_bzl/common/cc/cc_binary.bzl b/src/main/starlark/builtins_bzl/common/cc/cc_binary.bzl
index 3e725af0ee04eb..939633f07a4e68 100644
--- a/src/main/starlark/builtins_bzl/common/cc/cc_binary.bzl
+++ b/src/main/starlark/builtins_bzl/common/cc/cc_binary.bzl
@@ -487,7 +487,8 @@ def cc_binary_impl(ctx, additional_linkopts, force_linkstatic = False):
unsupported_features = disabled_features,
)
- cc_helper.check_cpp20_module(ctx, feature_configuration)
+ semantics.check_can_module_interfaces(ctx)
+ cc_helper.check_cpp20_modules(ctx, feature_configuration)
all_deps = ctx.attr.deps + semantics.get_cc_runtimes(ctx, _is_link_shared(ctx))
compilation_context_deps = [dep[CcInfo].compilation_context for dep in all_deps if CcInfo in dep]
diff --git a/src/main/starlark/builtins_bzl/common/cc/cc_helper.bzl b/src/main/starlark/builtins_bzl/common/cc/cc_helper.bzl
index 983ed386dc5c41..49bd701940211f 100644
--- a/src/main/starlark/builtins_bzl/common/cc/cc_helper.bzl
+++ b/src/main/starlark/builtins_bzl/common/cc/cc_helper.bzl
@@ -955,7 +955,6 @@ def _map_to_list(m):
result.append((k, v))
return result
-
# "srcs" attribute is a LABEL_LIST in cc_rules, which might also contain files.
def _calculate_artifact_label_map(srcs, attr):
artifact_label_map = {}
@@ -971,6 +970,7 @@ def _calculate_artifact_label_map(srcs, attr):
attr = attr,
)
return artifact_label_map
+
# Returns a list of (Artifact, Label) tuples. Each tuple represents an input source
# file and the label of the rule that generates it (or the label of the source file itself if it
# is an input file).
@@ -1216,7 +1216,8 @@ def _should_use_pic(ctx, cc_toolchain, feature_configuration):
cc_common.is_enabled(feature_configuration = feature_configuration, feature_name = "prefer_pic_for_opt_binaries")
)
)
-def _check_cpp20_module(ctx, feature_configuration):
+
+def _check_cpp20_modules(ctx, feature_configuration):
if len(ctx.files.module_interfaces) > 0 and not cc_common.is_enabled(
feature_configuration = feature_configuration,
feature_name = "cpp20_modules",
@@ -1290,5 +1291,5 @@ cc_helper = struct(
package_source_root = _package_source_root,
tokenize = _tokenize,
should_use_pic = _should_use_pic,
- check_cpp20_module = _check_cpp20_module,
+ check_cpp20_modules = _check_cpp20_modules,
)
diff --git a/src/main/starlark/builtins_bzl/common/cc/cc_library.bzl b/src/main/starlark/builtins_bzl/common/cc/cc_library.bzl
index 6769355168b972..d454e80bb53053 100755
--- a/src/main/starlark/builtins_bzl/common/cc/cc_library.bzl
+++ b/src/main/starlark/builtins_bzl/common/cc/cc_library.bzl
@@ -37,7 +37,8 @@ def _cc_library_impl(ctx):
unsupported_features = ctx.disabled_features,
)
- cc_helper.check_cpp20_module(ctx, feature_configuration)
+ semantics.check_can_module_interfaces(ctx)
+ cc_helper.check_cpp20_modules(ctx, feature_configuration)
precompiled_files = cc_helper.build_precompiled_files(ctx = ctx)
diff --git a/src/main/starlark/builtins_bzl/common/cc/semantics.bzl b/src/main/starlark/builtins_bzl/common/cc/semantics.bzl
index 20ec70f7f8e4d6..22b05e163f4a8e 100644
--- a/src/main/starlark/builtins_bzl/common/cc/semantics.bzl
+++ b/src/main/starlark/builtins_bzl/common/cc/semantics.bzl
@@ -117,6 +117,11 @@ def _check_can_use_implementation_deps(ctx):
if (not experimental_cc_implementation_deps and ctx.attr.implementation_deps):
fail("requires --experimental_cc_implementation_deps", attr = "implementation_deps")
+def _check_can_module_interfaces(ctx):
+ experimental_cpp20_modules = ctx.fragments.cpp.experimental_cpp20_modules()
+ if (not experimental_cpp20_modules and ctx.attr.module_interfaces):
+ fail("requires --experimental_cpp20_modules", attr = "module_interfaces")
+
_WINDOWS_PLATFORM = Label("@platforms//os:windows") # Resolve the label within builtins context
def _get_linkstatic_default_for_test():
@@ -161,6 +166,7 @@ semantics = struct(
get_grep_includes = _get_grep_includes,
get_implementation_deps_allowed_attr = _get_implementation_deps_allowed_attr,
check_can_use_implementation_deps = _check_can_use_implementation_deps,
+ check_can_module_interfaces = _check_can_module_interfaces,
get_linkstatic_default_for_test = _get_linkstatic_default_for_test,
get_runtimes_toolchain = _get_runtimes_toolchain,
get_test_malloc_attr = _get_test_malloc_attr,