diff options
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java | 86 |
1 files changed, 76 insertions, 10 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 b9e28b4ffb..ed19ace0c9 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 @@ -65,9 +65,12 @@ import com.google.devtools.build.lib.rules.apple.AppleConfiguration; import com.google.devtools.build.lib.rules.apple.AppleToolchain; import com.google.devtools.build.lib.rules.apple.Platform; import com.google.devtools.build.lib.rules.apple.Platform.PlatformType; +import com.google.devtools.build.lib.rules.cpp.CcToolchainProvider; import com.google.devtools.build.lib.rules.cpp.CppFileTypes; +import com.google.devtools.build.lib.rules.cpp.CppHelper; import com.google.devtools.build.lib.rules.cpp.CppModuleMap; import com.google.devtools.build.lib.rules.cpp.CppModuleMapAction; +import com.google.devtools.build.lib.rules.cpp.FdoSupportProvider; import com.google.devtools.build.lib.rules.objc.ObjcCommandLineOptions.ObjcCrosstoolMode; import com.google.devtools.build.lib.rules.objc.XcodeProvider.Builder; import com.google.devtools.build.lib.rules.test.InstrumentedFilesCollector; @@ -81,6 +84,7 @@ import com.google.devtools.build.lib.vfs.PathFragment; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; +import javax.annotation.Nullable; /** * Support for rules that compile sources. Provides ways to determine files that should be output, @@ -367,7 +371,7 @@ public abstract class CompilationSupport { * @param intermediateArtifacts IntermediateArtifacts for deriving artifact paths * @param compilationAttributes attributes of the calling target */ - private static CompilationSupport createWithSelectedImplementation( + static CompilationSupport createWithSelectedImplementation( RuleContext ruleContext, BuildConfiguration buildConfiguration, IntermediateArtifacts intermediateArtifacts, @@ -392,8 +396,12 @@ public abstract class CompilationSupport { CompilationArtifacts compilationArtifacts, ObjcProvider objcProvider) throws RuleErrorException, InterruptedException { return registerCompileAndArchiveActions( - compilationArtifacts, objcProvider, ExtraCompileArgs.NONE, - ImmutableList.<PathFragment>of()); + compilationArtifacts, + objcProvider, + ExtraCompileArgs.NONE, + ImmutableList.<PathFragment>of(), + maybeGetCcToolchain(), + maybeGetFdoSupport()); } /** @@ -447,11 +455,35 @@ public abstract class CompilationSupport { */ public CompilationSupport registerFullyLinkAction( ObjcProvider objcProvider, Artifact outputArchive) throws InterruptedException { + return registerFullyLinkAction( + objcProvider, + outputArchive, + maybeGetCcToolchain(), + maybeGetFdoSupport()); + } + + /** + * Registers an action to create an archive artifact by fully (statically) linking all transitive + * dependencies of this rule. + * + * @param objcProvider provides all compiling and linking information to create this artifact + * @param outputArchive the output artifact for this action + * @param ccToolchain the cpp toolchain provider, may be null + * @param fdoSupport the cpp FDO support provider, may be null + */ + public CompilationSupport registerFullyLinkAction( + ObjcProvider objcProvider, Artifact outputArchive, @Nullable CcToolchainProvider ccToolchain, + @Nullable FdoSupportProvider fdoSupport) throws InterruptedException { ImmutableList<Artifact> inputArtifacts = ImmutableList.<Artifact>builder() .addAll(objcProvider.getObjcLibraries()) .addAll(objcProvider.get(IMPORTED_LIBRARY)) .addAll(objcProvider.getCcLibraries()).build(); - return registerFullyLinkAction(objcProvider, inputArtifacts, outputArchive); + return registerFullyLinkAction( + objcProvider, + inputArtifacts, + outputArchive, + ccToolchain, + fdoSupport); } /** @@ -480,7 +512,12 @@ public abstract class CompilationSupport { Iterable<Artifact> inputArtifacts = Iterables.filter(depsArtifacts, Predicates.not(Predicates.in(avoidsDepsArtifacts.build()))); - return registerFullyLinkAction(objcProvider, inputArtifacts, outputArchive); + return registerFullyLinkAction( + objcProvider, + inputArtifacts, + outputArchive, + maybeGetCcToolchain(), + maybeGetFdoSupport()); } /** @@ -619,12 +656,15 @@ public abstract class CompilationSupport { * @param objcProvider provides all compiling and linking information to register these actions * @param extraCompileArgs args to be added to compile actions * @param priorityHeaders priority headers to be included before the dependency headers + * @param ccToolchain the cpp toolchain provider, may be null + * @param fdoSupport the cpp FDO support provider, may be null * @return this compilation support * @throws RuleErrorException for invalid crosstool files */ abstract CompilationSupport registerCompileAndArchiveActions( CompilationArtifacts compilationArtifacts, ObjcProvider objcProvider, - ExtraCompileArgs extraCompileArgs, Iterable<PathFragment> priorityHeaders) + ExtraCompileArgs extraCompileArgs, Iterable<PathFragment> priorityHeaders, + @Nullable CcToolchainProvider ccToolchain, @Nullable FdoSupportProvider fdoSupport) throws RuleErrorException, InterruptedException; /** @@ -640,12 +680,16 @@ public abstract class CompilationSupport { ObjcCommon common, ExtraCompileArgs extraCompileArgs, Iterable<PathFragment> priorityHeaders) throws RuleErrorException, InterruptedException { if (common.getCompilationArtifacts().isPresent()) { - registerCompileAndArchiveActions(common.getCompilationArtifacts().get(), - common.getObjcProvider(), extraCompileArgs, priorityHeaders); + registerCompileAndArchiveActions( + common.getCompilationArtifacts().get(), + common.getObjcProvider(), + extraCompileArgs, + priorityHeaders, + maybeGetCcToolchain(), + maybeGetFdoSupport()); } return this; } - /** * Registers any actions necessary to link this rule and its dependencies. * @@ -743,10 +787,13 @@ public abstract class CompilationSupport { * @param objcProvider provides all compiling and linking information to create this artifact * @param inputArtifacts inputs for this action * @param outputArchive the output artifact for this action + * @param ccToolchain the cpp toolchain provider, may be null + * @param fdoSupport the cpp FDO support provider, may be null * @return this {@link CompilationSupport} instance */ protected abstract CompilationSupport registerFullyLinkAction( - ObjcProvider objcProvider, Iterable<Artifact> inputArtifacts, Artifact outputArchive) + ObjcProvider objcProvider, Iterable<Artifact> inputArtifacts, Artifact outputArchive, + @Nullable CcToolchainProvider ccToolchain, @Nullable FdoSupportProvider fdoSupport) throws InterruptedException; /** @@ -1028,4 +1075,23 @@ public abstract class CompilationSupport { .getProvider(FilesToRunProvider.class); } + @Nullable + private CcToolchainProvider maybeGetCcToolchain() { + // TODO(rduan): Remove this check once all rules are using the crosstool support. + if (ruleContext.attributes().has(":cc_toolchain", BuildType.LABEL)) { + return CppHelper.getToolchain(ruleContext, ":cc_toolchain"); + } else { + return null; + } + } + + @Nullable + private FdoSupportProvider maybeGetFdoSupport() { + // TODO(rduan): Remove this check once all rules are using the crosstool support. + if (ruleContext.attributes().has(":cc_toolchain", BuildType.LABEL)) { + return CppHelper.getFdoSupport(ruleContext, ":cc_toolchain"); + } else { + return null; + } + } } |