aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/rules/objc/BinaryLinkingTargetFactory.java
diff options
context:
space:
mode:
authorGravatar Cal Peyser <cpeyser@google.com>2016-10-05 20:54:27 +0000
committerGravatar Damien Martin-Guillerez <dmarting@google.com>2016-10-06 07:41:29 +0000
commitcddad444da9748f26b4326f8e2de13ad7f26239e (patch)
tree3e33406810cae9d836c9c800efb122ae2e50d4d4 /src/main/java/com/google/devtools/build/lib/rules/objc/BinaryLinkingTargetFactory.java
parent9d62a14f42320742101aeae1863cc0218db35266 (diff)
BinaryLinkingTargetFactory can use the crosstool backend. objc_binary can turn
on this behavior with a flag. -- MOS_MIGRATED_REVID=135275324
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules/objc/BinaryLinkingTargetFactory.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/BinaryLinkingTargetFactory.java42
1 files changed, 37 insertions, 5 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 9e72c42549..2af307fd94 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.TransitiveInfoProviderMap;
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;
@@ -47,13 +48,23 @@ abstract class BinaryLinkingTargetFactory implements RuleConfiguredTargetFactory
YES, NO;
}
+ /** Indicates whether this binary uses the c++ rules backend, including the crosstool. */
+ enum UsesCrosstool {
+ EXPERIMENTAL, // use the crosstool if --experimental_use_crosstool_for_binary is given
+ NO;
+ }
+
private final HasReleaseBundlingSupport hasReleaseBundlingSupport;
private final XcodeProductType productType;
+ private final UsesCrosstool usesCrosstool;
- protected BinaryLinkingTargetFactory(HasReleaseBundlingSupport hasReleaseBundlingSupport,
- XcodeProductType productType) {
+ protected BinaryLinkingTargetFactory(
+ HasReleaseBundlingSupport hasReleaseBundlingSupport,
+ XcodeProductType productType,
+ UsesCrosstool usesCrosstool) {
this.hasReleaseBundlingSupport = hasReleaseBundlingSupport;
this.productType = productType;
+ this.usesCrosstool = usesCrosstool;
}
/**
@@ -107,9 +118,6 @@ abstract class BinaryLinkingTargetFactory implements RuleConfiguredTargetFactory
CompilationSupport compilationSupport =
new CompilationSupport(ruleContext)
- .registerCompileAndArchiveActions(common)
- .registerFullyLinkAction(common.getObjcProvider(),
- ruleContext.getImplicitOutputArtifact(CompilationSupport.FULLY_LINKED_LIB))
.addXcodeSettings(xcodeProviderBuilder, common)
.registerLinkActions(
objcProvider,
@@ -120,6 +128,27 @@ abstract class BinaryLinkingTargetFactory implements RuleConfiguredTargetFactory
DsymOutputType.APP)
.validateAttributes();
+ TransitiveInfoProviderMap compilationProviders;
+ if (usesCrosstool == UsesCrosstool.EXPERIMENTAL
+ && ruleContext.getFragment(ObjcConfiguration.class).useCrosstoolForBinary()) {
+ CrosstoolSupport crosstoolSupport = new CrosstoolSupport(ruleContext, objcProvider);
+ CompilationArtifacts compilationArtifacts =
+ CompilationSupport.compilationArtifacts(ruleContext);
+ if (compilationArtifacts.getArchive().isPresent()) {
+ compilationProviders = crosstoolSupport.registerCompileAndArchiveActions(common);
+ } else {
+ compilationProviders = crosstoolSupport.registerCompileActions(common);
+ }
+ crosstoolSupport.registerFullyLinkAction(common);
+ } else {
+ compilationProviders = null;
+ compilationSupport
+ .registerCompileAndArchiveActions(common)
+ .registerFullyLinkAction(
+ common.getObjcProvider(),
+ ruleContext.getImplicitOutputArtifact(CompilationSupport.FULLY_LINKED_LIB));
+ }
+
Optional<XcTestAppProvider> xcTestAppProvider;
Optional<RunfilesSupport> maybeRunfilesSupport = Optional.absent();
switch (hasReleaseBundlingSupport) {
@@ -188,6 +217,9 @@ abstract class BinaryLinkingTargetFactory implements RuleConfiguredTargetFactory
RunfilesSupport runfilesSupport = maybeRunfilesSupport.get();
targetBuilder.setRunfilesSupport(runfilesSupport, runfilesSupport.getExecutable());
}
+ if (compilationProviders != null) {
+ targetBuilder.addProviders(compilationProviders);
+ }
configureTarget(targetBuilder, ruleContext);
return targetBuilder.build();
}