diff options
Diffstat (limited to 'src/main/java/com/google/devtools')
10 files changed, 63 insertions, 39 deletions
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 05211e2d96..3ae158d230 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 @@ -217,7 +217,7 @@ public abstract class CcBinary implements RuleConfiguredTargetFactory { getLinkStaticness(ruleContext, linkopts, cppConfiguration, ccToolchain); FdoSupportProvider fdoSupport = common.getFdoSupport(); FeatureConfiguration featureConfiguration = - CcCommon.configureFeatures( + CcCommon.configureFeaturesOrReportRuleError( ruleContext, /* requestedFeatures= */ ImmutableSet.<String>builder() .addAll(ruleContext.getFeatures()) diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java index 81febbc1ea..476f872b55 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java @@ -54,6 +54,7 @@ import com.google.devtools.build.lib.rules.cpp.Link.LinkTargetType; import com.google.devtools.build.lib.shell.ShellUtils; import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization; +import com.google.devtools.build.lib.syntax.EvalException; import com.google.devtools.build.lib.syntax.Type; import com.google.devtools.build.lib.util.FileType; import com.google.devtools.build.lib.util.Pair; @@ -687,15 +688,45 @@ public final class CcCommon { } /** + * Creates a feature configuration for a given rule. Assumes strictly cc sources. + * + * @param ruleContext the context of the rule we want the feature configuration for. + * @param toolchain C++ toolchain provider. + * @return the feature configuration for the given {@code ruleContext}. + */ + public static FeatureConfiguration configureFeaturesOrReportRuleError( + RuleContext ruleContext, CcToolchainProvider toolchain) { + return configureFeaturesOrReportRuleError( + ruleContext, + /* requestedFeatures= */ ruleContext.getFeatures(), + /* unsupportedFeatures= */ ruleContext.getDisabledFeatures(), + toolchain); + } + + /** * Creates the feature configuration for a given rule. * * @return the feature configuration for the given {@code ruleContext}. */ - public static FeatureConfiguration configureFeatures( + public static FeatureConfiguration configureFeaturesOrReportRuleError( RuleContext ruleContext, ImmutableSet<String> requestedFeatures, ImmutableSet<String> unsupportedFeatures, CcToolchainProvider toolchain) { + try { + return configureFeaturesOrThrowEvalException( + requestedFeatures, unsupportedFeatures, toolchain); + } catch (EvalException e) { + ruleContext.ruleError(e.getMessage()); + return FeatureConfiguration.EMPTY; + } + } + + public static FeatureConfiguration configureFeaturesOrThrowEvalException( + ImmutableSet<String> requestedFeatures, + ImmutableSet<String> unsupportedFeatures, + CcToolchainProvider toolchain) + throws EvalException { CppConfiguration cppConfiguration = toolchain.getCppConfiguration(); ImmutableSet.Builder<String> allRequestedFeaturesBuilder = ImmutableSet.builder(); ImmutableSet.Builder<String> unsupportedFeaturesBuilder = ImmutableSet.builder(); @@ -795,11 +826,10 @@ public final class CcCommon { toolchain.getFeatures().getFeatureConfiguration(allRequestedFeaturesBuilder.build()); for (String feature : unsupportedFeatures) { if (featureConfiguration.isEnabled(feature)) { - ruleContext.ruleError( + throw new EvalException( + /* location= */ null, "The C++ toolchain '" - + ruleContext - .getPrerequisite(CcToolchain.CC_TOOLCHAIN_DEFAULT_ATTRIBUTE_NAME, Mode.TARGET) - .getLabel() + + toolchain.getCcToolchainLabel() + "' unconditionally implies feature '" + feature + "', which is unsupported by this rule. " @@ -808,32 +838,15 @@ public final class CcCommon { } if ((cppConfiguration.forcePic() || toolchain.toolchainNeedsPic()) && !featureConfiguration.isEnabled(CppRuleClasses.PIC)) { - ruleContext.ruleError(PIC_CONFIGURATION_ERROR); + throw new EvalException(/* location= */ null, PIC_CONFIGURATION_ERROR); } return featureConfiguration; } catch (CollidingProvidesException e) { - ruleContext.ruleError(e.getMessage()); - return FeatureConfiguration.EMPTY; + throw new EvalException(/* location= */ null, e.getMessage()); } } /** - * Creates a feature configuration for a given rule. Assumes strictly cc sources. - * - * @param ruleContext the context of the rule we want the feature configuration for. - * @param toolchain C++ toolchain provider. - * @return the feature configuration for the given {@code ruleContext}. - */ - public static FeatureConfiguration configureFeatures( - RuleContext ruleContext, CcToolchainProvider toolchain) { - return configureFeatures( - ruleContext, - /* requestedFeatures= */ ruleContext.getFeatures(), - /* unsupportedFeatures= */ ruleContext.getDisabledFeatures(), - toolchain); - } - - /** * Computes the appropriate value of the {@code $(CC_FLAGS)} Make variable based on the given * toolchain. */ @@ -841,7 +854,7 @@ public final class CcCommon { CcToolchainProvider toolchainProvider = (CcToolchainProvider) toolchain.get(ToolchainInfo.PROVIDER); FeatureConfiguration featureConfiguration = - CcCommon.configureFeatures(ruleContext, toolchainProvider); + CcCommon.configureFeaturesOrReportRuleError(ruleContext, toolchainProvider); if (!featureConfiguration.actionIsConfigured( CppCompileAction.CC_FLAGS_MAKE_VARIABLE_ACTION_NAME)) { return null; diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcImport.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcImport.java index 3df13788ce..b0537a2a66 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcImport.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcImport.java @@ -68,7 +68,7 @@ public abstract class CcImport implements RuleConfiguredTargetFactory { CcToolchainProvider ccToolchain = CppHelper.getToolchainUsingDefaultCcToolchainAttribute(ruleContext); FeatureConfiguration featureConfiguration = - CcCommon.configureFeatures(ruleContext, ccToolchain); + CcCommon.configureFeaturesOrReportRuleError(ruleContext, ccToolchain); FdoSupportProvider fdoSupport = CppHelper.getFdoSupportUsingDefaultCcToolchainAttribute(ruleContext); diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java index 88e3cb32d1..62d0bff944 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java @@ -129,7 +129,7 @@ public abstract class CcLibrary implements RuleConfiguredTargetFactory { FdoSupportProvider fdoSupport = common.getFdoSupport(); FeatureConfiguration featureConfiguration = - CcCommon.configureFeatures(ruleContext, ccToolchain); + CcCommon.configureFeaturesOrReportRuleError(ruleContext, ccToolchain); PrecompiledFiles precompiledFiles = new PrecompiledFiles(ruleContext); semantics.validateAttributes(ruleContext); 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 c4a0332881..f1e622a354 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 @@ -433,6 +433,10 @@ public final class CcToolchainProvider extends ToolchainInfo { return toolchainInfo.getFeatures(); } + public Label getCcToolchainLabel() { + return toolchainInfo.getCcToolchainLabel(); + } + /** * Returns whether shared libraries must be compiled with position independent code on this * platform. 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 0e62d0aed2..df56dbbb67 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 @@ -45,7 +45,6 @@ import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable; import com.google.devtools.build.lib.skylarkinterface.SkylarkModule; import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory; -import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.build.lib.vfs.PathFragment; import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig; import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig.CToolchain; @@ -214,7 +213,7 @@ public final class CppConfiguration extends BuildConfiguration.Fragment { PathFragment crosstoolTopPathFragment = params.crosstoolTop.getPackageIdentifier().getPathUnderExecRoot(); CppToolchainInfo cppToolchainInfo = - CppToolchainInfo.create(toolchain, crosstoolTopPathFragment, params.crosstoolTop); + CppToolchainInfo.create(toolchain, crosstoolTopPathFragment, params.ccToolchainLabel); ListMultimap<CompilationMode, String> cFlags = ArrayListMultimap.create(); ListMultimap<CompilationMode, String> cxxFlags = ArrayListMultimap.create(); @@ -755,8 +754,8 @@ public final class CppConfiguration extends BuildConfiguration.Fragment { * * @param featuresNotUsedAnymore * @param sharedLib true if the output is a shared lib, false if it's an executable - * <p>Deprecated: Use {@link CppHelper#getMostlyStaticLinkOptions(CppConfiguration, - * CcToolchainProvider, Boolean)} + * <p>Deprecated: Use {@link CppHelper#getMostlyStaticLinkOptions( CppConfiguration, + * CcToolchainProvider, boolean, boolean)} */ // TODO(b/64384912): Migrate skylark users to cc_common and remove. @SkylarkCallable( @@ -911,7 +910,7 @@ public final class CppConfiguration extends BuildConfiguration.Fragment { /** * Returns true if LLVM FDO Optimization should be applied for this configuration. * - * <p>Deprecated: Use {@link CcToolchain#isLLVMOptimizedFdo(boolean, Path)} + * <p>Deprecated: Use {@link CcToolchain#isLLVMOptimizedFdo(boolean, PathFragment)} */ // TODO(b/64384912): Remove in favor of overload with isLLVMCompiler. @Deprecated 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 5b78e144dd..723fd9ebd8 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 @@ -517,7 +517,7 @@ public class CppHelper { return NestedSetBuilder.emptySet(Order.STABLE_ORDER); } FeatureConfiguration featureConfiguration = - CcCommon.configureFeatures(ruleContext, defaultToolchain); + CcCommon.configureFeaturesOrReportRuleError(ruleContext, defaultToolchain); return defaultToolchain.getDynamicRuntimeLinkInputs(featureConfiguration); } @@ -533,7 +533,7 @@ public class CppHelper { return NestedSetBuilder.emptySet(Order.STABLE_ORDER); } FeatureConfiguration featureConfiguration = - CcCommon.configureFeatures(ruleContext, defaultToolchain); + CcCommon.configureFeaturesOrReportRuleError(ruleContext, defaultToolchain); return defaultToolchain.getStaticRuntimeLinkInputs(featureConfiguration); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppToolchainInfo.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppToolchainInfo.java index b8643ad4c5..8a977f5c7f 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppToolchainInfo.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppToolchainInfo.java @@ -84,6 +84,7 @@ public final class CppToolchainInfo { private final ImmutableList<String> ldOptionsForEmbedding; private final ImmutableList<String> objCopyOptionsForEmbedding; + private final Label ccToolchainLabel; private final Label staticRuntimeLibsLabel; private final Label dynamicRuntimeLibsLabel; private final String solibDirectory; @@ -189,6 +190,7 @@ public final class CppToolchainInfo { ImmutableList.copyOf(toolchain.getTestOnlyLinkerFlagList()), ImmutableList.copyOf(toolchain.getLdEmbedFlagList()), ImmutableList.copyOf(toolchain.getObjcopyEmbedFlagList()), + toolchainLabel, toolchainLabel.getRelative( toolchain.hasStaticRuntimesFilegroup() ? toolchain.getStaticRuntimesFilegroup() @@ -208,8 +210,7 @@ public final class CppToolchainInfo { lipoCFlagsBuilder.build(), lipoCxxFlagsBuilder.build(), new FlagList( - ImmutableList.copyOf(toolchain.getUnfilteredCxxFlagList()), - ImmutableList.of()), + ImmutableList.copyOf(toolchain.getUnfilteredCxxFlagList()), ImmutableList.of()), toolchain.getSupportsFission(), toolchain.getSupportsStartEndLib(), toolchain.getSupportsEmbeddedRuntimes(), @@ -247,6 +248,7 @@ public final class CppToolchainInfo { ImmutableList<String> testOnlyLinkFlags, ImmutableList<String> ldOptionsForEmbedding, ImmutableList<String> objCopyOptionsForEmbedding, + Label ccToolchainLabel, Label staticRuntimeLibsLabel, Label dynamicRuntimeLibsLabel, String solibDirectory, @@ -291,6 +293,7 @@ public final class CppToolchainInfo { this.testOnlyLinkFlags = testOnlyLinkFlags; this.ldOptionsForEmbedding = ldOptionsForEmbedding; this.objCopyOptionsForEmbedding = objCopyOptionsForEmbedding; + this.ccToolchainLabel = ccToolchainLabel; this.staticRuntimeLibsLabel = staticRuntimeLibsLabel; this.dynamicRuntimeLibsLabel = dynamicRuntimeLibsLabel; this.solibDirectory = solibDirectory; @@ -517,6 +520,11 @@ public final class CppToolchainInfo { return getToolPathFragment(toolPaths, tool); } + /** Returns a label that references the current cc_toolchain target. */ + public Label getCcToolchainLabel() { + return ccToolchainLabel; + } + /** * Returns a label that references the library files needed to statically link the C++ runtime * (i.e. libgcc.a, libgcc_eh.a, libstdc++.a) for the target architecture. diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/proto/CcProtoAspect.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/proto/CcProtoAspect.java index fdf8d00938..2abecee223 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/proto/CcProtoAspect.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/proto/CcProtoAspect.java @@ -230,7 +230,7 @@ public abstract class CcProtoAspect extends NativeAspectClass implements Configu unsupportedFeatures.add(CppRuleClasses.HEADER_MODULES); } FeatureConfiguration featureConfiguration = - CcCommon.configureFeatures( + CcCommon.configureFeaturesOrReportRuleError( ruleContext, requestedFeatures.build(), unsupportedFeatures.build(), 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 0706b24e3a..4d2e2d067b 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 @@ -219,7 +219,7 @@ public abstract class NativeDepsHelper { FdoSupportProvider fdoSupport = CppHelper.getFdoSupportUsingDefaultCcToolchainAttribute(ruleContext); FeatureConfiguration featureConfiguration = - CcCommon.configureFeatures( + CcCommon.configureFeaturesOrReportRuleError( ruleContext, /* requestedFeatures= */ ImmutableSet.<String>builder() .addAll(ruleContext.getFeatures()) |