Add support for parse_header for apple rules
This change does the following:
- transitively propagate hidden header tokens output group in
objc compile rules.
- add hidder header tokens to validation group of apple_binary and
apple_static_library.
It does not yet add header tokens genereated by objc compile rules.
We want to first roll out parse_headers on apple for cc_library first,
before rolling it out for objc compile rules.
RELNOTES:
PiperOrigin-RevId: 324873088
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java
index 59267e9..b1dc981 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java
@@ -1085,7 +1085,7 @@
NestedSet<Artifact> headerTokens =
CcCompilationHelper.collectHeaderTokens(
- ruleContext, cppConfiguration, ccCompilationOutputs);
+ ruleContext, cppConfiguration, ccCompilationOutputs, /* addSelfTokens= */ true);
Map<String, NestedSet<Artifact>> outputGroups =
CcCompilationHelper.buildOutputGroupsForEmittingCompileProviders(
@@ -1094,7 +1094,9 @@
cppConfiguration,
toolchain,
featureConfiguration,
- ruleContext);
+ ruleContext,
+ /* generateHeaderTokensGroup= */ false,
+ /* addSelfHeaderTokens= */ false);
builder
.setFilesToBuild(filesToBuild)
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationHelper.java
index 8264e2a..420c392 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationHelper.java
@@ -762,7 +762,9 @@
CppConfiguration cppConfiguration,
CcToolchainProvider ccToolchain,
FeatureConfiguration featureConfiguration,
- RuleContext ruleContext) {
+ RuleContext ruleContext,
+ boolean generateHeaderTokensGroup,
+ boolean addSelfHeaderTokens) {
ImmutableMap.Builder<String, NestedSet<Artifact>> outputGroupsBuilder = ImmutableMap.builder();
outputGroupsBuilder.put(OutputGroupInfo.TEMP_FILES, ccCompilationOutputs.getTemps());
boolean processHeadersInDependencies = cppConfiguration.processHeadersInDependencies();
@@ -773,6 +775,15 @@
outputGroupsBuilder.put(
OutputGroupInfo.COMPILATION_PREREQUISITES,
CcCommon.collectCompilationPrerequisites(ruleContext, ccCompilationContext));
+ if (generateHeaderTokensGroup) {
+ outputGroupsBuilder.put(
+ CcCompilationHelper.HIDDEN_HEADER_TOKENS,
+ CcCompilationHelper.collectHeaderTokens(
+ ruleContext,
+ ruleContext.getFragment(CppConfiguration.class),
+ ccCompilationOutputs,
+ addSelfHeaderTokens));
+ }
outputGroupsBuilder.putAll(
CcCommon.createSaveFeatureStateArtifacts(
cppConfiguration, featureConfiguration, ruleContext));
@@ -1057,14 +1068,15 @@
public static NestedSet<Artifact> collectHeaderTokens(
RuleContext ruleContext,
CppConfiguration cppConfiguration,
- CcCompilationOutputs ccCompilationOutputs) {
+ CcCompilationOutputs ccCompilationOutputs,
+ boolean addSelfTokens) {
NestedSetBuilder<Artifact> headerTokens = NestedSetBuilder.stableOrder();
for (OutputGroupInfo dep :
ruleContext.getPrerequisites(
"deps", TransitionMode.TARGET, OutputGroupInfo.STARLARK_CONSTRUCTOR)) {
headerTokens.addTransitive(dep.getOutputGroup(CcCompilationHelper.HIDDEN_HEADER_TOKENS));
}
- if (cppConfiguration.processHeadersInDependencies()) {
+ if (addSelfTokens && cppConfiguration.processHeadersInDependencies()) {
headerTokens.addAll(ccCompilationOutputs.getHeaderTokenFiles());
}
return headerTokens.build();
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java
index 35ed3f8..372fb39 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java
@@ -463,7 +463,9 @@
ruleContext.getFragment(CppConfiguration.class),
ccToolchain,
featureConfiguration,
- ruleContext);
+ ruleContext,
+ /* generateHeaderTokensGroup= */ true,
+ /* addSelfHeaderTokens= */ true);
CcStarlarkApiProvider.maybeAdd(ruleContext, targetBuilder);
targetBuilder
.setFilesToBuild(filesToBuild)
@@ -483,13 +485,7 @@
.addOutputGroup(
OutputGroupInfo.HIDDEN_TOP_LEVEL,
collectHiddenTopLevelArtifacts(
- ruleContext, ccToolchain, ccCompilationOutputs, featureConfiguration))
- .addOutputGroup(
- CcCompilationHelper.HIDDEN_HEADER_TOKENS,
- CcCompilationHelper.collectHeaderTokens(
- ruleContext,
- ruleContext.getFragment(CppConfiguration.class),
- ccCompilationOutputs));
+ ruleContext, ccToolchain, ccCompilationOutputs, featureConfiguration));
maybeAddDeniedImplicitOutputsProvider(targetBuilder, ruleContext);
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinary.java
index 126cace..e518a65 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinary.java
@@ -29,6 +29,7 @@
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException;
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
+import com.google.devtools.build.lib.analysis.OutputGroupInfo;
import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder;
import com.google.devtools.build.lib.analysis.RuleConfiguredTargetFactory;
import com.google.devtools.build.lib.analysis.RuleContext;
@@ -44,6 +45,7 @@
import com.google.devtools.build.lib.rules.apple.AppleConfiguration;
import com.google.devtools.build.lib.rules.apple.ApplePlatform;
import com.google.devtools.build.lib.rules.apple.ApplePlatform.PlatformType;
+import com.google.devtools.build.lib.rules.cpp.CcCompilationHelper;
import com.google.devtools.build.lib.rules.cpp.CcToolchainProvider;
import com.google.devtools.build.lib.rules.objc.AppleDebugOutputsInfo.OutputType;
import com.google.devtools.build.lib.rules.objc.CompilationSupport.ExtraLinkArgs;
@@ -200,6 +202,17 @@
outputArtifact,
platform);
+ ImmutableListMultimap<BuildConfiguration, OutputGroupInfo> buildConfigToOutputGroupInfoMap =
+ ruleContext.getPrerequisitesByConfiguration(
+ "deps", TransitionMode.SPLIT, OutputGroupInfo.STARLARK_CONSTRUCTOR);
+ NestedSetBuilder<Artifact> headerTokens = NestedSetBuilder.stableOrder();
+ for (Map.Entry<BuildConfiguration, OutputGroupInfo> entry :
+ buildConfigToOutputGroupInfoMap.entries()) {
+ OutputGroupInfo dep = entry.getValue();
+ headerTokens.addTransitive(dep.getOutputGroup(CcCompilationHelper.HIDDEN_HEADER_TOKENS));
+ }
+ outputGroupCollector.put(OutputGroupInfo.VALIDATION, headerTokens.build());
+
ObjcProvider.Builder objcProviderBuilder =
new ObjcProvider.NativeBuilder(ruleContext.getAnalysisEnvironment().getStarlarkSemantics());
for (DependencySpecificConfiguration dependencySpecificConfiguration :
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStaticLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStaticLibrary.java
index a98cf51..dc3b075 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStaticLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStaticLibrary.java
@@ -25,6 +25,7 @@
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException;
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
+import com.google.devtools.build.lib.analysis.OutputGroupInfo;
import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder;
import com.google.devtools.build.lib.analysis.RuleConfiguredTargetFactory;
import com.google.devtools.build.lib.analysis.RuleContext;
@@ -34,6 +35,7 @@
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.rules.apple.AppleConfiguration;
import com.google.devtools.build.lib.rules.apple.ApplePlatform.PlatformType;
+import com.google.devtools.build.lib.rules.cpp.CcCompilationHelper;
import com.google.devtools.build.lib.rules.cpp.CcInfo;
import com.google.devtools.build.lib.rules.cpp.CcToolchainProvider;
import com.google.devtools.build.lib.rules.objc.ObjcProvider.Key;
@@ -179,6 +181,17 @@
addTransitivePropagatedKeys(objcProviderBuilder, objcProvider);
}
+ ImmutableListMultimap<BuildConfiguration, OutputGroupInfo> buildConfigToOutputGroupInfoMap =
+ ruleContext.getPrerequisitesByConfiguration(
+ "deps", TransitionMode.SPLIT, OutputGroupInfo.STARLARK_CONSTRUCTOR);
+ NestedSetBuilder<Artifact> headerTokens = NestedSetBuilder.stableOrder();
+ for (Map.Entry<BuildConfiguration, OutputGroupInfo> entry :
+ buildConfigToOutputGroupInfoMap.entries()) {
+ OutputGroupInfo dep = entry.getValue();
+ headerTokens.addTransitive(dep.getOutputGroup(CcCompilationHelper.HIDDEN_HEADER_TOKENS));
+ }
+ outputGroupCollector.put(OutputGroupInfo.VALIDATION, headerTokens.build());
+
AppleConfiguration appleConfiguration = ruleContext.getFragment(AppleConfiguration.class);
new LipoSupport(ruleContext)
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java
index b32f425..21c0a80 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java
@@ -492,7 +492,9 @@
cppConfiguration,
ccToolchain,
featureConfiguration,
- ruleContext);
+ ruleContext,
+ /* generateHeaderTokensGroup= */ true,
+ /* addSelfHeaderTokens= */ false);
Map<String, NestedSet<Artifact>> nonArcOutputGroups =
CcCompilationHelper.buildOutputGroupsForEmittingCompileProviders(
@@ -501,7 +503,9 @@
cppConfiguration,
ccToolchain,
featureConfiguration,
- ruleContext);
+ ruleContext,
+ /* generateHeaderTokensGroup= */ true,
+ /* addSelfHeaderTokens= */ false);
Map<String, NestedSet<Artifact>> mergedOutputGroups =
CcCommon.mergeOutputGroups(ImmutableList.of(arcOutputGroups, nonArcOutputGroups));
diff --git a/src/test/java/com/google/devtools/build/lib/rules/objc/AppleBinaryTest.java b/src/test/java/com/google/devtools/build/lib/rules/objc/AppleBinaryTest.java
index 39a87ef..e9f8da8 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/objc/AppleBinaryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/objc/AppleBinaryTest.java
@@ -26,7 +26,9 @@
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.actions.CommandAction;
import com.google.devtools.build.lib.actions.ExecutionRequirements;
+import com.google.devtools.build.lib.actions.util.ActionsTestUtil;
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
+import com.google.devtools.build.lib.analysis.OutputGroupInfo;
import com.google.devtools.build.lib.analysis.actions.SpawnAction;
import com.google.devtools.build.lib.analysis.actions.SymlinkAction;
import com.google.devtools.build.lib.analysis.config.CompilationMode;
@@ -39,6 +41,7 @@
import com.google.devtools.build.lib.packages.util.MockObjcSupport;
import com.google.devtools.build.lib.packages.util.MockProtoSupport;
import com.google.devtools.build.lib.rules.apple.AppleConfiguration.ConfigurationDistinguisher;
+import com.google.devtools.build.lib.rules.cpp.CppRuleClasses;
import com.google.devtools.build.lib.rules.objc.AppleBinary.BinaryType;
import com.google.devtools.build.lib.rules.objc.CompilationSupport.ExtraLinkArgs;
import com.google.devtools.build.lib.syntax.Dict;
@@ -1862,6 +1865,21 @@
.contains(execPathEndingWith(linkAction.getInputs().toList(), "some_linkstamp.o"));
}
+ @Test
+ public void testProcessHeadersInDependencies() throws Exception {
+ MockObjcSupport.setupCcToolchainConfig(
+ mockToolsConfig, MockObjcSupport.darwinX86_64().withFeatures(CppRuleClasses.PARSE_HEADERS));
+ useConfiguration("--features=parse_headers", "--process_headers_in_dependencies");
+ ConfiguredTarget x =
+ scratchConfiguredTarget(
+ "foo",
+ "x",
+ "apple_binary(name = 'x', platform_type = 'macos', deps = [':y'])",
+ "cc_library(name = 'y', hdrs = ['y.h'])");
+ String validation = ActionsTestUtil.baseNamesOf(getOutputGroup(x, OutputGroupInfo.VALIDATION));
+ assertThat(validation).contains("y.h.processed");
+ }
+
protected RuleType getRuleType() {
return RULE_TYPE;
}
diff --git a/src/test/java/com/google/devtools/build/lib/rules/objc/AppleStaticLibraryTest.java b/src/test/java/com/google/devtools/build/lib/rules/objc/AppleStaticLibraryTest.java
index a426b5d..2889aca 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/objc/AppleStaticLibraryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/objc/AppleStaticLibraryTest.java
@@ -25,11 +25,14 @@
import com.google.devtools.build.lib.actions.Action;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.actions.CommandAction;
+import com.google.devtools.build.lib.actions.util.ActionsTestUtil;
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
+import com.google.devtools.build.lib.analysis.OutputGroupInfo;
import com.google.devtools.build.lib.analysis.actions.SymlinkAction;
import com.google.devtools.build.lib.packages.util.MockObjcSupport;
import com.google.devtools.build.lib.packages.util.MockProtoSupport;
import com.google.devtools.build.lib.rules.apple.AppleConfiguration.ConfigurationDistinguisher;
+import com.google.devtools.build.lib.rules.cpp.CppRuleClasses;
import com.google.devtools.build.lib.testutil.Scratch;
import com.google.devtools.build.lib.testutil.TestConstants;
import java.io.IOException;
@@ -730,4 +733,19 @@
useConfiguration("--noenable_apple_binary_native_protos");
checkProtoBundlingDoesNotHappen(RULE_TYPE);
}
+
+ @Test
+ public void testProcessHeadersInDependencies() throws Exception {
+ MockObjcSupport.setupCcToolchainConfig(
+ mockToolsConfig, MockObjcSupport.darwinX86_64().withFeatures(CppRuleClasses.PARSE_HEADERS));
+ useConfiguration("--features=parse_headers", "--process_headers_in_dependencies");
+ ConfiguredTarget x =
+ scratchConfiguredTarget(
+ "foo",
+ "x",
+ "apple_static_library(name = 'x', platform_type = 'macos', deps = [':y'])",
+ "cc_library(name = 'y', hdrs = ['y.h'])");
+ String validation = ActionsTestUtil.baseNamesOf(getOutputGroup(x, OutputGroupInfo.VALIDATION));
+ assertThat(validation).contains("y.h.processed");
+ }
}