diff options
author | Googler <noreply@google.com> | 2017-05-30 03:12:22 +0200 |
---|---|---|
committer | László Csomor <laszlocsomor@google.com> | 2017-05-30 09:57:20 +0200 |
commit | 29ec1b89989db411d2038e2df8657b6435f80403 (patch) | |
tree | 54a3b616c3a0a8905165bcb6379085ce6055824c /src | |
parent | 102ce6ddc04063d26165c6a2167059f2348026bf (diff) |
Change ProtobufSupport to use CrosstoolCompilationSupport if experimental_objc_crosstool=all
PiperOrigin-RevId: 157421008
Diffstat (limited to 'src')
7 files changed, 103 insertions, 44 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStaticLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStaticLibrary.java index 7d0ac8306b..428012ca99 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStaticLibrary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStaticLibrary.java @@ -117,7 +117,8 @@ public class AppleStaticLibrary implements RuleConfiguredTargetFactory { protosToAvoid, ImmutableList.<ProtoSourcesProvider>of(), objcProtoProviders, - ProtobufSupport.getTransitivePortableProtoFilters(objcProtoProviders)) + ProtobufSupport.getTransitivePortableProtoFilters(objcProtoProviders), + childConfigurationsAndToolchains.get(childConfig)) .registerGenerationActions() .registerCompilationActions(); 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 c64a9cc002..cac6791089 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 @@ -314,6 +314,7 @@ public abstract class CompilationSupport { protected final IntermediateArtifacts intermediateArtifacts; protected final boolean useDeps; protected final Map<String, NestedSet<Artifact>> outputGroupCollector; + protected final CcToolchainProvider toolchain; /** * Creates a new compilation support for the given rule and build configuration. @@ -334,7 +335,8 @@ public abstract class CompilationSupport { IntermediateArtifacts intermediateArtifacts, CompilationAttributes compilationAttributes, boolean useDeps, - Map<String, NestedSet<Artifact>> outputGroupCollector) { + Map<String, NestedSet<Artifact>> outputGroupCollector, + CcToolchainProvider toolchain) { this.ruleContext = ruleContext; this.buildConfiguration = buildConfiguration; this.objcConfiguration = buildConfiguration.getFragment(ObjcConfiguration.class); @@ -343,6 +345,18 @@ public abstract class CompilationSupport { this.intermediateArtifacts = intermediateArtifacts; this.useDeps = useDeps; this.outputGroupCollector = outputGroupCollector; + // TODO(b/62143697): Remove this check once all rules are using the crosstool support. + if (ruleContext + .attributes() + .has(CcToolchain.CC_TOOLCHAIN_DEFAULT_ATTRIBUTE_NAME, BuildType.LABEL)) { + if (toolchain == null) { + toolchain = CppHelper.getToolchainUsingDefaultCcToolchainAttribute(ruleContext); + } + this.toolchain = toolchain; + } else { + // Since the rule context doesn't have a toolchain at all, ignore any provided override. + this.toolchain = null; + } } /** Builder for {@link CompilationSupport} */ @@ -354,6 +368,7 @@ public abstract class CompilationSupport { private boolean useDeps = true; private Map<String, NestedSet<Artifact>> outputGroupCollector; private boolean isObjcLibrary = false; + private CcToolchainProvider toolchain; /** Sets the {@link RuleContext} for the calling target. */ public Builder setRuleContext(RuleContext ruleContext) { @@ -411,6 +426,17 @@ public abstract class CompilationSupport { } /** + * Sets {@link CcToolchainProvider} for the calling target. + * + * <p>This is needed if it can't correctly be inferred directly from the rule context. Setting + * to null causes the default to be used as if this was never called. + */ + public Builder setToolchainProvider(CcToolchainProvider toolchain) { + this.toolchain = toolchain; + return this; + } + + /** * Returns a {@link CompilationSupport} instance. This is either a {@link * CrosstoolCompilationSupport} or {@link LegacyCompilationSupport} depending on the value of * --experimental_objc_crosstool. @@ -445,7 +471,8 @@ public abstract class CompilationSupport { intermediateArtifacts, compilationAttributes, useDeps, - outputGroupCollector); + outputGroupCollector, + toolchain); } else { return new LegacyCompilationSupport( ruleContext, @@ -453,7 +480,8 @@ public abstract class CompilationSupport { intermediateArtifacts, compilationAttributes, useDeps, - outputGroupCollector); + outputGroupCollector, + toolchain); } } } @@ -474,7 +502,7 @@ public abstract class CompilationSupport { objcProvider, ExtraCompileArgs.NONE, ImmutableList.<PathFragment>of(), - maybeGetCcToolchain(), + toolchain, maybeGetFdoSupport()); } @@ -555,7 +583,7 @@ public abstract class CompilationSupport { return registerFullyLinkAction( objcProvider, outputArchive, - maybeGetCcToolchain(), + toolchain, maybeGetFdoSupport()); } @@ -613,7 +641,7 @@ public abstract class CompilationSupport { objcProvider, inputArtifacts, outputArchive, - maybeGetCcToolchain(), + toolchain, maybeGetFdoSupport()); } @@ -788,7 +816,7 @@ public abstract class CompilationSupport { common.getObjcProvider(), extraCompileArgs, priorityHeaders, - maybeGetCcToolchain(), + toolchain, maybeGetFdoSupport()); } return this; @@ -1464,18 +1492,6 @@ public abstract class CompilationSupport { } @Nullable - private CcToolchainProvider maybeGetCcToolchain() { - // TODO(rduan): Remove this check once all rules are using the crosstool support. - if (ruleContext - .attributes() - .has(CcToolchain.CC_TOOLCHAIN_DEFAULT_ATTRIBUTE_NAME, BuildType.LABEL)) { - return CppHelper.getToolchainUsingDefaultCcToolchainAttribute(ruleContext); - } else { - return null; - } - } - - @Nullable private FdoSupportProvider maybeGetFdoSupport() { // TODO(rduan): Remove this check once all rules are using the crosstool support. if (ruleContext diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/CrosstoolCompilationSupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/CrosstoolCompilationSupport.java index 13e7fba93c..50bceaa339 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/CrosstoolCompilationSupport.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/CrosstoolCompilationSupport.java @@ -133,7 +133,8 @@ public class CrosstoolCompilationSupport extends CompilationSupport { ObjcRuleClasses.intermediateArtifacts(ruleContext), CompilationAttributes.Builder.fromRuleContext(ruleContext).build(), /*useDeps=*/ true, - outputGroupCollector); + outputGroupCollector, + null); } /** @@ -144,6 +145,7 @@ public class CrosstoolCompilationSupport extends CompilationSupport { * @param intermediateArtifacts IntermediateArtifacts for deriving artifact paths * @param compilationAttributes attributes of the calling target * @param useDeps true if deps should be used + * @param toolchain if not null overrides the default toolchain from the ruleContext. */ public CrosstoolCompilationSupport( RuleContext ruleContext, @@ -151,14 +153,16 @@ public class CrosstoolCompilationSupport extends CompilationSupport { IntermediateArtifacts intermediateArtifacts, CompilationAttributes compilationAttributes, boolean useDeps, - Map<String, NestedSet<Artifact>> outputGroupCollector) { + Map<String, NestedSet<Artifact>> outputGroupCollector, + CcToolchainProvider toolchain) { super( ruleContext, buildConfiguration, intermediateArtifacts, compilationAttributes, useDeps, - outputGroupCollector); + outputGroupCollector, + toolchain); } @Override @@ -184,18 +188,28 @@ public class CrosstoolCompilationSupport extends CompilationSupport { // TODO(b/30783125): Signal the need for this action in the CROSSTOOL. registerObjFilelistAction(getObjFiles(compilationArtifacts, intermediateArtifacts), objList); - + extension.addVariableCategory(VariableCategory.ARCHIVE_VARIABLES); - + helper = createCcLibraryHelper( - objcProvider, compilationArtifacts, extension.build(), ccToolchain, fdoSupport) + objcProvider, + compilationArtifacts, + extension.build(), + ccToolchain, + fdoSupport, + priorityHeaders) .setLinkType(LinkTargetType.OBJC_ARCHIVE) .addLinkActionInput(objList); } else { helper = createCcLibraryHelper( - objcProvider, compilationArtifacts, extension.build(), ccToolchain, fdoSupport); + objcProvider, + compilationArtifacts, + extension.build(), + ccToolchain, + fdoSupport, + priorityHeaders); } Info info = helper.build(); @@ -375,7 +389,8 @@ public class CrosstoolCompilationSupport extends CompilationSupport { CompilationArtifacts compilationArtifacts, VariablesExtension extension, CcToolchainProvider ccToolchain, - FdoSupportProvider fdoSupport) { + FdoSupportProvider fdoSupport, + Iterable<PathFragment> priorityHeaders) { PrecompiledFiles precompiledFiles = new PrecompiledFiles(ruleContext); Collection<Artifact> arcSources = ImmutableSortedSet.copyOf(compilationArtifacts.getSrcs()); Collection<Artifact> nonArcSources = @@ -394,7 +409,8 @@ public class CrosstoolCompilationSupport extends CompilationSupport { createIncludeProcessing(privateHdrs, objcProvider, pchHdr), ruleContext.getFragment(ObjcConfiguration.class), isHeaderThinningEnabled(), - intermediateArtifacts); + intermediateArtifacts, + buildConfiguration); CcLibraryHelper result = new CcLibraryHelper( ruleContext, @@ -417,6 +433,7 @@ public class CrosstoolCompilationSupport extends CompilationSupport { // generate C++ protos. .setCheckDepsGenerateCpp(false) .addCopts(getCompileRuleCopts()) + .addIncludeDirs(priorityHeaders) .addIncludeDirs(objcProvider.get(INCLUDE)) .addCopts(ruleContext.getFragment(ObjcConfiguration.class).getCoptsForCompilationMode()) .addSystemIncludeDirs(objcProvider.get(INCLUDE_SYSTEM)) diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/LegacyCompilationSupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/LegacyCompilationSupport.java index bb225915bf..169b7a6756 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/LegacyCompilationSupport.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/LegacyCompilationSupport.java @@ -147,14 +147,16 @@ public class LegacyCompilationSupport extends CompilationSupport { IntermediateArtifacts intermediateArtifacts, CompilationAttributes compilationAttributes, boolean useDeps, - Map<String, NestedSet<Artifact>> outputGroupCollector) { + Map<String, NestedSet<Artifact>> outputGroupCollector, + CcToolchainProvider toolchain) { super( ruleContext, buildConfiguration, intermediateArtifacts, compilationAttributes, useDeps, - outputGroupCollector); + outputGroupCollector, + toolchain); } @Override diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/MultiArchBinarySupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/MultiArchBinarySupport.java index a7c47d8183..a2cd8439ae 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/MultiArchBinarySupport.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/MultiArchBinarySupport.java @@ -227,7 +227,8 @@ public class MultiArchBinarySupport { protosToAvoid, ImmutableList.<ProtoSourcesProvider>of(), objcProtoProviders, - ProtobufSupport.getTransitivePortableProtoFilters(objcProtoProviders)) + ProtobufSupport.getTransitivePortableProtoFilters(objcProtoProviders), + childConfigurationsAndToolchains.get(childConfig)) .registerGenerationActions() .registerCompilationActions(); protosObjcProvider = protoSupport.getObjcProvider(); diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCppSemantics.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCppSemantics.java index 903f09bd8e..8b725dc850 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCppSemantics.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCppSemantics.java @@ -22,6 +22,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.analysis.RuleContext; +import com.google.devtools.build.lib.analysis.config.BuildConfiguration; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.rules.cpp.CppCompilationContext.Builder; import com.google.devtools.build.lib.rules.cpp.CppCompileActionBuilder; @@ -45,6 +46,7 @@ public class ObjcCppSemantics implements CppSemantics { private final ObjcConfiguration config; private final boolean isHeaderThinningEnabled; private final IntermediateArtifacts intermediateArtifacts; + private final BuildConfiguration buildConfiguration; /** * Set of {@link com.google.devtools.build.lib.util.FileType} of source artifacts that are @@ -68,18 +70,21 @@ public class ObjcCppSemantics implements CppSemantics { * @param isHeaderThinningEnabled true if headers_list artifacts should be generated and added as * input to compiling actions * @param intermediateArtifacts used to create headers_list artifacts + * @param buildConfiguration the build configuration for this build */ public ObjcCppSemantics( ObjcProvider objcProvider, IncludeProcessing includeProcessing, ObjcConfiguration config, boolean isHeaderThinningEnabled, - IntermediateArtifacts intermediateArtifacts) { + IntermediateArtifacts intermediateArtifacts, + BuildConfiguration buildConfiguration) { this.objcProvider = objcProvider; this.includeProcessing = includeProcessing; this.config = config; this.isHeaderThinningEnabled = isHeaderThinningEnabled; this.intermediateArtifacts = intermediateArtifacts; + this.buildConfiguration = buildConfiguration; } @Override @@ -131,6 +136,14 @@ public class ObjcCppSemantics implements CppSemantics { ObjcCommon.userHeaderSearchPaths(objcProvider, ruleContext.getConfiguration())) { contextBuilder.addQuoteIncludeDir(iquotePath); } + + // ProtoSupport creates multiple compilation contexts for a single rule, potentially multiple + // archives per build configuration. This covers that worst case. + contextBuilder.setPurpose( + "ObjcCppSemantics_build_arch_" + + buildConfiguration.getMnemonic() + + "_with_suffix_" + + intermediateArtifacts.archiveFileNameSuffix()); } @Override diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ProtobufSupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ProtobufSupport.java index 344c3a853f..6b5c85c25d 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ProtobufSupport.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ProtobufSupport.java @@ -38,12 +38,12 @@ import com.google.devtools.build.lib.cmdline.LabelSyntaxException; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; +import com.google.devtools.build.lib.rules.cpp.CcToolchainProvider; import com.google.devtools.build.lib.rules.proto.ProtoSourcesProvider; import com.google.devtools.build.lib.vfs.FileSystemUtils; import com.google.devtools.build.lib.vfs.PathFragment; import java.util.HashMap; import java.util.Set; -import java.util.TreeMap; /** * Support for generating Objective C proto static libraries that registers actions which generate @@ -76,6 +76,7 @@ final class ProtobufSupport { private final Set<Artifact> dylibHandledProtos; private final Iterable<ObjcProtoProvider> objcProtoProviders; private final NestedSet<Artifact> portableProtoFilters; + private final CcToolchainProvider toolchain; // Each entry of this map represents a generation action and a compilation action. The input set // are dependencies of the output set. The output set is always a subset of, or the same set as, @@ -117,7 +118,8 @@ final class ProtobufSupport { NestedSetBuilder.<Artifact>stableOrder().build(), protoProviders, objcProtoProviders, - portableProtoFilters); + portableProtoFilters, + null); } /** @@ -134,6 +136,8 @@ final class ProtobufSupport { * symbols * @param protoProviders the list of ProtoSourcesProviders that this proto support should process * @param objcProtoProviders the list of ObjcProtoProviders that this proto support should process + * @param toolchain if not null, the toolchain to override the default toolchain for the rule + * context. */ public ProtobufSupport( RuleContext ruleContext, @@ -141,7 +145,8 @@ final class ProtobufSupport { NestedSet<Artifact> dylibHandledProtos, Iterable<ProtoSourcesProvider> protoProviders, Iterable<ObjcProtoProvider> objcProtoProviders, - NestedSet<Artifact> portableProtoFilters) { + NestedSet<Artifact> portableProtoFilters, + CcToolchainProvider toolchain) { this.ruleContext = ruleContext; this.buildConfiguration = buildConfiguration; this.attributes = new ProtoAttributes(ruleContext); @@ -151,6 +156,7 @@ final class ProtobufSupport { this.intermediateArtifacts = ObjcRuleClasses.intermediateArtifacts(ruleContext, buildConfiguration); this.inputsToOutputsMap = getInputsToOutputsMap(attributes, protoProviders, objcProtoProviders); + this.toolchain = toolchain; } /** @@ -209,14 +215,17 @@ final class ProtobufSupport { ObjcCommon common = getCommon(intermediateArtifacts, compilationArtifacts); - new LegacyCompilationSupport( - ruleContext, - buildConfiguration, - intermediateArtifacts, - new CompilationAttributes.Builder().build(), - /*useDeps=*/ false, - new TreeMap<String, NestedSet<Artifact>>()) - .registerCompileAndArchiveActions(common, userHeaderSearchPaths); + CompilationSupport compilationSupport = + new CompilationSupport.Builder() + .setRuleContext(ruleContext) + .setConfig(buildConfiguration) + .setIntermediateArtifacts(intermediateArtifacts) + .setCompilationAttributes(new CompilationAttributes.Builder().build()) + .setToolchainProvider(toolchain) + .doNotUseDeps() + .build(); + + compilationSupport.registerCompileAndArchiveActions(common, userHeaderSearchPaths); actionId++; } |