diff options
author | 2017-04-12 15:20:51 +0000 | |
---|---|---|
committer | 2017-04-13 09:36:41 +0200 | |
commit | fc7296ff86b111d0e9c6cdc2d19b726d199a592c (patch) | |
tree | 66e4ea344dcd6a038d0ad93dc3e801f24109b773 /src/main | |
parent | 1f38a5a9e3b2e1daeb11423b41524044bbaf4f99 (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')
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() |