aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java
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
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')
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCcModule.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/packages/SkylarkSemanticsOptions.java18
-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
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/SkylarkSemantics.java7
8 files changed, 54 insertions, 51 deletions
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.
*
- * <p>This is a work in progress. The API is guarded behind --experimental_enable_cc_skylark_api.
- * The API is under development and unstable.
+ * <p>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}.
*
- * <li>Add a line to read and write the new field in {@link SkylarkSemanticsCodec#serialize} and
- * {@link SkylarkSemanticsCodec#deserialize}.
- *
* <li>Add a line to set the new field in both {@link
* SkylarkSemanticsConsistencyTest#buildRandomOptions} and {@link
* SkylarkSemanticsConsistencyTest#buildRandomSemantics}.
@@ -69,6 +68,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<String> experimentalCcSkylarkApiEnabledPackages;
+
+ @Option(
name = "incompatible_bzl_disallow_load_after_statement",
defaultValue = "false",
documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
@@ -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<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;
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<String> 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<String> value);
+
public abstract Builder experimentalEnableRepoMapping(boolean value);
public abstract Builder incompatibleBzlDisallowLoadAfterStatement(boolean value);