diff options
author | hlopko <hlopko@google.com> | 2018-05-03 07:33:03 -0700 |
---|---|---|
committer | Copybara-Service <copybara-piper@google.com> | 2018-05-03 07:34:56 -0700 |
commit | 70821069b0e39249eb0f23cf16ca4438c9703a7b (patch) | |
tree | ec4406f1f9ca29f40be8659a1d4482bda5a9531b /src | |
parent | ffb0913d9f2bd210717bccb9bdc00b39a6c1ba5f (diff) |
Thread legacy compile flags through CcToolchainProvider for compile build variables
This cl shuffles code around so that compile build variables don't require rule
context and CppConfiguration.
RELNOTES: None.
PiperOrigin-RevId: 195249548
Diffstat (limited to 'src')
9 files changed, 115 insertions, 116 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationHelper.java index d186abba4f..b38e0df9c7 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationHelper.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationHelper.java @@ -1519,7 +1519,7 @@ public final class CcCompilationHelper { featureConfiguration, fdoSupport)); } - return CompileBuildVariables.setupVariables( + return CompileBuildVariables.setupVariablesOrReportRuleError( ruleContext, featureConfiguration, ccToolchain, diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProvider.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProvider.java index 695a2f57ee..381224f9de 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProvider.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProvider.java @@ -811,6 +811,33 @@ public final class CcToolchainProvider extends ToolchainInfo { return toolchainInfo.getLegacyLinkOptions(); } + /** + * Return all flags coming from {@code compiler_flag} crosstool fields excluding flags coming from + * --copt options and copts attribute. + */ + public ImmutableList<String> getLegacyCompileOptions() { + ImmutableList.Builder<String> coptsBuilder = + ImmutableList.<String>builder() + .addAll(getToolchainCompilerFlags()) + .addAll(getCFlagsByCompilationMode().get(cppConfiguration.getCompilationMode())) + .addAll(getLipoCFlags().get(cppConfiguration.getLipoMode())); + + if (cppConfiguration.isOmitfp()) { + coptsBuilder.add("-fomit-frame-pointer"); + coptsBuilder.add("-fasynchronous-unwind-tables"); + coptsBuilder.add("-DNO_FRAME_POINTER"); + } + + return coptsBuilder.build(); + } + + public ImmutableList<String> getLegacyCompileOptionsWithCopts() { + return ImmutableList.<String>builder() + .addAll(getLegacyCompileOptions()) + .addAll(cppConfiguration.getCopts()) + .build(); + } + /** Return all possible {@code linker_flag} flags from the crosstool. */ ImmutableList<String> configureAllLegacyLinkOptions( CompilationMode compilationMode, LipoMode lipoMode, LinkingMode linkingMode) { @@ -854,15 +881,16 @@ public final class CcToolchainProvider extends ToolchainInfo { + "in addition to the ones returned by this method" ) public ImmutableList<String> getCompilerOptions() { - return CppHelper.getCompilerOptions(cppConfiguration, this); + return getLegacyCompileOptionsWithCopts(); } /** * WARNING: This method is only added to allow incremental migration of existing users. Please do * not use in new code. Will be removed soon as part of the new Skylark API to the C++ toolchain. * - * Returns the list of additional C-specific options to use for compiling C. These should be go on - * the command line after the common options returned by {@link CppHelper#getCompilerOptions}. + * <p>Returns the list of additional C-specific options to use for compiling C. These should be go + * on the command line after the common options returned by {@link + * CcToolchainProvider#getLegacyCompileOptionsWithCopts()}. */ @SkylarkCallable( name = "c_options", @@ -878,19 +906,29 @@ public final class CcToolchainProvider extends ToolchainInfo { * WARNING: This method is only added to allow incremental migration of existing users. Please do * not use in new code. Will be removed soon as part of the new Skylark API to the C++ toolchain. * - * Returns the list of additional C++-specific options to use for compiling C++. These should be - * on the command line after the common options returned by {@link #getCompilerOptions}. + * <p>Returns the list of additional C++-specific options to use for compiling C++. These should + * be on the command line after the common options returned by {@link #getCompilerOptions}. */ @SkylarkCallable( name = "cxx_options", doc = "Returns the list of additional C++-specific options to use for compiling C++. " + "These should be go on the command line after the common options returned by " - + "<code>compiler_options</code>" - ) + + "<code>compiler_options</code>") @Deprecated - public ImmutableList<String> getCxxOptions() { - return CppHelper.getCxxOptions(cppConfiguration, this); + public ImmutableList<String> getCxxOptionsWithCopts() { + return ImmutableList.<String>builder() + .addAll(getLegacyCxxOptions()) + .addAll(cppConfiguration.getCxxopts()) + .build(); + } + + public ImmutableList<String> getLegacyCxxOptions() { + return ImmutableList.<String>builder() + .addAll(getToolchainCxxFlags()) + .addAll(getCxxFlagsByCompilationMode().get(cppConfiguration.getCompilationMode())) + .addAll(getLipoCxxFlags().get(cppConfiguration.getLipoMode())) + .build(); } /** diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CompileBuildVariables.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CompileBuildVariables.java index eeb6da6454..c1066cfd35 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CompileBuildVariables.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CompileBuildVariables.java @@ -19,10 +19,12 @@ import com.google.common.collect.ImmutableMap; 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.events.Location; import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FeatureConfiguration; import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.Variables; import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.Variables.StringSequenceBuilder; import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.Variables.VariablesExtension; +import com.google.devtools.build.lib.syntax.EvalException; import com.google.devtools.build.lib.util.FileType; import com.google.devtools.build.lib.vfs.PathFragment; import java.util.Collection; @@ -102,7 +104,7 @@ public enum CompileBuildVariables { this.variableName = variableName; } - public static Variables setupVariables( + public static Variables setupVariablesOrReportRuleError( RuleContext ruleContext, FeatureConfiguration featureConfiguration, CcToolchainProvider ccToolchainProvider, @@ -121,6 +123,50 @@ public enum CompileBuildVariables { String dotdFileExecPath, ImmutableList<VariablesExtension> variablesExtensions, ImmutableMap<String, String> additionalBuildVariables) { + try { + return setupVariablesOrThrowEvalException( + featureConfiguration, + ccToolchainProvider, + sourceFile, + outputFile, + gcnoFile, + dwoFile, + ltoIndexingFile, + ccCompilationContextInfo, + includes, + userCompileFlags, + cppModuleMap, + usePic, + realOutputFilePath, + fdoStamp, + dotdFileExecPath, + variablesExtensions, + additionalBuildVariables); + } catch (EvalException e) { + ruleContext.ruleError(e.getMessage()); + return Variables.EMPTY; + } + } + + public static Variables setupVariablesOrThrowEvalException( + FeatureConfiguration featureConfiguration, + CcToolchainProvider ccToolchainProvider, + Artifact sourceFile, + Artifact outputFile, + Artifact gcnoFile, + Artifact dwoFile, + Artifact ltoIndexingFile, + CcCompilationContextInfo ccCompilationContextInfo, + ImmutableList<String> includes, + ImmutableList<String> userCompileFlags, + CppModuleMap cppModuleMap, + boolean usePic, + PathFragment realOutputFilePath, + String fdoStamp, + String dotdFileExecPath, + ImmutableList<VariablesExtension> variablesExtensions, + ImmutableMap<String, String> additionalBuildVariables) + throws EvalException { Variables.Builder buildVariables = new Variables.Builder(ccToolchainProvider.getBuildVariables()); @@ -132,8 +178,7 @@ public enum CompileBuildVariables { String sourceFilename = sourceFile.getExecPathString(); buildVariables.addLazyStringSequenceVariable( LEGACY_COMPILE_FLAGS.getVariableName(), - getLegacyCompileFlagsSupplier( - ruleContext.getFragment(CppConfiguration.class), ccToolchainProvider, sourceFilename)); + getLegacyCompileFlagsSupplier(ccToolchainProvider, sourceFilename)); if (!CppFileTypes.OBJC_SOURCE.matches(sourceFilename) && !CppFileTypes.OBJCPP_SOURCE.matches(sourceFilename)) { @@ -212,7 +257,7 @@ public enum CompileBuildVariables { if (usePic) { if (!featureConfiguration.isEnabled(CppRuleClasses.PIC)) { - ruleContext.ruleError(CcCommon.PIC_CONFIGURATION_ERROR); + throw new EvalException(Location.BUILTIN, CcCommon.PIC_CONFIGURATION_ERROR); } buildVariables.addStringVariable(PIC.getVariableName(), ""); } @@ -256,15 +301,15 @@ public enum CompileBuildVariables { * to arguments (to prevent accidental capture of enclosing instance which could regress memory). */ private static Supplier<ImmutableList<String>> getLegacyCompileFlagsSupplier( - CppConfiguration cppConfiguration, CcToolchainProvider toolchain, String sourceFilename) { + CcToolchainProvider toolchain, String sourceFilename) { return () -> { ImmutableList.Builder<String> legacyCompileFlags = ImmutableList.builder(); - legacyCompileFlags.addAll(CppHelper.getCrosstoolCompilerOptions(cppConfiguration, toolchain)); + legacyCompileFlags.addAll(toolchain.getLegacyCompileOptions()); if (CppFileTypes.CPP_SOURCE.matches(sourceFilename) || CppFileTypes.CPP_HEADER.matches(sourceFilename) || CppFileTypes.CPP_MODULE_MAP.matches(sourceFilename) || CppFileTypes.CLIF_INPUT_PROTO.matches(sourceFilename)) { - legacyCompileFlags.addAll(CppHelper.getCrosstoolCxxOptions(cppConfiguration, toolchain)); + legacyCompileFlags.addAll(toolchain.getLegacyCxxOptions()); } return legacyCompileFlags.build(); }; diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java index 380f214909..e5cee301a4 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java @@ -546,7 +546,7 @@ public final class CppConfiguration extends BuildConfiguration.Fragment { * options that should be used for all three languages. There may be additional C-specific or * C++-specific options that should be used, in addition to the ones returned by this method. * - * <p>Deprecated: Use {@link CppHelper#getCompilerOptions} + * <p>Deprecated: Use {@link CcToolchainProvider#getLegacyCompileOptionsWithCopts()} */ // TODO(b/64384912): Migrate skylark callers and remove. @SkylarkCallable( @@ -582,7 +582,7 @@ public final class CppConfiguration extends BuildConfiguration.Fragment { * Returns the list of additional C++-specific options to use for compiling C++. These should be * on the command line after the common options returned by {@link #getCompilerOptions}. * - * <p>Deprecated: Use {@link CppHelper#getCxxOptions} + * <p>Deprecated: Use {@link CcToolchainProvider#getCxxOptionsWithCopts} */ // TODO(b/64384912): Migrate skylark callers and remove. @SkylarkCallable( diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java index 95827472f6..9025818edc 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java @@ -246,78 +246,6 @@ public class CppHelper { } /** - * Returns the default options to use for compiling C, C++, and assembler, excluding those - * specified on the command line. This is just the options that should be used for all three - * languages. There may be additional C-specific or C++-specific options that should be used, in - * addition to the ones returned by this method. - */ - // TODO(b/70784100): Figure out if these methods can be moved to CcToolchainProvider. - public static ImmutableList<String> getCrosstoolCompilerOptions( - CppConfiguration config, CcToolchainProvider toolchain) { - ImmutableList.Builder<String> coptsBuilder = - ImmutableList.<String>builder() - .addAll(toolchain.getToolchainCompilerFlags()) - .addAll(toolchain.getCFlagsByCompilationMode().get(config.getCompilationMode())) - .addAll(toolchain.getLipoCFlags().get(config.getLipoMode())); - - if (config.isOmitfp()) { - coptsBuilder.add("-fomit-frame-pointer"); - coptsBuilder.add("-fasynchronous-unwind-tables"); - coptsBuilder.add("-DNO_FRAME_POINTER"); - } - - FlagList compilerFlags = - new FlagList( - coptsBuilder.build(), - ImmutableList.of()); - - return compilerFlags.evaluate(); - } - - /** - * Returns the default options to use for compiling C, C++, and assembler. This is just the - * options that should be used for all three languages. There may be additional C-specific or - * C++-specific options that should be used, in addition to the ones returned by this method. - */ - public static ImmutableList<String> getCompilerOptions( - CppConfiguration config, CcToolchainProvider toolchain) { - return ImmutableList.<String>builder() - .addAll(getCrosstoolCompilerOptions(config, toolchain)) - .addAll(config.getCopts()) - .build(); - } - - /** - * Returns the list of additional C++-specific options to use for compiling C++, excluding those - * specified on the command line. These should be go on the command line after the common options - * returned by {@link #getCompilerOptions}. - */ - public static ImmutableList<String> getCrosstoolCxxOptions( - CppConfiguration config, CcToolchainProvider toolchain) { - ImmutableList.Builder<String> cxxOptsBuilder = - ImmutableList.<String>builder() - .addAll(toolchain.getToolchainCxxFlags()) - .addAll(toolchain.getCxxFlagsByCompilationMode().get(config.getCompilationMode())) - .addAll(toolchain.getLipoCxxFlags().get(config.getLipoMode())); - - FlagList cxxFlags = new FlagList(cxxOptsBuilder.build(), ImmutableList.of()); - - return cxxFlags.evaluate(); - } - - /** - * Returns the list of additional C++-specific options to use for compiling C++. These should be - * go on the command line after the common options returned by {@link #getCompilerOptions}. - */ - public static ImmutableList<String> getCxxOptions( - CppConfiguration config, CcToolchainProvider toolchain) { - return ImmutableList.<String>builder() - .addAll(getCrosstoolCxxOptions(config, toolchain)) - .addAll(config.getCxxopts()) - .build(); - } - - /** * Returns the immutable list of linker options for fully statically linked outputs. Does not * include command-line options passed via --linkopt or --linkopts. * @@ -1045,12 +973,6 @@ public class CppHelper { objectDir.getRelative(outputName), sourceTreeArtifact.getRoot()); } - /** Returns the corresponding compiled TreeArtifact given the source TreeArtifact. */ - public static Artifact getCompileOutputTreeArtifact( - RuleContext ruleContext, Artifact sourceTreeArtifact, String outputName) { - return getCompileOutputTreeArtifact(ruleContext, sourceTreeArtifact, outputName, false); - } - static String getArtifactNameForCategory( RuleContext ruleContext, CcToolchainProvider toolchain, 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 68dd271450..be2615e83b 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 @@ -524,7 +524,7 @@ public class CppLinkActionBuilder { private List<String> getLtoBackendCommandLineOptions() { List<String> argv = new ArrayList<>(); argv.addAll(toolchain.getLinkOptions()); - argv.addAll(CppHelper.getCompilerOptions(cppConfiguration, toolchain)); + argv.addAll(toolchain.getLegacyCompileOptionsWithCopts()); argv.addAll(cppConfiguration.getLtoBackendOptions()); return argv; } diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkstampCompileHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkstampCompileHelper.java index 6e2a157132..3ffee15d45 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkstampCompileHelper.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkstampCompileHelper.java @@ -155,7 +155,7 @@ public class CppLinkstampCompileHelper { codeCoverageEnabled)) .build(); - return CompileBuildVariables.setupVariables( + return CompileBuildVariables.setupVariablesOrReportRuleError( ruleContext, featureConfiguration, ccToolchainProvider, diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcToolchainTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcToolchainTest.java index f01726a638..53f572b0b3 100644 --- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcToolchainTest.java +++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcToolchainTest.java @@ -511,8 +511,7 @@ public class CcToolchainTest extends BuildViewTestCase { CppHelper.getToolchainUsingDefaultCcToolchainAttribute(getRuleContext(lib)); assertDoesNotContainSublist( - CppHelper.getCompilerOptions( - getConfiguration(lib).getFragment(CppConfiguration.class), toolchain), + toolchain.getLegacyCompileOptionsWithCopts(), "--param", "df-double-quote-threshold-factor=0"); } @@ -520,25 +519,20 @@ public class CcToolchainTest extends BuildViewTestCase { @Test public void testMergesDefaultCoptsWithUserProvidedOnes() throws Exception { writeDummyCcToolchain(); - scratch.file("lib/BUILD", "cc_library(", " name = 'lib',", " srcs = ['a.cc'],", ")"); + scratch.file("lib/BUILD", "cc_library(name = 'lib', srcs = ['a.cc'])"); ConfiguredTarget lib = getConfiguredTarget("//lib"); CcToolchainProvider toolchain = CppHelper.getToolchainUsingDefaultCcToolchainAttribute(getRuleContext(lib)); List<String> expected = new ArrayList<>(); - expected.addAll( - CppHelper.getCompilerOptions( - getConfiguration(lib).getFragment(CppConfiguration.class), toolchain)); + expected.addAll(toolchain.getLegacyCompileOptionsWithCopts()); expected.add("-Dfoo"); useConfiguration("--copt", "-Dfoo"); lib = getConfiguredTarget("//lib"); toolchain = CppHelper.getToolchainUsingDefaultCcToolchainAttribute(getRuleContext(lib)); - assertThat( - ImmutableList.copyOf( - CppHelper.getCompilerOptions( - getConfiguration(lib).getFragment(CppConfiguration.class), toolchain))) + assertThat(ImmutableList.copyOf(toolchain.getLegacyCompileOptionsWithCopts())) .isEqualTo(ImmutableList.copyOf(expected)); } diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CrosstoolConfigurationLoaderTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CrosstoolConfigurationLoaderTest.java index e06dd63e2a..131bc9ce13 100644 --- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CrosstoolConfigurationLoaderTest.java +++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CrosstoolConfigurationLoaderTest.java @@ -198,11 +198,11 @@ public class CrosstoolConfigurationLoaderTest extends AnalysisTestCase { .containsExactly(getToolPath("system-include-dir")); assertThat(ccProvider.getSysroot()).isNull(); - assertThat(CppHelper.getCompilerOptions(toolchain, ccProvider)) + assertThat(ccProvider.getLegacyCompileOptionsWithCopts()) .containsExactly("c", "fastbuild") .inOrder(); assertThat(toolchain.getCOptions()).isEmpty(); - assertThat(CppHelper.getCxxOptions(toolchain, ccProvider)) + assertThat(ccProvider.getCxxOptionsWithCopts()) .containsExactly("cxx", "cxx-fastbuild") .inOrder(); assertThat(ccProvider.getUnfilteredCompilerOptions()).containsExactly("unfiltered").inOrder(); @@ -511,11 +511,11 @@ public class CrosstoolConfigurationLoaderTest extends AnalysisTestCase { assertThat(ccProviderA.supportsEmbeddedRuntimes()).isTrue(); assertThat(ccProviderA.toolchainNeedsPic()).isTrue(); - assertThat(CppHelper.getCompilerOptions(toolchainA, ccProviderA)) + assertThat(ccProviderA.getLegacyCompileOptionsWithCopts()) .containsExactly( "compiler-flag-A-1", "compiler-flag-A-2", "fastbuild-flag-A-1", "fastbuild-flag-A-2") .inOrder(); - assertThat(CppHelper.getCxxOptions(toolchainA, ccProviderA)) + assertThat(ccProviderA.getCxxOptionsWithCopts()) .containsExactly( "cxx-flag-A-1", "cxx-flag-A-2", "cxx-fastbuild-flag-A-1", "cxx-fastbuild-flag-A-2") .inOrder(); @@ -622,9 +622,9 @@ public class CrosstoolConfigurationLoaderTest extends AnalysisTestCase { assertThat(ccProviderC.toolchainNeedsPic()).isFalse(); assertThat(ccProviderC.supportsFission()).isFalse(); - assertThat(CppHelper.getCompilerOptions(toolchainC, ccProviderC)).isEmpty(); + assertThat(ccProviderC.getLegacyCompileOptionsWithCopts()).isEmpty(); assertThat(toolchainC.getCOptions()).isEmpty(); - assertThat(CppHelper.getCxxOptions(toolchainC, ccProviderC)).isEmpty(); + assertThat(ccProviderC.getCxxOptionsWithCopts()).isEmpty(); assertThat(ccProviderC.getUnfilteredCompilerOptions()).isEmpty(); assertThat(CppHelper.getDynamicLinkOptions(toolchainC, ccProviderC, true)).isEmpty(); assertThat( @@ -673,7 +673,7 @@ public class CrosstoolConfigurationLoaderTest extends AnalysisTestCase { "linker-dbg-flag-B-2", "linker-lipo_" + lipoSuffix) .inOrder(); - assertThat(CppHelper.getCompilerOptions(toolchainB, ccProviderB)) + assertThat(ccProviderB.getLegacyCompileOptionsWithCopts()) .containsAllOf("compiler-flag-B-1", "compiler-flag-B-2", "lipo_" + lipoSuffix) .inOrder(); } |