aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/rules/objc
diff options
context:
space:
mode:
authorGravatar Cal Peyser <cpeyser@google.com>2016-03-28 21:28:29 +0000
committerGravatar Klaus Aehlig <aehlig@google.com>2016-03-29 10:52:46 +0000
commit73e65c79ff53618f8c8326f864fa067fa15803a8 (patch)
tree2e27bb8940598d1d8ddf1c0f2419542a3d927a62 /src/main/java/com/google/devtools/build/lib/rules/objc
parent3d69b4890d712f940e5ff06ee3256b384dcb3916 (diff)
Skylark providers exported under the key "objc" are consumed as ObjcProvider instances by dependant objc_binary targets.
-- MOS_MIGRATED_REVID=118395529
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules/objc')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/BinaryLinkingTargetFactory.java23
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java42
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java3
3 files changed, 54 insertions, 14 deletions
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());
}
@@ -220,6 +224,25 @@ abstract class BinaryLinkingTargetFactory implements RuleConfiguredTargetFactory
}
/**
+ * Constructs an ObjcProvider instance for each skylark objc provider in this target's
+ * dependencies.
+ */
+ private Iterable<ObjcProvider> createSkylarkObjcProviders(RuleContext ruleContext) {
+ ImmutableList.Builder<ObjcProvider> 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<Key<?>> keysForSkylark() {
- return ImmutableList.<Key<?>>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<Artifact> LIBRARY = new Key<>(LINK_ORDER, "library", Artifact.class);
public static final Key<Artifact> 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<Key<?>> KEYS_FOR_SKYLARK =
+ ImmutableList.<Key<?>>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<Key<?>, 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<String, Object> providerBuilder = ImmutableMap.<String, Object>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) {