aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com
diff options
context:
space:
mode:
authorGravatar Chris Parsons <cparsons@google.com>2016-10-31 17:53:27 +0000
committerGravatar Laszlo Csomor <laszlocsomor@google.com>2016-11-02 08:25:57 +0000
commitff47759a662c6e9664d3ed03836f73e2c0c6093f (patch)
tree51bf355fd89c81636ba0d6c3fb3a1e8988dfad82 /src/main/java/com
parenta0e3af46ca41f55163188d4beef10534c006aaca (diff)
Initial implementation of "dylib" attribute for apple_binary and apple_dynamic_library rules
Provided values propagated from "dylib" dependencies will be compiled against the srcs of the rule, and linked together with the dependencies. It is worth noting that "dylibs" differs from "deps" in that there is no configuration transition along this edge. There is more work to be done on this attribute, so it remains undocumented. Namely, symbol deduping between dylib and statically-linked dependencies needs to be addressed. -- MOS_MIGRATED_REVID=137721599
Diffstat (limited to 'src/main/java/com')
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java1
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinary.java6
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinaryRule.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/AppleDynamicLibrary.java6
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/AppleDynamicLibraryRule.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/MultiArchBinarySupport.java24
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java34
7 files changed, 65 insertions, 12 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java
index cf4359903c..10f3903741 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java
@@ -589,6 +589,7 @@ public class BazelRuleClassProvider {
builder.addRuleDefinition(new ObjcXcodeprojRule());
builder.addRuleDefinition(new ObjcRuleClasses.CoptsRule());
builder.addRuleDefinition(new ObjcRuleClasses.BundlingRule());
+ builder.addRuleDefinition(new ObjcRuleClasses.DylibDependingRule());
builder.addRuleDefinition(new ObjcRuleClasses.ReleaseBundlingRule());
builder.addRuleDefinition(new ObjcRuleClasses.SimulatorRule());
builder.addRuleDefinition(new ObjcRuleClasses.CompilingRule());
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 7a05b9c6eb..643ba0f21a 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
@@ -15,6 +15,7 @@
package com.google.devtools.build.lib.rules.objc;
import static com.google.devtools.build.lib.rules.objc.ObjcProvider.MULTI_ARCH_LINKED_BINARIES;
+import static com.google.devtools.build.lib.rules.objc.ObjcRuleClasses.DylibDependingRule.DYLIBS_ATTR_NAME;
import com.google.common.collect.ImmutableListMultimap;
import com.google.devtools.build.lib.actions.Artifact;
@@ -31,7 +32,6 @@ import com.google.devtools.build.lib.rules.apple.Platform;
import com.google.devtools.build.lib.rules.apple.Platform.PlatformType;
import com.google.devtools.build.lib.rules.cpp.CcToolchainProvider;
import com.google.devtools.build.lib.rules.objc.CompilationSupport.ExtraLinkArgs;
-
import java.util.Map;
import java.util.Set;
@@ -52,6 +52,8 @@ public class AppleBinary implements RuleConfiguredTargetFactory {
ObjcProvider.class);
ImmutableListMultimap<BuildConfiguration, TransitiveInfoCollection> configToDepsCollectionMap =
ruleContext.getPrerequisitesByConfiguration("deps", Mode.SPLIT);
+ Iterable<ObjcProvider> dylibProviders =
+ ruleContext.getPrerequisites(DYLIBS_ATTR_NAME, Mode.TARGET, ObjcProvider.class);
Set<BuildConfiguration> childConfigurations = getChildConfigurations(ruleContext);
Artifact outputArtifact =
ObjcRuleClasses.intermediateArtifacts(ruleContext).combinedArchitectureBinary();
@@ -59,7 +61,7 @@ public class AppleBinary implements RuleConfiguredTargetFactory {
MultiArchBinarySupport multiArchBinarySupport = new MultiArchBinarySupport(ruleContext);
Map<BuildConfiguration, ObjcCommon> objcCommonByDepConfiguration =
multiArchBinarySupport.objcCommonByDepConfiguration(childConfigurations,
- configToDepsCollectionMap, configurationToNonPropagatedObjcMap);
+ configToDepsCollectionMap, configurationToNonPropagatedObjcMap, dylibProviders);
multiArchBinarySupport.registerActions(platform, new ExtraLinkArgs(),
objcCommonByDepConfiguration, configToDepsCollectionMap, outputArtifact);
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 17116f664f..107554783c 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
@@ -66,7 +66,8 @@ public class AppleBinaryRule implements RuleDefinition {
.name("apple_binary")
.factoryClass(AppleBinary.class)
.ancestors(BaseRuleClasses.BaseRule.class, ObjcRuleClasses.LinkingRule.class,
- ObjcRuleClasses.MultiArchPlatformRule.class, ObjcRuleClasses.SimulatorRule.class)
+ ObjcRuleClasses.MultiArchPlatformRule.class, ObjcRuleClasses.SimulatorRule.class,
+ ObjcRuleClasses.DylibDependingRule.class)
.build();
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleDynamicLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleDynamicLibrary.java
index f14f2be59c..69ec0ac4a6 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleDynamicLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleDynamicLibrary.java
@@ -15,6 +15,7 @@
package com.google.devtools.build.lib.rules.objc;
import static com.google.devtools.build.lib.rules.objc.ObjcProvider.MULTI_ARCH_DYNAMIC_LIBRARIES;
+import static com.google.devtools.build.lib.rules.objc.ObjcRuleClasses.DylibDependingRule.DYLIBS_ATTR_NAME;
import com.google.common.collect.ImmutableListMultimap;
import com.google.devtools.build.lib.actions.Artifact;
@@ -31,7 +32,6 @@ import com.google.devtools.build.lib.rules.apple.Platform;
import com.google.devtools.build.lib.rules.apple.Platform.PlatformType;
import com.google.devtools.build.lib.rules.cpp.CcToolchainProvider;
import com.google.devtools.build.lib.rules.objc.CompilationSupport.ExtraLinkArgs;
-
import java.util.Map;
import java.util.Set;
@@ -52,6 +52,8 @@ public class AppleDynamicLibrary implements RuleConfiguredTargetFactory {
ObjcProvider.class);
ImmutableListMultimap<BuildConfiguration, TransitiveInfoCollection> configToDepsCollectionMap =
ruleContext.getPrerequisitesByConfiguration("deps", Mode.SPLIT);
+ Iterable<ObjcProvider> dylibProviders =
+ ruleContext.getPrerequisites(DYLIBS_ATTR_NAME, Mode.TARGET, ObjcProvider.class);
Set<BuildConfiguration> childConfigurations = getChildConfigurations(ruleContext);
Artifact outputArtifact =
ObjcRuleClasses.intermediateArtifacts(ruleContext).combinedArchitectureDylib();
@@ -59,7 +61,7 @@ public class AppleDynamicLibrary implements RuleConfiguredTargetFactory {
MultiArchBinarySupport multiArchBinarySupport = new MultiArchBinarySupport(ruleContext);
Map<BuildConfiguration, ObjcCommon> objcCommonByDepConfiguration =
multiArchBinarySupport.objcCommonByDepConfiguration(childConfigurations,
- configToDepsCollectionMap, configurationToNonPropagatedObjcMap);
+ configToDepsCollectionMap, configurationToNonPropagatedObjcMap, dylibProviders);
multiArchBinarySupport.registerActions(platform, new ExtraLinkArgs("-dynamiclib"),
objcCommonByDepConfiguration, configToDepsCollectionMap, outputArtifact);
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleDynamicLibraryRule.java b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleDynamicLibraryRule.java
index 0457af2540..7b7b448cec 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleDynamicLibraryRule.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleDynamicLibraryRule.java
@@ -60,7 +60,8 @@ public class AppleDynamicLibraryRule implements RuleDefinition {
.name("apple_dynamic_library")
.factoryClass(AppleDynamicLibrary.class)
.ancestors(BaseRuleClasses.BaseRule.class, ObjcRuleClasses.LinkingRule.class,
- ObjcRuleClasses.MultiArchPlatformRule.class, ObjcRuleClasses.SimulatorRule.class)
+ ObjcRuleClasses.MultiArchPlatformRule.class, ObjcRuleClasses.SimulatorRule.class,
+ ObjcRuleClasses.DylibDependingRule.class)
.build();
}
}
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 54f967afaf..d65b39bc15 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
@@ -18,6 +18,7 @@ import com.google.common.base.Optional;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableListMultimap;
import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Iterables;
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;
@@ -118,12 +119,21 @@ public class MultiArchBinarySupport {
* register actions in {@link #registerActions} and collect provider information to be
* propagated upstream.
*
+ * @param childConfigurations the set of configurations in which dependencies of the current
+ * rule are built
+ * @param configToDepsCollectionMap a map from child configuration to providers that "deps" of
+ * the current rule have propagated in that configuration
+ * @param configurationToNonPropagatedObjcMap a map from child configuration to providers that
+ * "non_propagated_deps" of the current rule have propagated in that configuration
+ * @param configToDylibsObjcMap providers that dynamic library dependencies of the current rule
+ * have propagated
* @throws RuleErrorException if there are attribute errors in the current rule context
*/
public Map<BuildConfiguration, ObjcCommon> objcCommonByDepConfiguration(
Set<BuildConfiguration> childConfigurations,
ImmutableListMultimap<BuildConfiguration, TransitiveInfoCollection> configToDepsCollectionMap,
- ImmutableListMultimap<BuildConfiguration, ObjcProvider> configurationToNonPropagatedObjcMap)
+ ImmutableListMultimap<BuildConfiguration, ObjcProvider> configurationToNonPropagatedObjcMap,
+ Iterable<ObjcProvider> configToDylibsObjcMap)
throws RuleErrorException {
ImmutableMap.Builder<BuildConfiguration, ObjcCommon> configurationToObjcCommonBuilder =
ImmutableMap.builder();
@@ -138,6 +148,10 @@ public class MultiArchBinarySupport {
IntermediateArtifacts intermediateArtifacts =
ObjcRuleClasses.intermediateArtifacts(ruleContext, childConfig);
+ Iterable<ObjcProvider> additionalDepProviders = Iterables.concat(configToDylibsObjcMap,
+ ruleContext.getPrerequisites("bundles", Mode.TARGET, ObjcProvider.class),
+ protosObjcProvider.asSet());
+
ObjcCommon common =
common(
ruleContext,
@@ -145,7 +159,7 @@ public class MultiArchBinarySupport {
intermediateArtifacts,
nullToEmptyList(configToDepsCollectionMap.get(childConfig)),
nullToEmptyList(configurationToNonPropagatedObjcMap.get(childConfig)),
- protosObjcProvider);
+ additionalDepProviders);
configurationToObjcCommonBuilder.put(childConfig, common);
}
@@ -159,7 +173,7 @@ public class MultiArchBinarySupport {
IntermediateArtifacts intermediateArtifacts,
List<TransitiveInfoCollection> propagatedDeps,
List<ObjcProvider> nonPropagatedObjcDeps,
- Optional<ObjcProvider> protosObjcProvider) {
+ Iterable<ObjcProvider> additionalDepProviders) {
CompilationArtifacts compilationArtifacts =
CompilationSupport.compilationArtifacts(ruleContext, intermediateArtifacts);
@@ -171,9 +185,7 @@ public class MultiArchBinarySupport {
.setResourceAttributes(new ResourceAttributes(ruleContext))
.addDefines(ruleContext.getTokenizedStringListAttr("defines"))
.addDeps(propagatedDeps)
- .addDepObjcProviders(
- ruleContext.getPrerequisites("bundles", Mode.TARGET, ObjcProvider.class))
- .addDepObjcProviders(protosObjcProvider.asSet())
+ .addDepObjcProviders(additionalDepProviders)
.addNonPropagatedDepObjcProviders(nonPropagatedObjcDeps)
.setIntermediateArtifacts(intermediateArtifacts)
.setAlwayslink(false)
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 d86b1f1b57..749d653c31 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
@@ -965,6 +965,40 @@ public class ObjcRuleClasses {
}
/**
+ * Common attributes for apple rules that can depend on one or more dynamic libraries.
+ */
+ public static class DylibDependingRule implements RuleDefinition {
+
+ /**
+ * Attribute name for dylib dependencies.
+ */
+ static final String DYLIBS_ATTR_NAME = "dylibs";
+
+ @Override
+ public RuleClass build(Builder builder, RuleDefinitionEnvironment env) {
+ return builder
+ // TODO(b/32411441): Restrict the dylibs attribute to take only dylib dependencies.
+ // This will require refactoring ObjcProvider into alternate providers.
+ // TODO(cparsons): Subtract transitive dependencies from "deps" during linking, as needed.
+ // Also document this attribute when this is resolved.
+ .add(attr(DYLIBS_ATTR_NAME, LABEL_LIST)
+ .direct_compile_time_input()
+ .mandatoryNativeProviders(
+ ImmutableList.<Class<? extends TransitiveInfoProvider>>of(ObjcProvider.class))
+ .allowedFileTypes())
+ .build();
+ }
+
+ @Override
+ public Metadata getMetadata() {
+ return RuleDefinition.Metadata.builder()
+ .name("$apple_dylib_depending_rule")
+ .type(RuleClassType.ABSTRACT)
+ .build();
+ }
+ }
+
+ /**
* Common attributes for {@code objc_*} rules that create a bundle. Specifically, for rules
* which use the {@link Bundling} helper class.
*/