From 7e41f9bd7000a8e51101d91b0c72ce7e6775068e Mon Sep 17 00:00:00 2001 From: plf Date: Fri, 3 Aug 2018 01:47:22 -0700 Subject: C++: Change Skylark API whitelisting to be part of flag. This uses SkylarkSemantics now instead of the C++ configuration. The flag is: --experimental_cc_skylark_api_enabled_packages RELNOTES:none PiperOrigin-RevId: 207235431 --- .../build/lib/bazel/rules/cpp/BazelCcModule.java | 4 +- .../lib/packages/SkylarkSemanticsOptions.java | 18 +++++-- .../devtools/build/lib/rules/cpp/CcCommon.java | 55 +++++++++++----------- .../build/lib/rules/cpp/CcCompilationInfo.java | 2 +- .../build/lib/rules/cpp/CcLinkingInfo.java | 2 +- .../build/lib/rules/cpp/CppConfiguration.java | 4 -- .../devtools/build/lib/rules/cpp/CppOptions.java | 13 ----- .../build/lib/syntax/SkylarkSemantics.java | 7 +++ 8 files changed, 54 insertions(+), 51 deletions(-) (limited to 'src/main/java') diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCcModule.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCcModule.java index 3b3d944e74..0195eda845 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCcModule.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCcModule.java @@ -36,8 +36,8 @@ import com.google.devtools.build.lib.syntax.SkylarkList; /** * A module that contains Skylark utilities for C++ support. * - *

This is a work in progress. The API is guarded behind --experimental_enable_cc_skylark_api. - * The API is under development and unstable. + *

This is a work in progress. The API is guarded behind + * --experimental_cc_skylark_api_enabled_packages. The API is under development and unstable. */ public class BazelCcModule extends CcModule implements BazelCcModuleApi< diff --git a/src/main/java/com/google/devtools/build/lib/packages/SkylarkSemanticsOptions.java b/src/main/java/com/google/devtools/build/lib/packages/SkylarkSemanticsOptions.java index e48c1be9fa..3277c38440 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/SkylarkSemanticsOptions.java +++ b/src/main/java/com/google/devtools/build/lib/packages/SkylarkSemanticsOptions.java @@ -15,12 +15,14 @@ package com.google.devtools.build.lib.packages; import com.google.devtools.build.lib.syntax.SkylarkSemantics; +import com.google.devtools.common.options.Converters.CommaSeparatedOptionListConverter; import com.google.devtools.common.options.Option; import com.google.devtools.common.options.OptionDocumentationCategory; import com.google.devtools.common.options.OptionEffectTag; import com.google.devtools.common.options.OptionMetadataTag; import com.google.devtools.common.options.OptionsBase; import java.io.Serializable; +import java.util.List; /** * Contains options that affect Skylark's semantics. @@ -41,9 +43,6 @@ import java.io.Serializable; * should be that name written in snake_case. Add a line to set the new field in {@link * #toSkylarkSemantics}. * - *

  • Add a line to read and write the new field in {@link SkylarkSemanticsCodec#serialize} and - * {@link SkylarkSemanticsCodec#deserialize}. - * *
  • Add a line to set the new field in both {@link * SkylarkSemanticsConsistencyTest#buildRandomOptions} and {@link * SkylarkSemanticsConsistencyTest#buildRandomSemantics}. @@ -68,6 +67,18 @@ public class SkylarkSemanticsOptions extends OptionsBase implements Serializable ) public boolean experimentalEnableRepoMapping; + @Option( + name = "experimental_cc_skylark_api_enabled_packages", + converter = CommaSeparatedOptionListConverter.class, + defaultValue = "", + documentationCategory = OptionDocumentationCategory.UNDOCUMENTED, + effectTags = {OptionEffectTag.LOADING_AND_ANALYSIS}, + metadataTags = {OptionMetadataTag.EXPERIMENTAL}, + help = + "Passes list of packages that can use the C++ Skylark API. Don't enable this flag yet, " + + "we will be making breaking changes.") + public List experimentalCcSkylarkApiEnabledPackages; + @Option( name = "incompatible_bzl_disallow_load_after_statement", defaultValue = "false", @@ -350,6 +361,7 @@ public class SkylarkSemanticsOptions extends OptionsBase implements Serializable public SkylarkSemantics toSkylarkSemantics() { return SkylarkSemantics.builder() // <== Add new options here in alphabetic order ==> + .experimentalCcSkylarkApiEnabledPackages(experimentalCcSkylarkApiEnabledPackages) .experimentalEnableRepoMapping(experimentalEnableRepoMapping) .incompatibleBzlDisallowLoadAfterStatement(incompatibleBzlDisallowLoadAfterStatement) .incompatibleDepsetIsNotIterable(incompatibleDepsetIsNotIterable) 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 b6c55be56c..9fc2f5e029 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 @@ -57,6 +57,7 @@ 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.SkylarkSemantics; import com.google.devtools.build.lib.syntax.Type; import com.google.devtools.build.lib.util.FileType; import com.google.devtools.build.lib.util.Pair; @@ -108,10 +109,6 @@ public final class CcCommon { } }; - private static final ImmutableList WHITELISTED_PACKAGES = - ImmutableList.of( - PathFragment.create("tools/build_defs"), PathFragment.create("experimental")); - public static final ImmutableSet ALL_COMPILE_ACTIONS = ImmutableSet.of( CppActionNames.C_COMPILE, @@ -209,40 +206,44 @@ public final class CcCommon { throws EvalException { RuleContext context = skylarkRuleContext.getRuleContext(); Rule rule = context.getRule(); - if (!context.getFragment(CppConfiguration.class).getEnableCcSkylarkApi()) { - throw new EvalException( - rule.getLocation(), - "Pass --experimental_enable_cc_skylark_api in " - + "order to use the C++ API. Beware that we will be making breaking " - + "changes to this API without prior warning."); - } + RuleClass ruleClass = rule.getRuleClassObject(); Label label = ruleClass.getRuleDefinitionEnvironmentLabel(); - if (label != null - && WHITELISTED_PACKAGES - .stream() - .noneMatch(path -> label.getPackageFragment().startsWith(path))) { - throwWhiteListError(rule.getLocation(), label.getPackageFragment().toString()); + try { + if (label != null) { + checkLocationWhitelisted( + context.getAnalysisEnvironment().getSkylarkSemantics(), + rule.getLocation(), + label.getPackageFragment().toString()); + } + } catch (InterruptedException e) { + throw new EvalException(rule.getLocation(), e); } } - public static void checkLocationWhitelisted(Location location) throws EvalException { - String bzlPath = location.getPath().toString(); - if (WHITELISTED_PACKAGES.stream().noneMatch(path -> bzlPath.contains(path.toString()))) { - throwWhiteListError(location, bzlPath); + public static void checkLocationWhitelisted( + SkylarkSemantics semantics, Location location, String callPath) throws EvalException { + List whitelistedPackagesList = semantics.experimentalCcSkylarkApiEnabledPackages(); + if (whitelistedPackagesList + .stream() + .noneMatch( + path -> callPath.startsWith(path) || callPath.startsWith("/workspace/" + path))) { + throwWhiteListError(location, callPath, whitelistedPackagesList); } } - private static void throwWhiteListError(Location location, String bzlPath) throws EvalException { - String whitelistedPackages = - WHITELISTED_PACKAGES.stream().map(p -> p.toString()).collect(Collectors.joining(", ")); + private static void throwWhiteListError( + Location location, String callPath, List whitelistedPackagesList) + throws EvalException { + String whitelistedPackages = whitelistedPackagesList.stream().collect(Collectors.joining(", ")); throw new EvalException( location, String.format( - "the C++ Skylark API is for the time being only allowed for rules in in '//%s/...'; " - + "but this is defined in '//%s'. Contact blaze-rules@google.com for more " - + "information.", - whitelistedPackages, bzlPath)); + "the C++ Skylark API is for the time being only allowed for rules in '%s'; " + + "but this is defined in '%s'. You can try it out by passing " + + "--experimental_cc_skylark_api_enabled_packages=. Beware that " + + "we will be making breaking changes to this API without prior warning.", + whitelistedPackages, callPath)); } /** diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationInfo.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationInfo.java index d6806ad487..ca3a3d0733 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationInfo.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationInfo.java @@ -78,7 +78,7 @@ public final class CcCompilationInfo extends NativeInfo implements CcCompilation @SuppressWarnings("unchecked") protected CcCompilationInfo createInstanceFromSkylark( Object[] args, Environment env, Location loc) throws EvalException { - CcCommon.checkLocationWhitelisted(loc); + CcCommon.checkLocationWhitelisted(env.getSemantics(), loc, loc.getPath().toString()); CcCompilationInfo.Builder ccCompilationInfoBuilder = CcCompilationInfo.Builder.create(); CcCompilationContext.Builder ccCompilationContext = new CcCompilationContext.Builder(/* ruleContext= */ null); diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingInfo.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingInfo.java index a8a27515af..4157930c5c 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingInfo.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingInfo.java @@ -78,7 +78,7 @@ public final class CcLinkingInfo extends NativeInfo implements CcLinkingInfoApi @SuppressWarnings("unchecked") protected CcLinkingInfo createInstanceFromSkylark( Object[] args, Environment env, Location loc) throws EvalException { - CcCommon.checkLocationWhitelisted(loc); + CcCommon.checkLocationWhitelisted(env.getSemantics(), loc, loc.getPath().toString()); int i = 0; CcLinkParams staticModeParamsForDynamicLibrary = (CcLinkParams) nullIfNone(args[i++]); CcLinkParams staticModeParamsForExecutable = (CcLinkParams) nullIfNone(args[i++]); 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 300a4c9886..df698edc8f 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 @@ -982,10 +982,6 @@ public final class CppConfiguration extends BuildConfiguration.Fragment return cppOptions.useInterfaceSharedObjects; } - public boolean getEnableCcSkylarkApi() { - return cppOptions.enableCcSkylarkApi; - } - /** * Returns the path to the GNU binutils 'objcopy' binary to use for this build. (Corresponds to * $(OBJCOPY) in make-dbg.) Relative paths are relative to the execution root. diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppOptions.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppOptions.java index 4e4e863b29..e403f3320d 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppOptions.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppOptions.java @@ -783,17 +783,6 @@ public class CppOptions extends FragmentOptions { help = "Flag for disabling access to the C++ toolchain API through the ctx.fragments.cpp .") public boolean enableLegacyToolchainSkylarkApi; - @Option( - name = "experimental_enable_cc_skylark_api", - defaultValue = "false", - documentationCategory = OptionDocumentationCategory.UNDOCUMENTED, - effectTags = {OptionEffectTag.LOADING_AND_ANALYSIS}, - metadataTags = {OptionMetadataTag.EXPERIMENTAL}, - help = - "If true, the C++ Skylark API can be used. Don't enable this flag yet, we will be making " - + "breaking changes.") - public boolean enableCcSkylarkApi; - @Option( name = "experimental_disable_legacy_cc_linking_api", defaultValue = "false", @@ -875,8 +864,6 @@ public class CppOptions extends FragmentOptions { public FragmentOptions getHost() { CppOptions host = (CppOptions) getDefault(); - host.enableCcSkylarkApi = enableCcSkylarkApi; - // The crosstool options are partially copied from the target configuration. if (hostCrosstoolTop == null) { host.cppCompiler = cppCompiler; diff --git a/src/main/java/com/google/devtools/build/lib/syntax/SkylarkSemantics.java b/src/main/java/com/google/devtools/build/lib/syntax/SkylarkSemantics.java index 814a847081..5893ac49ab 100644 --- a/src/main/java/com/google/devtools/build/lib/syntax/SkylarkSemantics.java +++ b/src/main/java/com/google/devtools/build/lib/syntax/SkylarkSemantics.java @@ -15,6 +15,8 @@ package com.google.devtools.build.lib.syntax; import com.google.auto.value.AutoValue; +import com.google.common.collect.ImmutableList; +import java.util.List; /** * Options that affect Skylark semantics. @@ -39,6 +41,8 @@ public abstract class SkylarkSemantics { AutoValue_SkylarkSemantics.class; // <== Add new options here in alphabetic order ==> + public abstract List experimentalCcSkylarkApiEnabledPackages(); + public abstract boolean experimentalEnableRepoMapping(); public abstract boolean incompatibleBzlDisallowLoadAfterStatement(); @@ -96,6 +100,7 @@ public abstract class SkylarkSemantics { public static final SkylarkSemantics DEFAULT_SEMANTICS = builder() // <== Add new options here in alphabetic order ==> + .experimentalCcSkylarkApiEnabledPackages(ImmutableList.of()) .experimentalEnableRepoMapping(false) .incompatibleBzlDisallowLoadAfterStatement(false) .incompatibleDepsetIsNotIterable(false) @@ -124,6 +129,8 @@ public abstract class SkylarkSemantics { public abstract static class Builder { // <== Add new options here in alphabetic order ==> + public abstract Builder experimentalCcSkylarkApiEnabledPackages(List value); + public abstract Builder experimentalEnableRepoMapping(boolean value); public abstract Builder incompatibleBzlDisallowLoadAfterStatement(boolean value); -- cgit v1.2.3