diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationOutputs.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationOutputs.java index 16eb175e3c35d3..07e21ccf7d2ab0 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationOutputs.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationOutputs.java @@ -18,6 +18,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.collect.nestedset.Depset; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.starlarkbuildapi.cpp.CcCompilationOutputsApi; @@ -26,6 +27,7 @@ import net.starlark.java.eval.EvalException; import net.starlark.java.eval.Sequence; import net.starlark.java.eval.StarlarkList; +import net.starlark.java.eval.StarlarkThread; /** A structured representation of the compilation outputs of a C++ rule. */ public class CcCompilationOutputs implements CcCompilationOutputsApi { @@ -110,6 +112,25 @@ public Sequence getStarlarkPicObjects() throws EvalException { return StarlarkList.immutableCopyOf(getObjectFiles(/* usePic= */ true)); } + @Override + public Depset getStarlarkTemps(StarlarkThread thread) throws EvalException { + CcModule.checkPrivateStarlarkificationAllowlist(thread); + return Depset.of(Artifact.TYPE, getTemps()); + } + + @Override + public Depset getStarlarkFilesToCompile( + boolean parseHeaders, boolean usePic, StarlarkThread thread) throws EvalException { + CcModule.checkPrivateStarlarkificationAllowlist(thread); + return Depset.of(Artifact.TYPE, getFilesToCompile(parseHeaders, usePic)); + } + + @Override + public Sequence getStarlarkHeaderTokens(StarlarkThread thread) throws EvalException { + CcModule.checkPrivateStarlarkificationAllowlist(thread); + return StarlarkList.immutableCopyOf(getHeaderTokenFiles()); + } + /** Returns information about bitcode object files resulting from compilation. */ public LtoCompilationContext getLtoCompilationContext() { return ltoCompilationContext; diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcCompilationOutputsApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcCompilationOutputsApi.java index 7643a10fa58f02..690369a846d0ca 100644 --- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcCompilationOutputsApi.java +++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcCompilationOutputsApi.java @@ -15,11 +15,15 @@ package com.google.devtools.build.lib.starlarkbuildapi.cpp; import com.google.devtools.build.docgen.annot.DocCategory; +import com.google.devtools.build.lib.collect.nestedset.Depset; import com.google.devtools.build.lib.starlarkbuildapi.FileApi; +import net.starlark.java.annot.Param; +import net.starlark.java.annot.ParamType; import net.starlark.java.annot.StarlarkBuiltin; import net.starlark.java.annot.StarlarkMethod; import net.starlark.java.eval.EvalException; import net.starlark.java.eval.Sequence; +import net.starlark.java.eval.StarlarkThread; import net.starlark.java.eval.StarlarkValue; /** Interface for a structured representation of the compilation outputs of a C++ rule. */ @@ -42,4 +46,31 @@ public interface CcCompilationOutputsApi extends Starlark documented = true, structField = true) Sequence getStarlarkPicObjects() throws EvalException; + + @StarlarkMethod(name = "temps", documented = false, useStarlarkThread = true) + Depset getStarlarkTemps(StarlarkThread thread) throws EvalException; + + @StarlarkMethod( + name = "files_to_compile", + documented = false, + parameters = { + @Param( + name = "parse_headers", + positional = false, + named = true, + defaultValue = "False", + allowedTypes = {@ParamType(type = Boolean.class)}), + @Param( + name = "use_pic", + positional = false, + named = true, + defaultValue = "False", + allowedTypes = {@ParamType(type = Boolean.class)}), + }, + useStarlarkThread = true) + Depset getStarlarkFilesToCompile(boolean parseHeaders, boolean usePic, StarlarkThread thread) + throws EvalException; + + @StarlarkMethod(name = "header_tokens", documented = false, useStarlarkThread = true) + Sequence getStarlarkHeaderTokens(StarlarkThread thread) throws EvalException; } 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 d69dfb1cd0c336..3a5c49b9601b8f 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 @@ -6931,4 +6931,28 @@ public void testExpandedLinkApiRaisesError() throws Exception { assertThat(e).hasMessageThat().contains("Rule in 'b' cannot use private API"); } } + + @Test + public void testExpandedCcCompilationOutputsApiRaisesError() throws Exception { + scratch.file("b/BUILD", "load('//b:rule.bzl', 'cc_rule')", "cc_rule(", " name='foo',", ")"); + ImmutableList calls = + ImmutableList.of( + "comp_outputs.temps()", + "comp_outputs.files_to_compile(parse_headers=False, use_pic=True)", + "comp_outputs.header_tokens()"); + for (String call : calls) { + scratch.overwriteFile( + "b/rule.bzl", + "def _impl(ctx):", + " comp_outputs = cc_common.create_compilation_outputs()", + " " + call, + " return [DefaultInfo()]", + "cc_rule = rule(", + " implementation = _impl,", + ")"); + invalidatePackages(); + AssertionError e = assertThrows(AssertionError.class, () -> getConfiguredTarget("//b:foo")); + assertThat(e).hasMessageThat().contains("Rule in 'b' cannot use private API"); + } + } }