From 65959f53f74a8d0b7cba4a2adc7ed2bdfa1ea0ff Mon Sep 17 00:00:00 2001 From: hlopko Date: Fri, 29 Sep 2017 07:31:12 -0400 Subject: Pass CppSemantics down to the CppLinkActionBuilder Currently CppLinkActionBuilder is not using CppSemantics, but it will when we use full CppCompileAction for linkstamp compiles. This cl is a preparation for that. RELNOTES: None. PiperOrigin-RevId: 170467826 --- .../bazel/rules/android/BazelAndroidBinary.java | 7 +++++ .../build/lib/rules/android/AndroidBinary.java | 36 +++++++++++++--------- .../build/lib/rules/android/NativeLibs.java | 7 +++-- .../devtools/build/lib/rules/cpp/CcBinary.java | 9 ++++-- .../build/lib/rules/cpp/CppLinkActionBuilder.java | 27 +++++++++++----- .../devtools/build/lib/rules/cpp/CppModel.java | 2 +- .../lib/rules/nativedeps/NativeDepsHelper.java | 29 +++++++++++------ .../rules/objc/CrosstoolCompilationSupport.java | 30 +++++++++++------- 8 files changed, 100 insertions(+), 47 deletions(-) (limited to 'src/main/java/com') diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/BazelAndroidBinary.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/BazelAndroidBinary.java index 4f5d8c9ea0..5d9183b8d0 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/BazelAndroidBinary.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/BazelAndroidBinary.java @@ -13,9 +13,11 @@ // limitations under the License. package com.google.devtools.build.lib.bazel.rules.android; +import com.google.devtools.build.lib.bazel.rules.cpp.BazelCppSemantics; import com.google.devtools.build.lib.bazel.rules.java.BazelJavaSemantics; import com.google.devtools.build.lib.rules.android.AndroidBinary; import com.google.devtools.build.lib.rules.android.AndroidSemantics; +import com.google.devtools.build.lib.rules.cpp.CppSemantics; import com.google.devtools.build.lib.rules.java.JavaSemantics; /** @@ -31,4 +33,9 @@ public class BazelAndroidBinary extends AndroidBinary { protected AndroidSemantics createAndroidSemantics() { return BazelAndroidSemantics.INSTANCE; } + + @Override + protected CppSemantics createCppSemantics() { + return BazelCppSemantics.INSTANCE; + } } diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java index dd9ed457ce..39041a2d6b 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java @@ -59,6 +59,7 @@ import com.google.devtools.build.lib.rules.android.AndroidConfiguration.AndroidB import com.google.devtools.build.lib.rules.android.AndroidRuleClasses.MultidexMode; import com.google.devtools.build.lib.rules.cpp.CcToolchainProvider; import com.google.devtools.build.lib.rules.cpp.CppHelper; +import com.google.devtools.build.lib.rules.cpp.CppSemantics; import com.google.devtools.build.lib.rules.java.DeployArchiveBuilder; import com.google.devtools.build.lib.rules.java.JavaCommon; import com.google.devtools.build.lib.rules.java.JavaConfiguration; @@ -91,9 +92,12 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { protected abstract JavaSemantics createJavaSemantics(); protected abstract AndroidSemantics createAndroidSemantics(); + protected abstract CppSemantics createCppSemantics(); + @Override public ConfiguredTarget create(RuleContext ruleContext) throws InterruptedException, RuleErrorException { + CppSemantics cppSemantics = createCppSemantics(); JavaSemantics javaSemantics = createJavaSemantics(); AndroidSemantics androidSemantics = createAndroidSemantics(); if (!AndroidSdkProvider.verifyPresence(ruleContext)) { @@ -106,19 +110,21 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { javaSemantics.checkRule(ruleContext, javaCommon); javaSemantics.checkForProtoLibraryAndJavaProtoLibraryOnSameProto(ruleContext, javaCommon); - AndroidCommon androidCommon = new AndroidCommon( - javaCommon, true /* asNeverLink */, true /* exportDeps */); - ResourceDependencies resourceDeps = LocalResourceContainer.definesAndroidResources( - ruleContext.attributes()) - ? ResourceDependencies.fromRuleDeps(ruleContext, false /* neverlink */) - : ResourceDependencies.fromRuleResourceAndDeps(ruleContext, false /* neverlink */); - RuleConfiguredTargetBuilder builder = init( - ruleContext, - filesBuilder, - resourceDeps, - androidCommon, - javaSemantics, - androidSemantics); + AndroidCommon androidCommon = + new AndroidCommon(javaCommon, /* asNeverLink= */ true, /* exportDeps= */ true); + ResourceDependencies resourceDeps = + LocalResourceContainer.definesAndroidResources(ruleContext.attributes()) + ? ResourceDependencies.fromRuleDeps(ruleContext, /* neverlink= */ false) + : ResourceDependencies.fromRuleResourceAndDeps(ruleContext, /* neverlink= */ false); + RuleConfiguredTargetBuilder builder = + init( + ruleContext, + filesBuilder, + resourceDeps, + androidCommon, + cppSemantics, + javaSemantics, + androidSemantics); return builder.build(); } @@ -172,6 +178,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { NestedSetBuilder filesBuilder, ResourceDependencies resourceDeps, AndroidCommon androidCommon, + CppSemantics cppSemantics, JavaSemantics javaSemantics, AndroidSemantics androidSemantics) throws InterruptedException, RuleErrorException { @@ -206,7 +213,8 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { androidSemantics.getNativeDepsFileName(), depsByArchitecture, toolchainMap, - configurationMap); + configurationMap, + cppSemantics); // TODO(bazel-team): Resolve all the different cases of resource handling so this conditional // can go away: recompile from android_resources, and recompile from android_binary attributes. diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/NativeLibs.java b/src/main/java/com/google/devtools/build/lib/rules/android/NativeLibs.java index 32a7c721d5..44e395f526 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/NativeLibs.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/NativeLibs.java @@ -33,6 +33,7 @@ import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.rules.cpp.CcLinkParams; 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.CppSemantics; import com.google.devtools.build.lib.rules.cpp.LinkerInput; import com.google.devtools.build.lib.rules.nativedeps.NativeDepsHelper; import com.google.devtools.build.lib.util.Pair; @@ -56,7 +57,8 @@ public final class NativeLibs { String nativeDepsFileName, Multimap depsByArchitecture, Map toolchainMap, - Map configurationMap) + Map configurationMap, + CppSemantics cppSemantics) throws InterruptedException { Map> result = new LinkedHashMap<>(); String nativeDepsLibraryBasename = null; @@ -73,7 +75,8 @@ public final class NativeLibs { ruleContext, linkParams, configurationMap.get(entry.getKey()), - toolchainMap.get(entry.getKey())); + toolchainMap.get(entry.getKey()), + cppSemantics); NestedSetBuilder librariesBuilder = NestedSetBuilder.stableOrder(); if (nativeDepsLibrary != null) { diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java index 6b00ae0d69..416cf4612f 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java @@ -261,7 +261,8 @@ public abstract class CcBinary implements RuleConfiguredTargetFactory { fake, binary, linkParams, - linkCompileOutputSeparately); + linkCompileOutputSeparately, + semantics); linkActionBuilder.setUseTestOnlyFlags(ruleContext.isTestTarget()); if (linkStaticness == LinkStaticness.DYNAMIC) { linkActionBuilder.setRuntimeInputs( @@ -525,10 +526,12 @@ public abstract class CcBinary implements RuleConfiguredTargetFactory { boolean fake, Artifact binary, CcLinkParams linkParams, - boolean linkCompileOutputSeparately) + boolean linkCompileOutputSeparately, + CppSemantics cppSemantics) throws InterruptedException { CppLinkActionBuilder builder = - new CppLinkActionBuilder(context, binary, toolchain, fdoSupport, featureConfiguration) + new CppLinkActionBuilder( + context, binary, toolchain, fdoSupport, featureConfiguration, cppSemantics) .setCrosstoolInputs(toolchain.getLink()) .addNonCodeInputs(compilationPrerequisites); diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionBuilder.java index b0ffed1255..6af0118e78 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionBuilder.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionBuilder.java @@ -163,6 +163,7 @@ public class CppLinkActionBuilder { @Nullable private final RuleContext ruleContext; private final AnalysisEnvironment analysisEnvironment; private final Artifact output; + private final CppSemantics unusedCppSemantics; @Nullable private String mnemonic; // can be null for CppLinkAction.createTestBuilder() @@ -215,13 +216,15 @@ public class CppLinkActionBuilder { * @param output the output artifact * @param toolchain the C++ toolchain provider * @param fdoSupport the C++ FDO optimization support + * @param cppSemantics to be used for linkstamp compiles */ public CppLinkActionBuilder( RuleContext ruleContext, Artifact output, CcToolchainProvider toolchain, FdoSupportProvider fdoSupport, - FeatureConfiguration featureConfiguration) { + FeatureConfiguration featureConfiguration, + CppSemantics cppSemantics) { this( ruleContext, output, @@ -229,7 +232,8 @@ public class CppLinkActionBuilder { ruleContext.getAnalysisEnvironment(), toolchain, fdoSupport, - featureConfiguration); + featureConfiguration, + cppSemantics); } /** @@ -240,6 +244,7 @@ public class CppLinkActionBuilder { * @param configuration build configuration * @param toolchain C++ toolchain provider * @param fdoSupport the C++ FDO optimization support + * @param cppSemantics to be used for linkstamp compiles */ public CppLinkActionBuilder( RuleContext ruleContext, @@ -247,7 +252,8 @@ public class CppLinkActionBuilder { BuildConfiguration configuration, CcToolchainProvider toolchain, FdoSupportProvider fdoSupport, - FeatureConfiguration featureConfiguration) { + FeatureConfiguration featureConfiguration, + CppSemantics cppSemantics) { this( ruleContext, output, @@ -255,7 +261,8 @@ public class CppLinkActionBuilder { ruleContext.getAnalysisEnvironment(), toolchain, fdoSupport, - featureConfiguration); + featureConfiguration, + cppSemantics); } /** @@ -267,6 +274,7 @@ public class CppLinkActionBuilder { * options * @param toolchain the C++ toolchain provider * @param fdoSupport the C++ FDO optimization support + * @param cppSemantics to be used for linkstamp compiles */ private CppLinkActionBuilder( @Nullable RuleContext ruleContext, @@ -275,7 +283,8 @@ public class CppLinkActionBuilder { AnalysisEnvironment analysisEnvironment, CcToolchainProvider toolchain, FdoSupportProvider fdoSupport, - FeatureConfiguration featureConfiguration) { + FeatureConfiguration featureConfiguration, + CppSemantics cppSemantics) { this.ruleContext = ruleContext; this.analysisEnvironment = Preconditions.checkNotNull(analysisEnvironment); this.output = Preconditions.checkNotNull(output); @@ -287,6 +296,7 @@ public class CppLinkActionBuilder { runtimeSolibDir = toolchain.getDynamicRuntimeSolibDir(); } this.featureConfiguration = featureConfiguration; + this.unusedCppSemantics = Preconditions.checkNotNull(cppSemantics); } /** @@ -299,6 +309,7 @@ public class CppLinkActionBuilder { * @param configuration build configuration * @param toolchain the C++ toolchain provider * @param fdoSupport the C++ FDO optimization support + * @param cppSemantics to be used for linkstamp compiles */ public CppLinkActionBuilder( RuleContext ruleContext, @@ -307,7 +318,8 @@ public class CppLinkActionBuilder { BuildConfiguration configuration, CcToolchainProvider toolchain, FdoSupportProvider fdoSupport, - FeatureConfiguration featureConfiguration) { + FeatureConfiguration featureConfiguration, + CppSemantics cppSemantics) { // These Builder-only fields get set in the constructor: // ruleContext, analysisEnvironment, outputPath, configuration, runtimeSolibDir this( @@ -317,7 +329,8 @@ public class CppLinkActionBuilder { ruleContext.getAnalysisEnvironment(), toolchain, fdoSupport, - featureConfiguration); + featureConfiguration, + cppSemantics); Preconditions.checkNotNull(linkContext); // All linkContext fields should be transferred to this Builder. diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppModel.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppModel.java index 2038daba89..d191ed85d0 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppModel.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppModel.java @@ -1520,7 +1520,7 @@ public final class CppModel { private CppLinkActionBuilder newLinkActionBuilder(Artifact outputArtifact) { return new CppLinkActionBuilder( - ruleContext, outputArtifact, ccToolchain, fdoSupport, featureConfiguration) + ruleContext, outputArtifact, ccToolchain, fdoSupport, featureConfiguration, semantics) .setCrosstoolInputs(ccToolchain.getLink()) .addNonCodeInputs(context.getTransitiveCompilationPrerequisites()); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/nativedeps/NativeDepsHelper.java b/src/main/java/com/google/devtools/build/lib/rules/nativedeps/NativeDepsHelper.java index e63576ea65..2c8cf58886 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/nativedeps/NativeDepsHelper.java +++ b/src/main/java/com/google/devtools/build/lib/rules/nativedeps/NativeDepsHelper.java @@ -33,6 +33,7 @@ import com.google.devtools.build.lib.rules.cpp.CppHelper; import com.google.devtools.build.lib.rules.cpp.CppLinkAction; import com.google.devtools.build.lib.rules.cpp.CppLinkActionBuilder; import com.google.devtools.build.lib.rules.cpp.CppRuleClasses; +import com.google.devtools.build.lib.rules.cpp.CppSemantics; import com.google.devtools.build.lib.rules.cpp.FdoSupportProvider; import com.google.devtools.build.lib.rules.cpp.Link; import com.google.devtools.build.lib.rules.cpp.Link.LinkStaticness; @@ -91,13 +92,14 @@ public abstract class NativeDepsHelper { *

linkshared=1 means we prefer the ".pic.a" files to the ".a" files, and the LinkTargetType is * set to DYNAMIC_LIBRARY which causes Link.java to include "-shared" in the linker options. * - *

It is possible that this function may have no work to do if there are no native libraries - * in the transitive closure, or if the only native libraries in the transitive closure are - * already shared libraries. In this case, this function returns {@code null}. + *

It is possible that this function may have no work to do if there are no native libraries in + * the transitive closure, or if the only native libraries in the transitive closure are already + * shared libraries. In this case, this function returns {@code null}. * * @param ruleContext the rule context to determine the native deps library * @param linkParams the {@link CcLinkParams} for the rule, collected with linkstatic = 1 and * linkshared = 1 + * @param cppSemantics to use for linkstamp compiles * @return the native deps library, or null if there was no code which needed to be linked in the * transitive closure. */ @@ -105,7 +107,8 @@ public abstract class NativeDepsHelper { final RuleContext ruleContext, CcLinkParams linkParams, final BuildConfiguration configuration, - CcToolchainProvider toolchain) + CcToolchainProvider toolchain, + CppSemantics cppSemantics) throws InterruptedException { if (!containsCodeToLink(linkParams.getLibraries())) { return null; @@ -121,14 +124,15 @@ public abstract class NativeDepsHelper { return createNativeDepsAction( ruleContext, - linkParams, /** extraLinkOpts */ - ImmutableList.of(), + linkParams, + /* extraLinkOpts= */ ImmutableList.of(), configuration, toolchain, nativeDeps, libraryIdentifier, configuration.getBinDirectory(ruleContext.getRule().getRepository()), - /*useDynamicRuntime*/ false) + /* useDynamicRuntime= */ false, + cppSemantics) .getLibrary(); } @@ -171,7 +175,8 @@ public abstract class NativeDepsHelper { Artifact nativeDeps, String libraryIdentifier, Root bindirIfShared, - boolean useDynamicRuntime) + boolean useDynamicRuntime, + CppSemantics cppSemantics) throws InterruptedException { Preconditions.checkState( ruleContext.isLegalFragment(CppConfiguration.class), @@ -207,7 +212,13 @@ public abstract class NativeDepsHelper { FeatureConfiguration featureConfiguration = CcCommon.configureFeatures(ruleContext, toolchain); CppLinkActionBuilder builder = new CppLinkActionBuilder( - ruleContext, sharedLibrary, configuration, toolchain, fdoSupport, featureConfiguration); + ruleContext, + sharedLibrary, + configuration, + toolchain, + fdoSupport, + featureConfiguration, + cppSemantics); if (useDynamicRuntime) { builder.setRuntimeInputs(ArtifactCategory.DYNAMIC_LIBRARY, toolchain.getDynamicRuntimeLinkMiddleman(), toolchain.getDynamicRuntimeLinkInputs()); 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 344dd79bfa..958e025f68 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 @@ -258,7 +258,9 @@ public class CrosstoolCompilationSupport extends CompilationSupport { outputArchive, ccToolchain, fdoSupport, - getFeatureConfiguration(ruleContext, ccToolchain, buildConfiguration, objcProvider)) + getFeatureConfiguration(ruleContext, ccToolchain, buildConfiguration, objcProvider), + createObjcCppSemantics( + objcProvider, /* privateHdrs= */ ImmutableList.of(), /* pchHdr= */ null)) .addActionInputs(objcProvider.getObjcLibraries()) .addActionInputs(objcProvider.getCcLibraries()) .addActionInputs(objcProvider.get(IMPORTED_LIBRARY).toSet()) @@ -312,7 +314,7 @@ public class CrosstoolCompilationSupport extends CompilationSupport { LinkTargetType linkType = (objcProvider.is(Flag.USES_CPP)) ? LinkTargetType.OBJCPP_EXECUTABLE : LinkTargetType.OBJC_EXECUTABLE; - + ObjcVariablesExtension.Builder extensionBuilder = new ObjcVariablesExtension.Builder() .setRuleContext(ruleContext) @@ -334,7 +336,9 @@ public class CrosstoolCompilationSupport extends CompilationSupport { binaryToLink, toolchain, fdoSupport, - getFeatureConfiguration(ruleContext, toolchain, buildConfiguration, objcProvider)) + getFeatureConfiguration(ruleContext, toolchain, buildConfiguration, objcProvider), + createObjcCppSemantics( + objcProvider, /* privateHdrs= */ ImmutableList.of(), /* pchHdr= */ null)) .setMnemonic("ObjcLink") .addActionInputs(bazelBuiltLibraries) .addActionInputs(objcProvider.getCcLibraries()) @@ -423,14 +427,7 @@ public class CrosstoolCompilationSupport extends CompilationSupport { Streams.stream(compilationArtifacts.getAdditionalHdrs())) .collect(toImmutableSortedSet(naturalOrder())); Artifact pchHdr = getPchFile().orNull(); - ObjcCppSemantics semantics = - new ObjcCppSemantics( - objcProvider, - createIncludeProcessing(privateHdrs, objcProvider, pchHdr), - ruleContext.getFragment(ObjcConfiguration.class), - isHeaderThinningEnabled(), - intermediateArtifacts, - buildConfiguration); + ObjcCppSemantics semantics = createObjcCppSemantics(objcProvider, privateHdrs, pchHdr); CcLibraryHelper result = new CcLibraryHelper( ruleContext, @@ -482,6 +479,17 @@ public class CrosstoolCompilationSupport extends CompilationSupport { return result; } + private ObjcCppSemantics createObjcCppSemantics( + ObjcProvider objcProvider, Collection privateHdrs, Artifact pchHdr) { + return new ObjcCppSemantics( + objcProvider, + createIncludeProcessing(privateHdrs, objcProvider, pchHdr), + ruleContext.getFragment(ObjcConfiguration.class), + isHeaderThinningEnabled(), + intermediateArtifacts, + buildConfiguration); + } + private FeatureConfiguration getFeatureConfiguration( RuleContext ruleContext, CcToolchainProvider ccToolchain, -- cgit v1.2.3