From 73e65c79ff53618f8c8326f864fa067fa15803a8 Mon Sep 17 00:00:00 2001 From: Cal Peyser Date: Mon, 28 Mar 2016 21:28:29 +0000 Subject: Skylark providers exported under the key "objc" are consumed as ObjcProvider instances by dependant objc_binary targets. -- MOS_MIGRATED_REVID=118395529 --- .../lib/rules/objc/BinaryLinkingTargetFactory.java | 23 ++++++++++++ .../build/lib/rules/objc/ObjcProvider.java | 42 +++++++++++++++------- .../build/lib/rules/objc/ObjcRuleClasses.java | 3 +- 3 files changed, 54 insertions(+), 14 deletions(-) (limited to 'src/main/java') 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 0b5b7ba848..6a999cab65 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 @@ -27,6 +27,7 @@ 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.RunfilesSupport; +import com.google.devtools.build.lib.analysis.SkylarkProviders; 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; @@ -37,6 +38,7 @@ import com.google.devtools.build.lib.rules.objc.ObjcCommon.CompilationAttributes 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.test.InstrumentedFilesProvider; +import com.google.devtools.build.lib.syntax.ClassObject.SkylarkClassObject; /** * Implementation for rules that link binaries. @@ -212,6 +214,8 @@ abstract class BinaryLinkingTargetFactory implements RuleConfiguredTargetFactory .setHasModuleMap() .setLinkedBinary(intermediateArtifacts.strippedSingleArchitectureBinary()); + builder.addDepObjcProviders(createSkylarkObjcProviders(ruleContext)); + if (ObjcRuleClasses.objcConfiguration(ruleContext).generateDebugSymbols()) { builder.setBreakpadFile(intermediateArtifacts.breakpadSym()); } @@ -219,6 +223,25 @@ abstract class BinaryLinkingTargetFactory implements RuleConfiguredTargetFactory return builder.build(); } + /** + * Constructs an ObjcProvider instance for each skylark objc provider in this target's + * dependencies. + */ + private Iterable createSkylarkObjcProviders(RuleContext ruleContext) { + ImmutableList.Builder skylarkProviderListBuilder = ImmutableList.builder(); + for (SkylarkProviders skylarkProviders : + ruleContext.getPrerequisites("deps", Mode.TARGET, SkylarkProviders.class)) { + Object objcSkylarkProvider = + skylarkProviders.getValue(ObjcProvider.OBJC_SKYLARK_PROVIDER_NAME); + if (objcSkylarkProvider != null) { + ObjcProvider objcProviderFromSkylark = + ObjcProvider.fromSkylarkProvider((SkylarkClassObject) objcSkylarkProvider); + skylarkProviderListBuilder.add(objcProviderFromSkylark); + } + } + return skylarkProviderListBuilder.build(); + } + /** * Performs additional configuration of the target. The default implementation does nothing, but * subclasses may override it to add logic. diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java index 25e833104b..010d0cd30a 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java @@ -79,18 +79,6 @@ public final class ObjcProvider implements TransitiveInfoProvider { return type; } } - - /** - * All keys in ObjcProvider that will be passed in the corresponding Skylark provider. - */ - // Only keys for Artifact or primitive types can be in the Skylark provider, as other types - // are not supported as Skylark types. - private ImmutableList> keysForSkylark() { - return ImmutableList.>of(LIBRARY, IMPORTED_LIBRARY, LINKED_BINARY, FORCE_LOAD_LIBRARY, - FORCE_LOAD_FOR_XCODEGEN, HEADER, SOURCE, DEFINE, ASSET_CATALOG, GENERAL_RESOURCE_FILE, - SDK_DYLIB, XCDATAMODEL, MODULE_MAP, MERGE_ZIP, FRAMEWORK_FILE, DEBUG_SYMBOLS, - BREAKPAD_FILE, STORYBOARD, XIB, STRINGS, LINKOPT, J2OBJC_LIBRARY); - } public static final Key LIBRARY = new Key<>(LINK_ORDER, "library", Artifact.class); public static final Key IMPORTED_LIBRARY = @@ -306,6 +294,17 @@ public final class ObjcProvider implements TransitiveInfoProvider { } + /** + * All keys in ObjcProvider that will be passed in the corresponding Skylark provider. + */ + // Only keys for Artifact or primitive types can be in the Skylark provider, as other types + // are not supported as Skylark types. + private static final ImmutableList> KEYS_FOR_SKYLARK = + ImmutableList.>of(LIBRARY, IMPORTED_LIBRARY, LINKED_BINARY, FORCE_LOAD_LIBRARY, + FORCE_LOAD_FOR_XCODEGEN, HEADER, SOURCE, DEFINE, ASSET_CATALOG, GENERAL_RESOURCE_FILE, + SDK_DYLIB, XCDATAMODEL, MODULE_MAP, MERGE_ZIP, FRAMEWORK_FILE, DEBUG_SYMBOLS, + BREAKPAD_FILE, STORYBOARD, XIB, STRINGS, LINKOPT, J2OBJC_LIBRARY); + private final ImmutableMap, NestedSet> items; // Items which should be passed to direct dependers, but not transitive dependers. @@ -355,11 +354,28 @@ public final class ObjcProvider implements TransitiveInfoProvider { */ public SkylarkClassObject toSkylarkProvider() { ImmutableMap.Builder providerBuilder = ImmutableMap.builder(); - for (Key key : keysForSkylark()) { + for (Key key : KEYS_FOR_SKYLARK) { providerBuilder.put(key.getSkylarkKeyName(), new SkylarkNestedSet(key.getType(), get(key))); } return new SkylarkClassObject(providerBuilder.build(), "No such attribute '%s'"); } + + /** + * Returns an {@code ObjcProvider} from a given skylark provider. For each candidate key + * in the ObjcProvider, will check the given skylark provider to see if that key is represented + * in the returned struct. + */ + public static ObjcProvider fromSkylarkProvider(SkylarkClassObject skylarkProvider) { + Builder builder = new Builder(); + for (Key key : KEYS_FOR_SKYLARK) { + SkylarkNestedSet skylarkSet = + (SkylarkNestedSet) skylarkProvider.getValue(key.getSkylarkKeyName()); + if (skylarkSet != null) { + builder.uncheckedAddAll(key, skylarkSet.getSet(key.getType()), builder.items); + } + } + return builder.build(); + } /** * A builder for this context with an API that is optimized for collecting information from 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 04505b885b..f815ffa788 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 @@ -572,7 +572,8 @@ public class ObjcRuleClasses { "j2objc_library", "cc_library", "cc_inc_library", - "ios_framework"); + "ios_framework", + "swift_binary"); @Override public RuleClass build(Builder builder, RuleDefinitionEnvironment env) { -- cgit v1.2.3