aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/rules/cpp
diff options
context:
space:
mode:
authorGravatar plf <plf@google.com>2018-08-03 01:47:22 -0700
committerGravatar Copybara-Service <copybara-piper@google.com>2018-08-03 01:48:53 -0700
commit7e41f9bd7000a8e51101d91b0c72ce7e6775068e (patch)
tree5e037fb9512bd09415fd1bec1f0420ab78d90ae2 /src/main/java/com/google/devtools/build/lib/rules/cpp
parent3081fd98eae4bcd27bad71762835d9610d41eef0 (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')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java55
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationInfo.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingInfo.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CppOptions.java13
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;