aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main
diff options
context:
space:
mode:
authorGravatar kaipi <kaipi@google.com>2017-04-12 15:20:51 +0000
committerGravatar Jakob Buchgraber <buchgr@google.com>2017-04-13 09:36:41 +0200
commitfc7296ff86b111d0e9c6cdc2d19b726d199a592c (patch)
tree66e4ea344dcd6a038d0ad93dc3e801f24109b773 /src/main
parent1f38a5a9e3b2e1daeb11423b41524044bbaf4f99 (diff)
Fix ProtobufSupport.java to use the build configuration when being called from an apple_binary split transition context. Refactors ProtobufSupport to not rely on ruleContext for dependencies.
PiperOrigin-RevId: 152939984
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/AppleStaticLibrary.java13
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/BinaryLinkingTargetFactory.java95
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/IosTest.java67
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/MultiArchBinarySupport.java11
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoLibrary.java13
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ProtobufSupport.java67
6 files changed, 160 insertions, 106 deletions
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 70f0c7648f..062f67229b 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
@@ -30,6 +30,7 @@ import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
+import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException;
import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory;
import com.google.devtools.build.lib.rules.apple.AppleConfiguration;
import com.google.devtools.build.lib.rules.apple.Platform.PlatformType;
@@ -37,7 +38,7 @@ import com.google.devtools.build.lib.rules.cpp.CcLinkParamsProvider;
import com.google.devtools.build.lib.rules.cpp.CcToolchainProvider;
import com.google.devtools.build.lib.rules.objc.ObjcCommon.ResourceAttributes;
import com.google.devtools.build.lib.rules.objc.ObjcProvider.Key;
-
+import com.google.devtools.build.lib.rules.proto.ProtoSourcesProvider;
import java.util.List;
import java.util.Set;
@@ -99,9 +100,17 @@ public class AppleStaticLibrary implements RuleConfiguredTargetFactory {
ObjcProvider.Builder objcProviderBuilder = new ObjcProvider.Builder();
+ ImmutableListMultimap<BuildConfiguration, ObjcProtoProvider> objcProtoProvidersMap =
+ ruleContext.getPrerequisitesByConfiguration("deps", Mode.SPLIT, ObjcProtoProvider.class);
+
for (BuildConfiguration childConfig : childConfigurations) {
ProtobufSupport protoSupport =
- new ProtobufSupport(ruleContext, childConfig, protosToAvoid)
+ new ProtobufSupport(
+ ruleContext,
+ childConfig,
+ protosToAvoid,
+ ImmutableList.<ProtoSourcesProvider>of(),
+ objcProtoProvidersMap.get(childConfig))
.registerGenerationActions()
.registerCompilationActions();
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/BinaryLinkingTargetFactory.java b/src/main/java/com/google/devtools/build/lib/rules/objc/BinaryLinkingTargetFactory.java
index f275290f0f..9ac64e3940 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/BinaryLinkingTargetFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/BinaryLinkingTargetFactory.java
@@ -28,6 +28,7 @@ import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder;
import com.google.devtools.build.lib.analysis.RuleContext;
import com.google.devtools.build.lib.analysis.RunfilesSupport;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
+import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException;
import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory;
import com.google.devtools.build.lib.rules.apple.AppleConfiguration;
import com.google.devtools.build.lib.rules.apple.Platform;
@@ -35,6 +36,7 @@ import com.google.devtools.build.lib.rules.apple.Platform.PlatformType;
import com.google.devtools.build.lib.rules.objc.CompilationSupport.ExtraLinkArgs;
import com.google.devtools.build.lib.rules.objc.ObjcCommon.ResourceAttributes;
import com.google.devtools.build.lib.rules.objc.ReleaseBundlingSupport.LinkedBinary;
+import com.google.devtools.build.lib.rules.proto.ProtoSourcesProvider;
import com.google.devtools.build.lib.rules.test.InstrumentedFilesProvider;
/**
@@ -50,22 +52,22 @@ abstract class BinaryLinkingTargetFactory implements RuleConfiguredTargetFactory
* infoplist} attribute to be read and a bundle to be added to the files-to-build.
*/
enum HasReleaseBundlingSupport {
- YES, NO;
+ YES,
+ NO;
}
private final HasReleaseBundlingSupport hasReleaseBundlingSupport;
private final XcodeProductType productType;
protected BinaryLinkingTargetFactory(
- HasReleaseBundlingSupport hasReleaseBundlingSupport,
- XcodeProductType productType) {
+ HasReleaseBundlingSupport hasReleaseBundlingSupport, XcodeProductType productType) {
this.hasReleaseBundlingSupport = hasReleaseBundlingSupport;
this.productType = productType;
}
/**
- * Returns extra linker arguments. Default implementation returns empty list.
- * Subclasses can override and customize.
+ * Returns extra linker arguments. Default implementation returns empty list. Subclasses can
+ * override and customize.
*/
protected ExtraLinkArgs getExtraLinkArgs(RuleContext ruleContext) {
return new ExtraLinkArgs();
@@ -82,8 +84,17 @@ abstract class BinaryLinkingTargetFactory implements RuleConfiguredTargetFactory
"This rule is deprecated. Please use the new Apple build rules "
+ "(https://github.com/bazelbuild/rules_apple) to build Apple targets.");
+ Iterable<ObjcProtoProvider> objcProtoProviders =
+ ruleContext.getPrerequisites("deps", Mode.TARGET, ObjcProtoProvider.class);
+
ProtobufSupport protoSupport =
- new ProtobufSupport(ruleContext).registerGenerationActions().registerCompilationActions();
+ new ProtobufSupport(
+ ruleContext,
+ ruleContext.getConfiguration(),
+ ImmutableList.<ProtoSourcesProvider>of(),
+ objcProtoProviders)
+ .registerGenerationActions()
+ .registerCompilationActions();
Optional<ObjcProvider> protosObjcProvider = protoSupport.getObjcProvider();
Optional<XcodeProvider> protosXcodeProvider = protoSupport.getXcodeProvider();
@@ -103,34 +114,35 @@ abstract class BinaryLinkingTargetFactory implements RuleConfiguredTargetFactory
NestedSetBuilder.<Artifact>stableOrder()
.add(intermediateArtifacts.strippedSingleArchitectureBinary());
- new ResourceSupport(ruleContext)
- .validateAttributes()
- .addXcodeSettings(xcodeProviderBuilder);
+ new ResourceSupport(ruleContext).validateAttributes().addXcodeSettings(xcodeProviderBuilder);
ruleContext.assertNoErrors();
- J2ObjcMappingFileProvider j2ObjcMappingFileProvider = J2ObjcMappingFileProvider.union(
- ruleContext.getPrerequisites("deps", Mode.TARGET, J2ObjcMappingFileProvider.class));
- J2ObjcEntryClassProvider j2ObjcEntryClassProvider = new J2ObjcEntryClassProvider.Builder()
- .addTransitive(
- ruleContext.getPrerequisites("deps", Mode.TARGET, J2ObjcEntryClassProvider.class))
- .build();
-
- CompilationSupport compilationSupport = CompilationSupport.create(ruleContext)
- .validateAttributes()
- .addXcodeSettings(xcodeProviderBuilder, common)
- .registerCompileAndArchiveActions(common)
- .registerFullyLinkAction(
- common.getObjcProvider(),
- ruleContext.getImplicitOutputArtifact(CompilationSupport.FULLY_LINKED_LIB))
- .registerLinkActions(
- objcProvider,
- j2ObjcMappingFileProvider,
- j2ObjcEntryClassProvider,
- getExtraLinkArgs(ruleContext),
- ImmutableList.<Artifact>of(),
- DsymOutputType.APP);
-
+ J2ObjcMappingFileProvider j2ObjcMappingFileProvider =
+ J2ObjcMappingFileProvider.union(
+ ruleContext.getPrerequisites("deps", Mode.TARGET, J2ObjcMappingFileProvider.class));
+ J2ObjcEntryClassProvider j2ObjcEntryClassProvider =
+ new J2ObjcEntryClassProvider.Builder()
+ .addTransitive(
+ ruleContext.getPrerequisites("deps", Mode.TARGET, J2ObjcEntryClassProvider.class))
+ .build();
+
+ CompilationSupport compilationSupport =
+ CompilationSupport.create(ruleContext)
+ .validateAttributes()
+ .addXcodeSettings(xcodeProviderBuilder, common)
+ .registerCompileAndArchiveActions(common)
+ .registerFullyLinkAction(
+ common.getObjcProvider(),
+ ruleContext.getImplicitOutputArtifact(CompilationSupport.FULLY_LINKED_LIB))
+ .registerLinkActions(
+ objcProvider,
+ j2ObjcMappingFileProvider,
+ j2ObjcEntryClassProvider,
+ getExtraLinkArgs(ruleContext),
+ ImmutableList.<Artifact>of(),
+ DsymOutputType.APP);
+
Optional<XcTestAppProvider> xcTestAppProvider;
Optional<RunfilesSupport> maybeRunfilesSupport = Optional.absent();
switch (hasReleaseBundlingSupport) {
@@ -167,18 +179,19 @@ abstract class BinaryLinkingTargetFactory implements RuleConfiguredTargetFactory
throw new AssertionError();
}
- XcodeSupport xcodeSupport = new XcodeSupport(ruleContext)
- // TODO(bazel-team): Use LIBRARY_STATIC as parameter instead of APPLICATION once objc_binary
- // no longer creates an application bundle
- .addXcodeSettings(xcodeProviderBuilder, objcProvider, productType)
- .addDependencies(xcodeProviderBuilder, new Attribute("bundles", Mode.TARGET))
- .addDependencies(xcodeProviderBuilder, new Attribute("deps", Mode.TARGET))
- .addNonPropagatedDependencies(
- xcodeProviderBuilder, new Attribute("non_propagated_deps", Mode.TARGET))
- .addFilesToBuild(filesToBuild);
+ XcodeSupport xcodeSupport =
+ new XcodeSupport(ruleContext)
+ // TODO(bazel-team): Use LIBRARY_STATIC as parameter instead of APPLICATION once
+ // objc_binary no longer creates an application bundle.
+ .addXcodeSettings(xcodeProviderBuilder, objcProvider, productType)
+ .addDependencies(xcodeProviderBuilder, new Attribute("bundles", Mode.TARGET))
+ .addDependencies(xcodeProviderBuilder, new Attribute("deps", Mode.TARGET))
+ .addNonPropagatedDependencies(
+ xcodeProviderBuilder, new Attribute("non_propagated_deps", Mode.TARGET))
+ .addFilesToBuild(filesToBuild);
if (productType != XcodeProductType.LIBRARY_STATIC) {
- xcodeSupport.generateCompanionLibXcodeTarget(xcodeProviderBuilder);
+ xcodeSupport.generateCompanionLibXcodeTarget(xcodeProviderBuilder);
}
XcodeProvider xcodeProvider = xcodeProviderBuilder.build();
xcodeSupport.registerActions(xcodeProvider);
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/IosTest.java b/src/main/java/com/google/devtools/build/lib/rules/objc/IosTest.java
index f104dc72b9..f3e6fd87f7 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/IosTest.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/IosTest.java
@@ -32,19 +32,19 @@ import com.google.devtools.build.lib.analysis.RunfilesSupport;
import com.google.devtools.build.lib.analysis.actions.ExecutionRequirements;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
+import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException;
import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory;
import com.google.devtools.build.lib.rules.apple.AppleConfiguration;
import com.google.devtools.build.lib.rules.apple.Platform.PlatformType;
import com.google.devtools.build.lib.rules.objc.CompilationSupport.ExtraLinkArgs;
import com.google.devtools.build.lib.rules.objc.ObjcCommon.ResourceAttributes;
import com.google.devtools.build.lib.rules.objc.ReleaseBundlingSupport.LinkedBinary;
+import com.google.devtools.build.lib.rules.proto.ProtoSourcesProvider;
import com.google.devtools.build.lib.rules.test.ExecutionInfoProvider;
import com.google.devtools.build.lib.rules.test.InstrumentedFilesProvider;
import com.google.devtools.build.lib.syntax.Type;
-/**
- * Implementation for {@code ios_test} rule in Bazel.
- */
+/** Implementation for {@code ios_test} rule in Bazel. */
public final class IosTest implements RuleConfiguredTargetFactory {
private static final ImmutableList<SdkFramework> AUTOMATIC_SDK_FRAMEWORKS_FOR_XCTEST =
@@ -68,6 +68,7 @@ public final class IosTest implements RuleConfiguredTargetFactory {
@VisibleForTesting
public static final String REQUIRES_SOURCE_ERROR =
"ios_test requires at least one source file in srcs or non_arc_srcs";
+
@VisibleForTesting
public static final String NO_MULTI_CPUS_ERROR =
"ios_test cannot be built for multiple CPUs at the same time";
@@ -75,17 +76,27 @@ public final class IosTest implements RuleConfiguredTargetFactory {
/**
* {@inheritDoc}
*
- * Creates a target, including registering actions, just as {@link #create(RuleContext)} does.
+ * <p>Creates a target, including registering actions, just as {@link #create(RuleContext)} does.
* The difference between {@link #create(RuleContext)} and this method is that this method does
- * only what is needed to support tests on the environment besides generate the Xcodeproj file
- * and build the app and test {@code .ipa}s. The {@link #create(RuleContext)} method delegates
- * to this method.
+ * only what is needed to support tests on the environment besides generate the Xcodeproj file and
+ * build the app and test {@code .ipa}s. The {@link #create(RuleContext)} method delegates to this
+ * method.
*/
@Override
public final ConfiguredTarget create(RuleContext ruleContext)
throws InterruptedException, RuleErrorException {
+
+ Iterable<ObjcProtoProvider> objcProtoProviders =
+ ruleContext.getPrerequisites("deps", Mode.TARGET, ObjcProtoProvider.class);
+
ProtobufSupport protoSupport =
- new ProtobufSupport(ruleContext).registerGenerationActions().registerCompilationActions();
+ new ProtobufSupport(
+ ruleContext,
+ ruleContext.getConfiguration(),
+ ImmutableList.<ProtoSourcesProvider>of(),
+ objcProtoProviders)
+ .registerGenerationActions()
+ .registerCompilationActions();
Optional<ObjcProvider> protosObjcProvider = protoSupport.getObjcProvider();
Optional<XcodeProvider> protosXcodeProvider = protoSupport.getXcodeProvider();
@@ -132,10 +143,15 @@ public final class IosTest implements RuleConfiguredTargetFactory {
// missing symbols.
// -rpath @loader_path/Frameworks allows test bundles to load dylibs from the app's
// Frameworks directory.
- extraLinkArgs = new ExtraLinkArgs(
- "-bundle",
- "-bundle_loader", bundleLoader.getExecPathString(),
- "-Xlinker", "-rpath", "-Xlinker", "@loader_path/Frameworks");
+ extraLinkArgs =
+ new ExtraLinkArgs(
+ "-bundle",
+ "-bundle_loader",
+ bundleLoader.getExecPathString(),
+ "-Xlinker",
+ "-rpath",
+ "-Xlinker",
+ "@loader_path/Frameworks");
extraLinkInputs = ImmutableList.of(bundleLoader);
bundleFormat = ReleaseBundlingSupport.XCTEST_BUNDLE_DIR_FORMAT;
@@ -143,12 +159,14 @@ public final class IosTest implements RuleConfiguredTargetFactory {
filesToBuild.add(testApp.getIpa());
}
- J2ObjcMappingFileProvider j2ObjcMappingFileProvider = J2ObjcMappingFileProvider.union(
- ruleContext.getPrerequisites("deps", Mode.TARGET, J2ObjcMappingFileProvider.class));
- J2ObjcEntryClassProvider j2ObjcEntryClassProvider = new J2ObjcEntryClassProvider.Builder()
- .addTransitive(
- ruleContext.getPrerequisites("deps", Mode.TARGET, J2ObjcEntryClassProvider.class))
- .build();
+ J2ObjcMappingFileProvider j2ObjcMappingFileProvider =
+ J2ObjcMappingFileProvider.union(
+ ruleContext.getPrerequisites("deps", Mode.TARGET, J2ObjcMappingFileProvider.class));
+ J2ObjcEntryClassProvider j2ObjcEntryClassProvider =
+ new J2ObjcEntryClassProvider.Builder()
+ .addTransitive(
+ ruleContext.getPrerequisites("deps", Mode.TARGET, J2ObjcEntryClassProvider.class))
+ .build();
CompilationSupport.create(ruleContext)
.registerLinkActions(
@@ -159,7 +177,8 @@ public final class IosTest implements RuleConfiguredTargetFactory {
extraLinkInputs,
DsymOutputType.TEST)
.registerCompileAndArchiveActions(common)
- .registerFullyLinkAction(common.getObjcProvider(),
+ .registerFullyLinkAction(
+ common.getObjcProvider(),
ruleContext.getImplicitOutputArtifact(CompilationSupport.FULLY_LINKED_LIB))
.addXcodeSettings(xcodeProviderBuilder, common)
.validateAttributes();
@@ -192,10 +211,11 @@ public final class IosTest implements RuleConfiguredTargetFactory {
XcodeProvider xcodeProvider = xcodeProviderBuilder.build();
NestedSet<Artifact> filesToBuildSet = filesToBuild.build();
- Runfiles.Builder runfilesBuilder = new Runfiles.Builder(
- ruleContext.getWorkspaceName(),
- ruleContext.getConfiguration().legacyExternalRunfiles())
- .addRunfiles(ruleContext, RunfilesProvider.DEFAULT_RUNFILES);
+ Runfiles.Builder runfilesBuilder =
+ new Runfiles.Builder(
+ ruleContext.getWorkspaceName(),
+ ruleContext.getConfiguration().legacyExternalRunfiles())
+ .addRunfiles(ruleContext, RunfilesProvider.DEFAULT_RUNFILES);
NestedSetBuilder<Artifact> filesToBuildBuilder =
NestedSetBuilder.<Artifact>stableOrder().addTransitive(filesToBuildSet);
@@ -301,5 +321,4 @@ public final class IosTest implements RuleConfiguredTargetFactory {
protected static XcTestAppProvider xcTestAppProvider(RuleContext ruleContext) {
return ruleContext.getPrerequisite(XCTEST_APP_ATTR, Mode.TARGET, XcTestAppProvider.class);
}
-
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/MultiArchBinarySupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/MultiArchBinarySupport.java
index 018a5dd1c5..5fb7a8aaf3 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/MultiArchBinarySupport.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/MultiArchBinarySupport.java
@@ -33,6 +33,7 @@ import com.google.devtools.build.lib.rules.cpp.CcLinkParamsProvider;
import com.google.devtools.build.lib.rules.cpp.CcToolchainProvider;
import com.google.devtools.build.lib.rules.objc.CompilationSupport.ExtraLinkArgs;
import com.google.devtools.build.lib.rules.objc.ObjcCommon.ResourceAttributes;
+import com.google.devtools.build.lib.rules.proto.ProtoSourcesProvider;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -178,11 +179,19 @@ public class MultiArchBinarySupport {
NestedSet<Artifact> protosToAvoid = protoArtifactsToAvoid(dylibProtoProviders);
ImmutableSet.Builder<DependencySpecificConfiguration> childInfoBuilder = ImmutableSet.builder();
+ ImmutableListMultimap<BuildConfiguration, ObjcProtoProvider> objcProtoProvidersMap =
+ ruleContext.getPrerequisitesByConfiguration("deps", Mode.SPLIT, ObjcProtoProvider.class);
+
for (BuildConfiguration childConfig : childConfigurationsAndToolchains.keySet()) {
Optional<ObjcProvider> protosObjcProvider;
if (ObjcRuleClasses.objcConfiguration(ruleContext).enableAppleBinaryNativeProtos()) {
ProtobufSupport protoSupport =
- new ProtobufSupport(ruleContext, childConfig, protosToAvoid)
+ new ProtobufSupport(
+ ruleContext,
+ childConfig,
+ protosToAvoid,
+ ImmutableList.<ProtoSourcesProvider>of(),
+ objcProtoProvidersMap.get(childConfig))
.registerGenerationActions()
.registerCompilationActions();
protosObjcProvider = protoSupport.getObjcProvider();
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoLibrary.java
index 54d004403d..031a5a1b3a 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoLibrary.java
@@ -18,10 +18,12 @@ package com.google.devtools.build.lib.rules.objc;
import com.google.common.base.Optional;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
+import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode;
import com.google.devtools.build.lib.analysis.RuleContext;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException;
import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory;
+import com.google.devtools.build.lib.rules.proto.ProtoSourcesProvider;
/**
* Implementation for the "objc_proto_library" rule.
@@ -45,8 +47,17 @@ public class ObjcProtoLibrary implements RuleConfiguredTargetFactory {
throws InterruptedException, RuleErrorException {
NestedSetBuilder<Artifact> filesToBuild = NestedSetBuilder.stableOrder();
+ Iterable<ProtoSourcesProvider> protoProviders =
+ ruleContext.getPrerequisites("deps", Mode.TARGET, ProtoSourcesProvider.class);
+
+ Iterable<ObjcProtoProvider> objcProtoProviders =
+ ruleContext.getPrerequisites("deps", Mode.TARGET, ObjcProtoProvider.class);
+
ProtobufSupport protoSupport =
- new ProtobufSupport(ruleContext).registerGenerationActions().addFilesToBuild(filesToBuild);
+ new ProtobufSupport(
+ ruleContext, ruleContext.getConfiguration(), protoProviders, objcProtoProviders)
+ .registerGenerationActions()
+ .addFilesToBuild(filesToBuild);
Optional<XcodeProvider> xcodeProvider = protoSupport.getXcodeProvider();
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ProtobufSupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ProtobufSupport.java
index 422c07999f..53c0f7892b 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ProtobufSupport.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ProtobufSupport.java
@@ -71,6 +71,7 @@ final class ProtobufSupport {
private final ProtoAttributes attributes;
private final IntermediateArtifacts intermediateArtifacts;
private final Set<Artifact> dylibHandledProtos;
+ private final Iterable<ObjcProtoProvider> objcProtoProviders;
// Each entry of this map represents a generation action and a compilation action. The input set
// are dependencies of the output set. The output set is always a subset of, or the same set as,
@@ -95,23 +96,22 @@ final class ProtobufSupport {
* really needed to the actions.
*
* @param ruleContext context this proto library is constructed in
- */
- public ProtobufSupport(RuleContext ruleContext) {
- this(ruleContext, ruleContext.getConfiguration());
- }
-
- /**
- * Creates a new proto support for the protobuf library. This support code bundles up all the
- * transitive protos within the groups in which they were defined. We use that information to
- * minimize the number of inputs per generation/compilation actions by only providing what is
- * really needed to the actions.
- *
- * @param ruleContext context this proto library is constructed in
* @param buildConfiguration the configuration from which to get prerequisites when building proto
* targets in a split configuration
+ * @param protoProviders the list of ProtoSourcesProviders that this proto support should process
+ * @param objcProtoProviders the list of ObjcProtoProviders that this proto support should process
*/
- public ProtobufSupport(RuleContext ruleContext, BuildConfiguration buildConfiguration) {
- this(ruleContext, buildConfiguration, NestedSetBuilder.<Artifact>stableOrder().build());
+ public ProtobufSupport(
+ RuleContext ruleContext,
+ BuildConfiguration buildConfiguration,
+ Iterable<ProtoSourcesProvider> protoProviders,
+ Iterable<ObjcProtoProvider> objcProtoProviders) {
+ this(
+ ruleContext,
+ buildConfiguration,
+ NestedSetBuilder.<Artifact>stableOrder().build(),
+ protoProviders,
+ objcProtoProviders);
}
/**
@@ -123,19 +123,26 @@ final class ProtobufSupport {
* @param ruleContext context this proto library is constructed in
* @param buildConfiguration the configuration from which to get prerequisites when building proto
* targets in a split configuration
- * @param dylibHandledProtos a set of protos linked into dynamic libraries that the current
- * rule depends on; these protos will not be output by this support, thus avoiding duplicate
+ * @param dylibHandledProtos a set of protos linked into dynamic libraries that the current rule
+ * depends on; these protos will not be output by this support, thus avoiding duplicate
* symbols
+ * @param protoProviders the list of ProtoSourcesProviders that this proto support should process
+ * @param objcProtoProviders the list of ObjcProtoProviders that this proto support should process
*/
- public ProtobufSupport(RuleContext ruleContext, BuildConfiguration buildConfiguration,
- NestedSet<Artifact> dylibHandledProtos) {
+ public ProtobufSupport(
+ RuleContext ruleContext,
+ BuildConfiguration buildConfiguration,
+ NestedSet<Artifact> dylibHandledProtos,
+ Iterable<ProtoSourcesProvider> protoProviders,
+ Iterable<ObjcProtoProvider> objcProtoProviders) {
this.ruleContext = ruleContext;
this.buildConfiguration = buildConfiguration;
this.attributes = new ProtoAttributes(ruleContext);
- this.inputsToOutputsMap = getInputsToOutputsMap();
this.dylibHandledProtos = dylibHandledProtos.toSet();
+ this.objcProtoProviders = objcProtoProviders;
this.intermediateArtifacts =
ObjcRuleClasses.intermediateArtifacts(ruleContext, buildConfiguration);
+ this.inputsToOutputsMap = getInputsToOutputsMap(attributes, protoProviders, objcProtoProviders);
}
/**
@@ -306,8 +313,6 @@ final class ProtobufSupport {
}
private NestedSet<Artifact> getPortableProtoFilters() {
- Iterable<ObjcProtoProvider> objcProtoProviders = getObjcProtoProviders();
-
NestedSetBuilder<Artifact> portableProtoFilters = NestedSetBuilder.stableOrder();
for (ObjcProtoProvider objcProtoProvider : objcProtoProviders) {
portableProtoFilters.addTransitive(objcProtoProvider.getPortableProtoFilters());
@@ -317,8 +322,6 @@ final class ProtobufSupport {
}
private NestedSet<Artifact> getProtobufHeaders() {
- Iterable<ObjcProtoProvider> objcProtoProviders = getObjcProtoProviders();
-
NestedSetBuilder<Artifact> protobufHeaders = NestedSetBuilder.stableOrder();
for (ObjcProtoProvider objcProtoProvider : objcProtoProviders) {
protobufHeaders.addTransitive(objcProtoProvider.getProtobufHeaders());
@@ -327,8 +330,6 @@ final class ProtobufSupport {
}
private NestedSet<PathFragment> getProtobufHeaderSearchPaths() {
- Iterable<ObjcProtoProvider> objcProtoProviders = getObjcProtoProviders();
-
NestedSetBuilder<PathFragment> protobufHeaderSearchPaths = NestedSetBuilder.stableOrder();
for (ObjcProtoProvider objcProtoProvider : objcProtoProviders) {
protobufHeaderSearchPaths.addTransitive(objcProtoProvider.getProtobufHeaderSearchPaths());
@@ -336,10 +337,10 @@ final class ProtobufSupport {
return protobufHeaderSearchPaths.build();
}
- private ImmutableSetMultimap<ImmutableSet<Artifact>, Artifact> getInputsToOutputsMap() {
- Iterable<ObjcProtoProvider> objcProtoProviders = getObjcProtoProviders();
- Iterable<ProtoSourcesProvider> protoProviders = getProtoSourcesProviders();
-
+ private static ImmutableSetMultimap<ImmutableSet<Artifact>, Artifact> getInputsToOutputsMap(
+ ProtoAttributes attributes,
+ Iterable<ProtoSourcesProvider> protoProviders,
+ Iterable<ObjcProtoProvider> objcProtoProviders) {
ImmutableList.Builder<NestedSet<Artifact>> protoSets =
new ImmutableList.Builder<NestedSet<Artifact>>();
@@ -579,14 +580,6 @@ final class ProtobufSupport {
return builder.build();
}
- private Iterable<ObjcProtoProvider> getObjcProtoProviders() {
- return ruleContext.getPrerequisites("deps", Mode.TARGET, ObjcProtoProvider.class);
- }
-
- private Iterable<ProtoSourcesProvider> getProtoSourcesProviders() {
- return ruleContext.getPrerequisites("deps", Mode.TARGET, ProtoSourcesProvider.class);
- }
-
private boolean isLinkingTarget() {
return !ruleContext
.attributes()