aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/rules
diff options
context:
space:
mode:
authorGravatar Googler <noreply@google.com>2015-09-17 22:53:38 +0000
committerGravatar Damien Martin-Guillerez <dmarting@google.com>2015-09-21 08:55:16 +0000
commit02c490c19a56a1c4151544fca2e3f7a820ee2e51 (patch)
treee8b7c4e756211ac93f44719aa4a272f98b443918 /src/main/java/com/google/devtools/build/lib/rules
parent261035fdae0455e95087c031807931bf24aa133e (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
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/CompilationSupport.java51
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibraryRule.java6
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();
}