aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/rules
diff options
context:
space:
mode:
authorGravatar Cal Peyser <cpeyser@google.com>2016-04-04 16:34:37 +0000
committerGravatar Kristina Chodorow <kchodorow@google.com>2016-04-05 14:04:08 +0000
commit9f2e673077b340ee6c88c0075726d03cc75d3eaa (patch)
treea8f934d45cb59d55dbe407d8c6cb6f2af602c7f4 /src/main/java/com/google/devtools/build/lib/rules
parent84f78ff3799022bc6bc8b8234ef406fb6d020033 (diff)
Introduce a seperate name to distinguish the objc provider passed from native rules to skylark rules and that returned from skylark rules to depending native rules. This fixes a bug where a skylark rule that did not touch the objc provider would automatically pass up the objc provider it received from dependencies to dependant native rules, leading to duplicate symbol linking errors when the same objc provider was exported twice.
-- MOS_MIGRATED_REVID=118947782
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/BinaryLinkingTargetFactory.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java10
2 files changed, 11 insertions, 1 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 c60da2ecaf..fccce46fe1 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
@@ -243,7 +243,7 @@ abstract class BinaryLinkingTargetFactory implements RuleConfiguredTargetFactory
for (SkylarkProviders skylarkProviders :
ruleContext.getPrerequisites("deps", Mode.TARGET, SkylarkProviders.class)) {
Object objcSkylarkProvider =
- skylarkProviders.getValue(ObjcProvider.OBJC_SKYLARK_PROVIDER_NAME);
+ skylarkProviders.getValue(ObjcProvider.OBJC_SKYLARK_PROVIDER_TO_EXPORT_NAME);
if (objcSkylarkProvider != null) {
ObjcProvider objcProviderFromSkylark =
ObjcProvider.fromSkylarkProvider((SkylarkClassObject) objcSkylarkProvider);
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 5535bdee10..aaaa7004f0 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
@@ -51,6 +51,16 @@ public final class ObjcProvider implements TransitiveInfoProvider {
public static final String OBJC_SKYLARK_PROVIDER_NAME = "objc";
/**
+ * The name skylark dependents can use to export a native objc provider to depending native
+ * rules.
+ *
+ * <p>This constant must be different from OBJC_SKYLARK_PROVIDER_NAME to prevent skylark rules
+ * from automatically exporting the ObjcProvider provided to them by dependants. This can
+ * lead to duplicate symbol linker errors.
+ */
+ public static final String OBJC_SKYLARK_PROVIDER_TO_EXPORT_NAME = "objc_export";
+
+ /**
* Represents one of the things this provider can provide transitively. Things are provided as
* {@link NestedSet}s of type E.
*/