diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcModule.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcModule.java index ad62e2a0e2aa4a..4007d6d55deec7 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcModule.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcModule.java @@ -705,10 +705,14 @@ public CcCompilationContext createCcCompilationContext( Object textualHdrsNoneable, Object modularPublicHdrsNoneable, Object modularPrivateHdrsNoneable, + Object purposeNoneable, StarlarkThread thread) throws EvalException { if (checkObjectsBound( - textualHdrsNoneable, modularPrivateHdrsNoneable, modularPublicHdrsNoneable)) { + textualHdrsNoneable, + modularPrivateHdrsNoneable, + modularPublicHdrsNoneable, + purposeNoneable)) { checkPrivateStarlarkificationAllowlist(thread); } ImmutableList textualHdrs = asClassImmutableList(textualHdrsNoneable); @@ -745,6 +749,9 @@ public CcCompilationContext createCcCompilationContext( ccCompilationContext.addTextualHdrs(textualHdrs); ccCompilationContext.addModularPublicHdrs(modularPublicHdrs); ccCompilationContext.addModularPrivateHdrs(modularPrivateHdrs); + if (purposeNoneable != null && purposeNoneable != Starlark.UNBOUND) { + ccCompilationContext.setPurpose((String) purposeNoneable); + } return ccCompilationContext.build(); } diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcModuleApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcModuleApi.java index ba15e155c25f24..1e8a7d7d73fcd1 100644 --- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcModuleApi.java +++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcModuleApi.java @@ -856,6 +856,12 @@ CcInfoApi mergeCcInfos( positional = false, named = true, defaultValue = "unbound"), + @Param( + name = "purpose", + documented = false, + positional = false, + named = true, + defaultValue = "unbound"), }) CompilationContextT createCcCompilationContext( Object headers, @@ -868,6 +874,7 @@ CompilationContextT createCcCompilationContext( Object textualHdrs, Object modularPublicHdrs, Object modularPrivateHdrs, + Object purpose, StarlarkThread thread) throws EvalException; diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcModule.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcModule.java index 6c35e2e1197014..0420c1f018e20f 100644 --- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcModule.java +++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcModule.java @@ -223,6 +223,7 @@ public CcCompilationContextApi createCcCompilationContext( Object textualHdrs, Object modularPublicHdrs, Object modularPrivateHdrs, + Object purpose, StarlarkThread thread) throws EvalException { return null; diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/StarlarkCcCommonTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/StarlarkCcCommonTest.java index 3a5c49b9601b8f..640d6ddad771b7 100644 --- a/src/test/java/com/google/devtools/build/lib/rules/cpp/StarlarkCcCommonTest.java +++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/StarlarkCcCommonTest.java @@ -6863,9 +6863,12 @@ public void testExpandedCompileApiBlocked() throws Exception { public void testExpandedCcCompilationContextApiBlocked() throws Exception { scratch.file( "b/BUILD", - "load('//my_rules:rule.bzl', 'method_rule', 'param_rule')", - "param_rule(", - " name = 'p',", + "load('//my_rules:rule.bzl', 'method_rule', 'param_1_rule', 'param_2_rule')", + "param_1_rule(", + " name = 'p1',", + ")", + "param_2_rule(", + " name = 'p2',", ")", "method_rule(", " name = 'm',", @@ -6877,19 +6880,26 @@ public void testExpandedCcCompilationContextApiBlocked() throws Exception { " comp_context = cc_common.create_compilation_context()", " comp_context.transitive_compilation_prerequisites()", " return [CcInfo(compilation_context = comp_context)]", - "def _p_impl(ctx):", - " comp_context = cc_common.create_compilation_context()", + "def _p1_impl(ctx):", " comp_context = cc_common.create_compilation_context(textual_hdrs = ['dummy.h'])", " return [CcInfo(compilation_context = comp_context)]", + "def _p2_impl(ctx):", + " comp_context = cc_common.create_compilation_context(purpose = 'testing')", + " return [CcInfo(compilation_context = comp_context)]", "method_rule = rule(", " implementation = _m_impl,", ")", - "param_rule = rule(", - " implementation = _p_impl,", + "param_1_rule = rule(", + " implementation = _p1_impl,", + ")", + "param_2_rule = rule(", + " implementation = _p2_impl,", ")"); AssertionError e = assertThrows(AssertionError.class, () -> getConfiguredTarget("//b:m")); assertThat(e).hasMessageThat().contains("Rule in 'my_rules' cannot use private API"); - e = assertThrows(AssertionError.class, () -> getConfiguredTarget("//b:p")); + e = assertThrows(AssertionError.class, () -> getConfiguredTarget("//b:p1")); + assertThat(e).hasMessageThat().contains("Rule in 'my_rules' cannot use private API"); + e = assertThrows(AssertionError.class, () -> getConfiguredTarget("//b:p2")); assertThat(e).hasMessageThat().contains("Rule in 'my_rules' cannot use private API"); }