diff options
author | 2015-09-17 22:53:38 +0000 | |
---|---|---|
committer | 2015-09-21 08:55:16 +0000 | |
commit | 02c490c19a56a1c4151544fca2e3f7a820ee2e51 (patch) | |
tree | e8b7c4e756211ac93f44719aa4a272f98b443918 | |
parent | 261035fdae0455e95087c031807931bf24aa133e (diff) |
Adds an implicit "fully_linked" archive output to objc_library.
Adds a fully linked static library as an implicit target of objc_library. This implicit target is a library that contains the full transitive closure of libraries inside of it. For example, if liba depends on libb, then liba_fully_linked contains all of the symbols in liba and libb.
Tested:
Added unit tests that check the right libraries are linked in.
--
MOS_MIGRATED_REVID=103334108
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java | 51 | ||||
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibraryRule.java | 6 |
2 files changed, 51 insertions, 6 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java index f8d41c3b4d..ea4188c24b 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java @@ -14,6 +14,7 @@ package com.google.devtools.build.lib.rules.objc; +import static com.google.devtools.build.lib.packages.ImplicitOutputsFunction.fromTemplates; import static com.google.devtools.build.lib.rules.objc.J2ObjcSource.SourceType; import static com.google.devtools.build.lib.rules.objc.ObjcProvider.DEFINE; import static com.google.devtools.build.lib.rules.objc.ObjcProvider.FORCE_LOAD_LIBRARY; @@ -65,6 +66,7 @@ import com.google.devtools.build.lib.analysis.actions.FileWriteAction; import com.google.devtools.build.lib.analysis.actions.ParameterFileWriteAction; import com.google.devtools.build.lib.analysis.actions.SpawnAction; import com.google.devtools.build.lib.collect.nestedset.NestedSet; +import com.google.devtools.build.lib.packages.ImplicitOutputsFunction.SafeImplicitOutputsFunction; import com.google.devtools.build.lib.packages.TargetUtils; import com.google.devtools.build.lib.packages.Type; import com.google.devtools.build.lib.rules.cpp.CppModuleMap; @@ -126,6 +128,12 @@ public final class CompilationSupport { }; /** + * Defines a library that contains the transitive closure of dependencies. + */ + public static final SafeImplicitOutputsFunction FULLY_LINKED_LIB = + fromTemplates("%{name}_fully_linked.a"); + + /** * Iterable wrapper providing strong type safety for arguments to binary linking. */ static final class ExtraLinkArgs extends IterableWrapper<String> { @@ -173,7 +181,8 @@ public final class CompilationSupport { * @param common common information about this rule and its dependencies * @return this compilation support */ - CompilationSupport registerCompileAndArchiveActions(ObjcCommon common) { + CompilationSupport registerCompileAndArchiveActions(ObjcCommon common) + throws InterruptedException { if (common.getCompilationArtifacts().isPresent()) { registerGenerateModuleMapAction(common.getCompilationArtifacts()); IntermediateArtifacts intermediateArtifacts = @@ -189,7 +198,8 @@ public final class CompilationSupport { intermediateArtifacts, common.getObjcProvider(), moduleMap, - ruleContext.getConfiguration().isCodeCoverageEnabled()); + ruleContext.getConfiguration().isCodeCoverageEnabled(), + true); } return this; } @@ -203,7 +213,8 @@ public final class CompilationSupport { IntermediateArtifacts intermediateArtifacts, ObjcProvider objcProvider, Optional<CppModuleMap> moduleMap, - boolean isCodeCoverageEnabled) { + boolean isCodeCoverageEnabled, + boolean isFullyLinkEnabled) throws InterruptedException { ImmutableList.Builder<Artifact> objFiles = new ImmutableList.Builder<>(); for (Artifact sourceFile : compilationArtifacts.getSrcs()) { Artifact objFile = intermediateArtifacts.objFile(sourceFile); @@ -243,6 +254,10 @@ public final class CompilationSupport { for (Artifact archive : compilationArtifacts.getArchive().asSet()) { registerArchiveActions(intermediateArtifacts, objFiles, archive); } + + if (isFullyLinkEnabled) { + registerFullyLinkAction(objcProvider); + } } private void registerCompileAction( @@ -503,6 +518,30 @@ public final class CompilationSupport { return actions.build(); } + private void registerFullyLinkAction(ObjcProvider objcProvider) throws InterruptedException { + ObjcConfiguration objcConfiguration = ObjcRuleClasses.objcConfiguration(ruleContext); + Artifact archive = ruleContext.getImplicitOutputArtifact(FULLY_LINKED_LIB); + + ImmutableList<Artifact> ccLibraries = ccLibraries(objcProvider); + ruleContext.registerAction(ObjcRuleClasses.spawnOnDarwinActionBuilder(ruleContext) + .setMnemonic("ObjcLink") + .setExecutable(ObjcRuleClasses.LIBTOOL) + .setCommandLine(new CustomCommandLine.Builder() + .add("-static") + .add("-arch_only").add(objcConfiguration.getIosCpu()) + .add("-syslibroot").add(IosSdkCommands.sdkDir(objcConfiguration)) + .add("-o").add(archive.getExecPathString()) + .addExecPaths(objcProvider.get(LIBRARY)) + .addExecPaths(objcProvider.get(IMPORTED_LIBRARY)) + .addExecPaths(ccLibraries) + .build()) + .addInputs(ccLibraries) + .addTransitiveInputs(objcProvider.get(LIBRARY)) + .addTransitiveInputs(objcProvider.get(IMPORTED_LIBRARY)) + .addOutput(archive) + .build(ruleContext)); + } + /** * Registers any actions necessary to link this rule and its dependencies. * @@ -785,7 +824,8 @@ public final class CompilationSupport { * * @return this compilation support */ - CompilationSupport registerJ2ObjcCompileAndArchiveActions(ObjcProvider objcProvider) { + CompilationSupport registerJ2ObjcCompileAndArchiveActions(ObjcProvider objcProvider) + throws InterruptedException { J2ObjcSrcsProvider provider = J2ObjcSrcsProvider.buildFrom(ruleContext); Iterable<J2ObjcSource> j2ObjcSources = provider.getSrcs(); J2ObjcConfiguration j2objcConfiguration = ruleContext.getFragment(J2ObjcConfiguration.class); @@ -828,7 +868,8 @@ public final class CompilationSupport { intermediateArtifacts, objcProvider, moduleMap, - ruleContext.getConfiguration().isCodeCoverageEnabled()); + ruleContext.getConfiguration().isCodeCoverageEnabled(), + false); } } diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibraryRule.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibraryRule.java index 62a72c4de0..c72d8d7431 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibraryRule.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibraryRule.java @@ -17,6 +17,7 @@ package com.google.devtools.build.lib.rules.objc; import com.google.devtools.build.lib.analysis.BaseRuleClasses; import com.google.devtools.build.lib.analysis.RuleDefinition; import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment; +import com.google.devtools.build.lib.packages.ImplicitOutputsFunction; import com.google.devtools.build.lib.packages.RuleClass; import com.google.devtools.build.lib.packages.RuleClass.Builder; @@ -33,9 +34,12 @@ public class ObjcLibraryRule implements RuleDefinition { <ul> <li><code><var>name</var>.xcodeproj/project.pbxproj</code>: An Xcode project file which can be used to develop or build on a Mac.</li> + <li><code>lib<var>name</var>_fully_linked.a</code>: A fully linked static library that + contains the full transitive closure of library dependencies.</li> </ul> <!-- #END_BLAZE_RULE.IMPLICIT_OUTPUTS -->*/ - .setImplicitOutputsFunction(XcodeSupport.PBXPROJ) + .setImplicitOutputsFunction(ImplicitOutputsFunction.fromFunctions( + CompilationSupport.FULLY_LINKED_LIB, XcodeSupport.PBXPROJ)) .build(); } |