aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/rules
diff options
context:
space:
mode:
authorGravatar Chris Parsons <cparsons@google.com>2016-05-12 08:12:08 +0000
committerGravatar Klaus Aehlig <aehlig@google.com>2016-05-12 10:48:22 +0000
commit9e8f1e4acb5863606e5be8d7d2b23a579f388163 (patch)
treef33ea31fa23351c2902df29936fc49be87f446d6 /src/main/java/com/google/devtools/build/lib/rules
parent904b913dda949dbd5175712d9e23b943cc4b78f7 (diff)
apple_binary creates _lipo.a (multi-architecture archive library)
-- MOS_MIGRATED_REVID=122134847
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/AppleBinary.java34
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinaryRule.java8
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/CompilationArtifacts.java7
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/LipoSupport.java6
4 files changed, 34 insertions, 21 deletions
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 bab857f469..aee8633544 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
@@ -14,13 +14,9 @@
package com.google.devtools.build.lib.rules.objc;
-import static com.google.devtools.build.lib.rules.objc.ObjcProvider.IMPORTED_LIBRARY;
-import static com.google.devtools.build.lib.rules.objc.ObjcProvider.LIBRARY;
-
import com.google.common.annotations.VisibleForTesting;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableListMultimap;
-import com.google.common.collect.Iterables;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode;
@@ -59,8 +55,8 @@ public class AppleBinary implements RuleConfiguredTargetFactory {
new AppleBinaryTransitionProvider();
@VisibleForTesting
- static final String REQUIRES_AT_LEAST_ONE_LIBRARY_OR_SOURCE_FILE =
- "At least one library dependency or source file is required.";
+ static final String REQUIRES_AT_LEAST_ONE_SOURCE_FILE =
+ "At least one source file is required (srcs, non_arc_srcs, or precompiled_srcs).";
@Override
public final ConfiguredTarget create(RuleContext ruleContext) throws InterruptedException {
@@ -77,6 +73,8 @@ public class AppleBinary implements RuleConfiguredTargetFactory {
NestedSetBuilder<Artifact> binariesToLipo =
NestedSetBuilder.<Artifact>stableOrder();
+ NestedSetBuilder<Artifact> archivesToLipo =
+ NestedSetBuilder.<Artifact>stableOrder();
NestedSetBuilder<Artifact> filesToBuild =
NestedSetBuilder.<Artifact>stableOrder()
.add(ruleIntermediateArtifacts.combinedArchitectureBinary());
@@ -87,7 +85,6 @@ public class AppleBinary implements RuleConfiguredTargetFactory {
ObjcCommon common = common(ruleContext, childConfig, intermediateArtifacts,
nullToEmptyList(configToDepsCollectionMap.get(childConfig)),
nullToEmptyList(configurationToNonPropagatedObjcMap.get(childConfig)));
- ObjcProvider objcProvider = common.getObjcProvider();
ImmutableList.Builder<J2ObjcMappingFileProvider> j2ObjcMappingFileProviders =
ImmutableList.builder();
J2ObjcEntryClassProvider.Builder j2ObjcEntryClassProviderBuilder =
@@ -105,14 +102,15 @@ public class AppleBinary implements RuleConfiguredTargetFactory {
J2ObjcMappingFileProvider.union(j2ObjcMappingFileProviders.build());
J2ObjcEntryClassProvider j2ObjcEntryClassProvider = j2ObjcEntryClassProviderBuilder.build();
- if (!hasLibraryOrSources(objcProvider)) {
- ruleContext.ruleError(REQUIRES_AT_LEAST_ONE_LIBRARY_OR_SOURCE_FILE);
+ if (!common.getCompilationArtifacts().get().getArchive().isPresent()) {
+ ruleContext.ruleError(REQUIRES_AT_LEAST_ONE_SOURCE_FILE);
return null;
}
if (ruleContext.hasErrors()) {
return null;
}
+ archivesToLipo.add(common.getCompilationArtifacts().get().getArchive().get());
binariesToLipo.add(intermediateArtifacts.strippedSingleArchitectureBinary());
new CompilationSupport(ruleContext, childConfig)
.registerCompileAndArchiveActions(common)
@@ -129,10 +127,15 @@ public class AppleBinary implements RuleConfiguredTargetFactory {
AppleConfiguration appleConfiguration = ruleContext.getFragment(AppleConfiguration.class);
- new LipoSupport(ruleContext).registerCombineArchitecturesAction(
- binariesToLipo.build(),
- ruleIntermediateArtifacts.combinedArchitectureBinary(),
- appleConfiguration.getIosCpuPlatform());
+ new LipoSupport(ruleContext)
+ .registerCombineArchitecturesAction(
+ binariesToLipo.build(),
+ ruleIntermediateArtifacts.combinedArchitectureBinary(),
+ appleConfiguration.getIosCpuPlatform())
+ .registerCombineArchitecturesAction(
+ archivesToLipo.build(),
+ ruleContext.getImplicitOutputArtifact(AppleBinaryRule.LIPO_ARCHIVE),
+ appleConfiguration.getIosCpuPlatform());
RuleConfiguredTargetBuilder targetBuilder =
ObjcRuleClasses.ruleConfiguredTarget(ruleContext, filesToBuild.build());
@@ -140,11 +143,6 @@ public class AppleBinary implements RuleConfiguredTargetFactory {
return targetBuilder.build();
}
- private boolean hasLibraryOrSources(ObjcProvider objcProvider) {
- return !Iterables.isEmpty(objcProvider.get(LIBRARY)) // Includes sources from this target.
- || !Iterables.isEmpty(objcProvider.get(IMPORTED_LIBRARY));
- }
-
private ObjcCommon common(RuleContext ruleContext, BuildConfiguration buildConfiguration,
IntermediateArtifacts intermediateArtifacts,
List<TransitiveInfoCollection> propagatedDeps,
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 311b37ab49..0eddf23ec4 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
@@ -38,6 +38,12 @@ public class AppleBinaryRule implements RuleDefinition {
* multiple architectures).
*/
private static final SafeImplicitOutputsFunction LIPOBIN = fromTemplates("%{name}_lipobin");
+
+ /**
+ * Template for the fat archive output (using Apple's "lipo" tool to combine .a archive files of
+ * multiple architectures).
+ */
+ static final SafeImplicitOutputsFunction LIPO_ARCHIVE = fromTemplates("%{name}_lipo.a");
@Override
public RuleClass build(Builder builder, RuleDefinitionEnvironment env) {
@@ -55,7 +61,7 @@ public class AppleBinaryRule implements RuleDefinition {
.cfg(AppleBinary.SPLIT_TRANSITION_PROVIDER)
.value(ObjcRuleClasses.APPLE_TOOLCHAIN))
.setImplicitOutputsFunction(
- ImplicitOutputsFunction.fromFunctions(LIPOBIN))
+ ImplicitOutputsFunction.fromFunctions(LIPOBIN, LIPO_ARCHIVE))
.build();
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationArtifacts.java b/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationArtifacts.java
index f4eff916d4..326a208301 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationArtifacts.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationArtifacts.java
@@ -160,7 +160,12 @@ final class CompilationArtifacts {
public Iterable<Artifact> getPrecompiledSrcs() {
return precompiledSrcs;
}
-
+
+ /**
+ * Returns the output archive library (.a) file created by combining object files of the srcs,
+ * non arc srcs, and precompiled srcs of this artifact collection. Returns absent if there
+ * are no such source files for which to create an archive library.
+ */
public Optional<Artifact> getArchive() {
return archive;
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/LipoSupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/LipoSupport.java
index f79039664b..419628da47 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/LipoSupport.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/LipoSupport.java
@@ -34,8 +34,10 @@ public class LipoSupport {
/**
* Registers an action to invoke "lipo" on all artifacts in {@code inputBinaries} to create the
* {@code outputBinary} multi-architecture artifact, built for platform {@code platform}.
+ *
+ * @return this object
*/
- public void registerCombineArchitecturesAction(NestedSet<Artifact> inputBinaries,
+ public LipoSupport registerCombineArchitecturesAction(NestedSet<Artifact> inputBinaries,
Artifact outputBinary, Platform platform) {
ruleContext.registerAction(ObjcRuleClasses.spawnAppleEnvActionBuilder(ruleContext, platform)
@@ -49,5 +51,7 @@ public class LipoSupport {
.addExecPath("-o", outputBinary)
.build())
.build(ruleContext));
+
+ return this;
}
}