diff options
author | plf <plf@google.com> | 2018-08-03 01:47:22 -0700 |
---|---|---|
committer | Copybara-Service <copybara-piper@google.com> | 2018-08-03 01:48:53 -0700 |
commit | 7e41f9bd7000a8e51101d91b0c72ce7e6775068e (patch) | |
tree | 5e037fb9512bd09415fd1bec1f0420ab78d90ae2 /src/main/java/com/google/devtools/build/lib/rules/cpp | |
parent | 3081fd98eae4bcd27bad71762835d9610d41eef0 (diff) |
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
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules/cpp')
5 files changed, 30 insertions, 46 deletions
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<PathFragment> WHITELISTED_PACKAGES = - ImmutableList.of( - PathFragment.create("tools/build_defs"), PathFragment.create("experimental")); - public static final ImmutableSet<String> 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<String> 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<String> 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=<list of 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 @@ -784,17 +784,6 @@ public class CppOptions extends FragmentOptions { 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", documentationCategory = OptionDocumentationCategory.TOOLCHAIN, @@ -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; |