From c0c74cd265dc22946df7c0170cd67d7729d20f0d Mon Sep 17 00:00:00 2001 From: Chris Parsons Date: Thu, 5 May 2016 23:01:28 +0000 Subject: apple_binary builds without implicit requirement of cc-relevant flags. Notable changes: - Obtain J2Objc providers from deps attribute of the current rule, even if "deps" is not Mode.TARGET. It is up to the rule implementation to correctly obtain and propagate these providers. - "srcs" on apple_binary no longer has a split transition. These are files, not labels. -- MOS_MIGRATED_REVID=121625691 --- .../devtools/build/lib/rules/objc/AppleBinary.java | 40 +++++++------- .../build/lib/rules/objc/AppleBinaryRule.java | 21 ++------ .../lib/rules/objc/BinaryLinkingTargetFactory.java | 16 +++--- .../build/lib/rules/objc/CompilationSupport.java | 30 +++++++---- .../devtools/build/lib/rules/objc/IosTest.java | 10 +++- .../lib/rules/objc/J2ObjcEntryClassProvider.java | 30 ++++++----- .../build/lib/rules/objc/J2ObjcLibrary.java | 6 ++- .../lib/rules/objc/J2ObjcMappingFileProvider.java | 14 +++++ .../devtools/build/lib/rules/objc/ObjcCommon.java | 62 ++++++++++++---------- .../devtools/build/lib/rules/objc/ObjcLibrary.java | 18 +++---- .../build/lib/rules/objc/ObjcRuleClasses.java | 20 ------- 11 files changed, 140 insertions(+), 127 deletions(-) (limited to 'src/main') 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 9928c4a821..3971a3572f 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 @@ -32,7 +32,6 @@ import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; import com.google.devtools.build.lib.rules.apple.AppleConfiguration; import com.google.devtools.build.lib.rules.cpp.CcToolchainProvider; -import com.google.devtools.build.lib.rules.cpp.CppCompilationContext; import com.google.devtools.build.lib.rules.objc.CompilationSupport.ExtraLinkArgs; import com.google.devtools.build.lib.rules.objc.ObjcCommon.CompilationAttributes; import com.google.devtools.build.lib.rules.objc.ObjcCommon.ResourceAttributes; @@ -74,6 +73,23 @@ public class AppleBinary implements RuleConfiguredTargetFactory { nullToEmptyList(configToDepsCollectionMap.get(childConfig)), nullToEmptyList(configurationToNonPropagatedObjcMap.get(childConfig))); ObjcProvider objcProvider = common.getObjcProvider(); + ImmutableList.Builder j2ObjcMappingFileProviders = + ImmutableList.builder(); + J2ObjcEntryClassProvider.Builder j2ObjcEntryClassProviderBuilder = + new J2ObjcEntryClassProvider.Builder(); + for (TransitiveInfoCollection dep : configToDepsCollectionMap.get(childConfig)) { + if (dep.getProvider(J2ObjcMappingFileProvider.class) != null) { + j2ObjcMappingFileProviders.add(dep.getProvider(J2ObjcMappingFileProvider.class)); + } + if (dep.getProvider(J2ObjcEntryClassProvider.class) != null) { + j2ObjcEntryClassProviderBuilder.addTransitive( + dep.getProvider(J2ObjcEntryClassProvider.class)); + } + } + J2ObjcMappingFileProvider j2ObjcMappingFileProvider = + J2ObjcMappingFileProvider.union(j2ObjcMappingFileProviders.build()); + J2ObjcEntryClassProvider j2ObjcEntryClassProvider = j2ObjcEntryClassProviderBuilder.build(); + if (!hasLibraryOrSources(objcProvider)) { ruleContext.ruleError(REQUIRES_AT_LEAST_ONE_LIBRARY_OR_SOURCE_FILE); return null; @@ -81,11 +97,13 @@ public class AppleBinary implements RuleConfiguredTargetFactory { if (ruleContext.hasErrors()) { return null; } + binariesToLipo.add(intermediateArtifacts.strippedSingleArchitectureBinary()); new CompilationSupport(ruleContext, childConfig) .registerCompileAndArchiveActions(common) .registerLinkActions( - objcProvider, new ExtraLinkArgs(), ImmutableList.of(), + common.getObjcProvider(), j2ObjcMappingFileProvider, j2ObjcEntryClassProvider, + new ExtraLinkArgs(), ImmutableList.of(), DsymOutputType.APP) .validateAttributes(); @@ -116,18 +134,6 @@ public class AppleBinary implements RuleConfiguredTargetFactory { IntermediateArtifacts intermediateArtifacts, List propagatedDeps, List nonPropagatedObjcDeps) { - ImmutableList.Builder propagatedObjcDeps = ImmutableList.builder(); - ImmutableList.Builder cppDeps = - ImmutableList.builder(); - - for (TransitiveInfoCollection dep : propagatedDeps) { - if (dep.getProvider(ObjcProvider.class) != null) { - propagatedObjcDeps.add(dep.getProvider(ObjcProvider.class)); - } - if (dep.getProvider(CppCompilationContext.class) != null) { - cppDeps.add(dep.getProvider(CppCompilationContext.class)); - } - } CompilationArtifacts compilationArtifacts = CompilationSupport.compilationArtifacts(ruleContext, intermediateArtifacts); @@ -137,9 +143,7 @@ public class AppleBinary implements RuleConfiguredTargetFactory { .setResourceAttributes(new ResourceAttributes(ruleContext)) .setCompilationArtifacts(compilationArtifacts) .addDefines(ruleContext.getTokenizedStringListAttr("defines")) - .addDepObjcProviders(propagatedObjcDeps.build()) - .addDepCcHeaderProviders(cppDeps.build()) - .addDepCcLinkProviders(propagatedDeps) + .addDeps(propagatedDeps) .addDepObjcProviders( ruleContext.getPrerequisites("bundles", Mode.TARGET, ObjcProvider.class)) .addNonPropagatedDepObjcProviders(nonPropagatedObjcDeps) @@ -149,7 +153,7 @@ public class AppleBinary implements RuleConfiguredTargetFactory { .setLinkedBinary(intermediateArtifacts.strippedSingleArchitectureBinary()) .build(); } - + private List nullToEmptyList(List inputList) { return inputList != null ? inputList : ImmutableList.of(); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinaryRule.java b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinaryRule.java index 498789c3fa..0979c8fe23 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinaryRule.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinaryRule.java @@ -16,7 +16,6 @@ package com.google.devtools.build.lib.rules.objc; import static com.google.devtools.build.lib.packages.Attribute.attr; import static com.google.devtools.build.lib.packages.BuildType.LABEL; -import static com.google.devtools.build.lib.packages.BuildType.LABEL_LIST; import static com.google.devtools.build.lib.packages.ImplicitOutputsFunction.fromTemplates; import static com.google.devtools.build.lib.syntax.Type.BOOLEAN; @@ -43,24 +42,12 @@ public class AppleBinaryRule implements RuleDefinition { @Override public RuleClass build(Builder builder, RuleDefinitionEnvironment env) { return builder - .requiresConfigurationFragments(ObjcConfiguration.class, J2ObjcConfiguration.class, - AppleConfiguration.class) + .requiresConfigurationFragments( + ObjcConfiguration.class, J2ObjcConfiguration.class, AppleConfiguration.class) .add(attr("$is_executable", BOOLEAN).value(true) .nonconfigurable("Called from RunCommand.isExecutable, which takes a Target")) - .override(attr("deps", LABEL_LIST) - .cfg(IosApplication.SPLIT_ARCH_TRANSITION) - .direct_compile_time_input() - .allowedRuleClasses(ObjcRuleClasses.CompilingRule.ALLOWED_DEPS_RULE_CLASSES) - .allowedFileTypes()) - .override(attr("non_propagated_deps", LABEL_LIST) - .direct_compile_time_input() - .cfg(IosApplication.SPLIT_ARCH_TRANSITION) - .allowedRuleClasses(ObjcRuleClasses.CompilingRule.ALLOWED_DEPS_RULE_CLASSES) - .allowedFileTypes()) - .override(attr("srcs", LABEL_LIST) - .direct_compile_time_input() - .cfg(IosApplication.SPLIT_ARCH_TRANSITION) - .allowedFileTypes(ObjcRuleClasses.SRCS_TYPE)) + .override(builder.copy("deps").cfg(IosApplication.SPLIT_ARCH_TRANSITION)) + .override(builder.copy("non_propagated_deps").cfg(IosApplication.SPLIT_ARCH_TRANSITION)) // This is currently a hack to obtain all child configurations regardless of the attribute // values of this rule -- this rule does not currently use the actual info provided by // this attribute. 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 d06a374f07..ef86fe6ea9 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 @@ -31,7 +31,6 @@ import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; 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; -import com.google.devtools.build.lib.rules.cpp.CppCompilationContext; import com.google.devtools.build.lib.rules.objc.CompilationSupport.ExtraLinkArgs; import com.google.devtools.build.lib.rules.objc.ObjcCommon.CompilationAttributes; import com.google.devtools.build.lib.rules.objc.ObjcCommon.ResourceAttributes; @@ -97,13 +96,20 @@ abstract class BinaryLinkingTargetFactory implements RuleConfiguredTargetFactory return null; } + 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 = new CompilationSupport(ruleContext) .registerCompileAndArchiveActions(common) .registerFullyLinkAction(common.getObjcProvider()) .addXcodeSettings(xcodeProviderBuilder, common) .registerLinkActions( - objcProvider, + objcProvider, j2ObjcMappingFileProvider, j2ObjcEntryClassProvider, getExtraLinkArgs(ruleContext), ImmutableList.of(), DsymOutputType.APP) @@ -202,11 +208,7 @@ abstract class BinaryLinkingTargetFactory implements RuleConfiguredTargetFactory .setResourceAttributes(new ResourceAttributes(ruleContext)) .setCompilationArtifacts(compilationArtifacts) .addDefines(ruleContext.getTokenizedStringListAttr("defines")) - .addDepObjcProviders( - ruleContext.getPrerequisites("deps", Mode.TARGET, ObjcProvider.class)) - .addDepCcHeaderProviders( - ruleContext.getPrerequisites("deps", Mode.TARGET, CppCompilationContext.class)) - .addDepCcLinkProviders(ruleContext.getPrerequisites("deps", Mode.TARGET)) + .addDeps(ruleContext.getPrerequisites("deps", Mode.TARGET)) .addDepObjcProviders( ruleContext.getPrerequisites("bundles", Mode.TARGET, ObjcProvider.class)) .addNonPropagatedDepObjcProviders( 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 e2d0a0bd10..395a2beaa2 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 @@ -784,6 +784,8 @@ public final class CompilationSupport { * {@code -dead_strip} and {@code -no_dead_strip_inits_and_terms}). * * @param objcProvider common information about this rule's attributes and its dependencies + * @param j2ObjcMappingFileProvider contains mapping files for j2objc transpilation + * @param j2ObjcEntryClassProvider contains j2objc entry class information for dead code removal * @param extraLinkArgs any additional arguments to pass to the linker * @param extraLinkInputs any additional input artifacts to pass to the link action * @param dsymOutputType the file type of the dSYM bundle to be generated @@ -792,6 +794,8 @@ public final class CompilationSupport { */ CompilationSupport registerLinkActions( ObjcProvider objcProvider, + J2ObjcMappingFileProvider j2ObjcMappingFileProvider, + J2ObjcEntryClassProvider j2ObjcEntryClassProvider, ExtraLinkArgs extraLinkArgs, Iterable extraLinkInputs, DsymOutputType dsymOutputType) { @@ -809,9 +813,9 @@ public final class CompilationSupport { } Iterable prunedJ2ObjcArchives = ImmutableList.of(); - if (stripJ2ObjcDeadCode()) { - J2ObjcEntryClassProvider provider = J2ObjcEntryClassProvider.buildFrom(ruleContext); - registerJ2ObjcDeadCodeRemovalActions(objcProvider, provider.getEntryClasses()); + if (stripJ2ObjcDeadCode(j2ObjcEntryClassProvider)) { + registerJ2ObjcDeadCodeRemovalActions(objcProvider, j2ObjcMappingFileProvider, + j2ObjcEntryClassProvider); prunedJ2ObjcArchives = j2objcPrunedLibraries(objcProvider); } @@ -831,13 +835,13 @@ public final class CompilationSupport { return this; } - private boolean stripJ2ObjcDeadCode() { - J2ObjcEntryClassProvider provider = J2ObjcEntryClassProvider.buildFrom(ruleContext); + private boolean stripJ2ObjcDeadCode(J2ObjcEntryClassProvider j2ObjcEntryClassProvider) { J2ObjcConfiguration j2objcConfiguration = buildConfiguration.getFragment(J2ObjcConfiguration.class); // Only perform J2ObjC dead code stripping if flag --j2objc_dead_code_removal is specified and // users have specified entry classes. - return j2objcConfiguration.removeDeadCode() && !provider.getEntryClasses().isEmpty(); + return j2objcConfiguration.removeDeadCode() + && !j2ObjcEntryClassProvider.getEntryClasses().isEmpty(); } /** @@ -1175,12 +1179,16 @@ public final class CompilationSupport { } private void registerJ2ObjcDeadCodeRemovalActions(ObjcProvider objcProvider, - Iterable entryClasses) { + J2ObjcMappingFileProvider j2ObjcMappingFileProvider, + J2ObjcEntryClassProvider j2ObjcEntryClassProvider) { + NestedSet entryClasses = j2ObjcEntryClassProvider.getEntryClasses(); Artifact pruner = ruleContext.getPrerequisiteArtifact("$j2objc_dead_code_pruner", Mode.HOST); - J2ObjcMappingFileProvider provider = ObjcRuleClasses.j2ObjcMappingFileProvider(ruleContext); - NestedSet j2ObjcDependencyMappingFiles = provider.getDependencyMappingFiles(); - NestedSet j2ObjcHeaderMappingFiles = provider.getHeaderMappingFiles(); - NestedSet j2ObjcArchiveSourceMappingFiles = provider.getArchiveSourceMappingFiles(); + NestedSet j2ObjcDependencyMappingFiles = + j2ObjcMappingFileProvider.getDependencyMappingFiles(); + NestedSet j2ObjcHeaderMappingFiles = + j2ObjcMappingFileProvider.getHeaderMappingFiles(); + NestedSet j2ObjcArchiveSourceMappingFiles = + j2ObjcMappingFileProvider.getArchiveSourceMappingFiles(); for (Artifact j2objcArchive : objcProvider.get(ObjcProvider.J2OBJC_LIBRARY)) { PathFragment paramFilePath = FileSystemUtils.replaceExtension( 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 89541d6508..c21a7806ea 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 @@ -129,10 +129,18 @@ 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(); new CompilationSupport(ruleContext) .registerLinkActions( - common.getObjcProvider(), extraLinkArgs, extraLinkInputs, DsymOutputType.TEST) + common.getObjcProvider(), j2ObjcMappingFileProvider, j2ObjcEntryClassProvider, + extraLinkArgs, extraLinkInputs, DsymOutputType.TEST) .registerCompileAndArchiveActions(common) .registerFullyLinkAction(common.getObjcProvider()) .addXcodeSettings(xcodeProviderBuilder, common) diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcEntryClassProvider.java b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcEntryClassProvider.java index 6bbc6a505f..0b3cd38d51 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcEntryClassProvider.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcEntryClassProvider.java @@ -53,6 +53,20 @@ public final class J2ObjcEntryClassProvider implements TransitiveInfoProvider { return this; } + /** + * Transitively adds the given {@link J2ObjcEntryClassProvider}s + * and all their properties to this builder. + * + * @param providers the J2ObjcEntryClassProviders to add + * @return this builder + */ + public Builder addTransitive(Iterable providers) { + for (J2ObjcEntryClassProvider provider : providers) { + addTransitive(provider); + } + return this; + } + /** * Transitively adds all the J2ObjcEntryClassProviders and all their properties * that can be reached through the "deps" attribute. @@ -62,10 +76,8 @@ public final class J2ObjcEntryClassProvider implements TransitiveInfoProvider { */ public Builder addTransitive(RuleContext ruleContext) { if (ruleContext.attributes().has("deps", BuildType.LABEL_LIST)) { - for (J2ObjcEntryClassProvider provider : - ruleContext.getPrerequisites("deps", Mode.TARGET, J2ObjcEntryClassProvider.class)) { - addTransitive(provider); - } + addTransitive( + ruleContext.getPrerequisites("deps", Mode.TARGET, J2ObjcEntryClassProvider.class)); } return this; @@ -92,16 +104,6 @@ public final class J2ObjcEntryClassProvider implements TransitiveInfoProvider { } } - /** - * Constructs a new J2ObjcEntryClassProvider that contains all the information - * that can be transitively reached through the "deps" attribute of the given rule context. - * - * @param ruleContext the rule context in which to look for deps - */ - public static J2ObjcEntryClassProvider buildFrom(RuleContext ruleContext) { - return new Builder().addTransitive(ruleContext).build(); - } - /** * Constructs a {@link J2ObjcEntryClassProvider} to supply J2ObjC-translated ObjC sources to * objc_binary for compilation and linking. diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcLibrary.java index fd37871cc8..2cf414f1b4 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcLibrary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcLibrary.java @@ -74,12 +74,14 @@ public class J2ObjcLibrary implements RuleConfiguredTargetFactory { ObjcProvider objcProvider = objcProviderBuilder.build(); xcodeSupport.addXcodeSettings(xcodeProviderBuilder, objcProvider, LIBRARY_STATIC); + J2ObjcMappingFileProvider j2ObjcMappingFileProvider = J2ObjcMappingFileProvider.union( + ruleContext.getPrerequisites("deps", Mode.TARGET, J2ObjcMappingFileProvider.class)); + return new RuleConfiguredTargetBuilder(ruleContext) .setFilesToBuild(NestedSetBuilder.emptySet(STABLE_ORDER)) .add(RunfilesProvider.class, RunfilesProvider.EMPTY) .addProvider(J2ObjcEntryClassProvider.class, j2ObjcEntryClassProvider) - .addProvider( - J2ObjcMappingFileProvider.class, ObjcRuleClasses.j2ObjcMappingFileProvider(ruleContext)) + .addProvider(J2ObjcMappingFileProvider.class, j2ObjcMappingFileProvider) .addProvider(ObjcProvider.class, objcProvider) .addProvider(XcodeProvider.class, xcodeProviderBuilder.build()) .build(); diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcMappingFileProvider.java b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcMappingFileProvider.java index e785130329..2d40857e07 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcMappingFileProvider.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcMappingFileProvider.java @@ -32,6 +32,20 @@ public final class J2ObjcMappingFileProvider implements TransitiveInfoProvider { private final NestedSet dependencyMappingFiles; private final NestedSet archiveSourceMappingFiles; + /** + * Returns a {@link J2ObjcMappingFileProvider} which combines all input + * {@link J2ObjcMappingFileProvider}s. All mapping files present in any of the input providers + * will be present in the output provider. + */ + public static J2ObjcMappingFileProvider union(Iterable providers) { + J2ObjcMappingFileProvider.Builder builder = new J2ObjcMappingFileProvider.Builder(); + for (J2ObjcMappingFileProvider provider : providers) { + builder.addTransitive(provider); + } + + return builder.build(); + } + /** * Constructs a {@link J2ObjcMappingFileProvider} with mapping files to export mappings required * by J2ObjC translation and proto compilation. diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java index 5f832ebc27..bf35252ec6 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java @@ -65,6 +65,7 @@ import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode; import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.analysis.TransitiveInfoCollection; +import com.google.devtools.build.lib.analysis.TransitiveInfoProvider; import com.google.devtools.build.lib.analysis.config.BuildConfiguration; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.packages.BuildType; @@ -375,6 +376,39 @@ public final class ObjcCommon { return this; } + Builder addDeps(List deps) { + ImmutableList.Builder propagatedObjcDeps = + ImmutableList.builder(); + ImmutableList.Builder cppDeps = + ImmutableList.builder(); + ImmutableList.Builder cppDepLinkParams = + ImmutableList.builder(); + + for (TransitiveInfoCollection dep : deps) { + addAnyProviders(propagatedObjcDeps, dep, ObjcProvider.class); + addAnyProviders(cppDeps, dep, CppCompilationContext.class); + // Hack to determine if dep is a cc target. Required so objc_library archives packed in + // CcLinkParamsProvider do not get consumed as cc targets. + if (dep.getProvider(CppRunfilesProvider.class) != null) { + cppDepLinkParams.add(dep.getProvider(CcLinkParamsProvider.class)); + } + } + addDepObjcProviders(propagatedObjcDeps.build()); + this.depCcHeaderProviders = Iterables.concat(this.depCcHeaderProviders, cppDeps.build()); + this.depCcLinkProviders = + Iterables.concat(this.depCcLinkProviders, cppDepLinkParams.build()); + return this; + } + + private ImmutableList.Builder addAnyProviders( + ImmutableList.Builder listBuilder, TransitiveInfoCollection collection, + Class providerClass) { + if (collection.getProvider(providerClass) != null) { + listBuilder.add(collection.getProvider(providerClass)); + } + return listBuilder; + } + /** * Add providers which will be exposed both to the declaring rule and to any dependers on the * declaring rule. @@ -469,34 +503,6 @@ public final class ObjcCommon { return this; } - /** - * Sets information from {@code cc_library} dependencies to be used during compilation. - */ - public Builder addDepCcHeaderProviders(Iterable depCcHeaderProviders) { - this.depCcHeaderProviders = Iterables.concat(this.depCcHeaderProviders, depCcHeaderProviders); - return this; - } - - /** - * Sets information from {@code cc_library} dependencies to be used during linking from - * the {@link TransitiveInfoCollection} objects which contain the relevant link providers - * (for example, from the current rule's "deps" attribute). - */ - public Builder addDepCcLinkProviders(List deps) { - for (TransitiveInfoCollection dep : deps) { - // Hack to determine if dep is a cc target. Required so objc_library archives packed in - // CcLinkParamsProvider do not get consumed as cc targets. - if (dep.getProvider(CppRunfilesProvider.class) != null) { - CcLinkParamsProvider ccLinkParamsProvider = dep.getProvider(CcLinkParamsProvider.class); - this.depCcLinkProviders = - Iterables.concat( - this.depCcLinkProviders, - ImmutableList.of(ccLinkParamsProvider)); - } - } - return this; - } - ObjcCommon build() { Iterable bundleImports = BundleableFile.bundleImportsFromRule(context); diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java index aad16f1e1b..76130d94a1 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java @@ -27,7 +27,6 @@ import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; import com.google.devtools.build.lib.rules.cpp.CcLinkParams; import com.google.devtools.build.lib.rules.cpp.CcLinkParamsProvider; import com.google.devtools.build.lib.rules.cpp.CcLinkParamsStore; -import com.google.devtools.build.lib.rules.cpp.CppCompilationContext; import com.google.devtools.build.lib.rules.cpp.LinkerInputs; import com.google.devtools.build.lib.rules.cpp.LinkerInputs.LibraryToLink; import com.google.devtools.build.lib.rules.objc.ObjcCommon.CompilationAttributes; @@ -82,14 +81,11 @@ public class ObjcLibrary implements RuleConfiguredTargetFactory { .addExtraSdkFrameworks(extraSdkFrameworks) .addDefines(ruleContext.getTokenizedStringListAttr("defines")) .setCompilationArtifacts(compilationArtifacts) - .addDepObjcProviders(ruleContext.getPrerequisites("deps", Mode.TARGET, ObjcProvider.class)) + .addDeps(ruleContext.getPrerequisites("deps", Mode.TARGET)) .addDepObjcProviders( ruleContext.getPrerequisites("bundles", Mode.TARGET, ObjcProvider.class)) .addNonPropagatedDepObjcProviders( ruleContext.getPrerequisites("non_propagated_deps", Mode.TARGET, ObjcProvider.class)) - .addDepCcHeaderProviders( - ruleContext.getPrerequisites("deps", Mode.TARGET, CppCompilationContext.class)) - .addDepCcLinkProviders(ruleContext.getPrerequisites("deps", Mode.TARGET)) .setIntermediateArtifacts(ObjcRuleClasses.intermediateArtifacts(ruleContext)) .setAlwayslink(alwayslink) .setHasModuleMap() @@ -130,13 +126,17 @@ public class ObjcLibrary implements RuleConfiguredTargetFactory { xcodeProviderBuilder, new Attribute("non_propagated_deps", Mode.TARGET)) .registerActions(xcodeProviderBuilder.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(); + return ObjcRuleClasses.ruleConfiguredTarget(ruleContext, filesToBuild.build()) .addProvider(XcodeProvider.class, xcodeProviderBuilder.build()) .addProvider(ObjcProvider.class, common.getObjcProvider()) - .addProvider( - J2ObjcEntryClassProvider.class, J2ObjcEntryClassProvider.buildFrom(ruleContext)) - .addProvider( - J2ObjcMappingFileProvider.class, ObjcRuleClasses.j2ObjcMappingFileProvider(ruleContext)) + .addProvider(J2ObjcEntryClassProvider.class, j2ObjcEntryClassProvider) + .addProvider(J2ObjcMappingFileProvider.class, j2ObjcMappingFileProvider) .addProvider( InstrumentedFilesProvider.class, compilationSupport.getInstrumentedFilesProvider(common)) diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java index 8ccc437db9..b11e26fba9 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java @@ -29,7 +29,6 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.analysis.BaseRuleClasses; -import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder; import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.analysis.RuleDefinition; @@ -107,25 +106,6 @@ public class ObjcRuleClasses { /*archiveFileNameSuffix=*/"_j2objc"); } - /** - * Returns a {@link J2ObjcMappingFileProvider} containing J2ObjC mapping files from rules - * that can be reached transitively through the "deps" attribute. - * - * @param ruleContext the rule context of the current rule - * @return a {@link J2ObjcMappingFileProvider} containing J2ObjC mapping files information from - * the transitive closure. - */ - public static J2ObjcMappingFileProvider j2ObjcMappingFileProvider(RuleContext ruleContext) { - J2ObjcMappingFileProvider.Builder builder = new J2ObjcMappingFileProvider.Builder(); - Iterable providers = - ruleContext.getPrerequisites("deps", Mode.TARGET, J2ObjcMappingFileProvider.class); - for (J2ObjcMappingFileProvider provider : providers) { - builder.addTransitive(provider); - } - - return builder.build(); - } - public static Artifact artifactByAppendingToBaseName(RuleContext context, String suffix) { return context.getPackageRelativeArtifact( context.getLabel().getName() + suffix, context.getBinOrGenfilesDirectory()); -- cgit v1.2.3