diff options
author | Chris Parsons <cparsons@google.com> | 2016-05-12 08:12:08 +0000 |
---|---|---|
committer | Klaus Aehlig <aehlig@google.com> | 2016-05-12 10:48:22 +0000 |
commit | 9e8f1e4acb5863606e5be8d7d2b23a579f388163 (patch) | |
tree | f33ea31fa23351c2902df29936fc49be87f446d6 /src/main/java | |
parent | 904b913dda949dbd5175712d9e23b943cc4b78f7 (diff) |
apple_binary creates _lipo.a (multi-architecture archive library)
--
MOS_MIGRATED_REVID=122134847
Diffstat (limited to 'src/main/java')
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; } } |