From 02c490c19a56a1c4151544fca2e3f7a820ee2e51 Mon Sep 17 00:00:00 2001 From: Googler Date: Thu, 17 Sep 2015 22:53:38 +0000 Subject: 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 --- .../build/lib/rules/objc/CompilationSupport.java | 51 +++++++++++++++++++--- .../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; @@ -125,6 +127,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. */ @@ -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 moduleMap, - boolean isCodeCoverageEnabled) { + boolean isCodeCoverageEnabled, + boolean isFullyLinkEnabled) throws InterruptedException { ImmutableList.Builder 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 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 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 {
  • name.xcodeproj/project.pbxproj: An Xcode project file which can be used to develop or build on a Mac.
  • +
  • libname_fully_linked.a: A fully linked static library that + contains the full transitive closure of library dependencies.
*/ - .setImplicitOutputsFunction(XcodeSupport.PBXPROJ) + .setImplicitOutputsFunction(ImplicitOutputsFunction.fromFunctions( + CompilationSupport.FULLY_LINKED_LIB, XcodeSupport.PBXPROJ)) .build(); } -- cgit v1.2.3