aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/Expander.java215
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/LocationExpander.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java171
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/RunfilesSupport.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleContext.java7
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/python/BazelPythonSemantics.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java12
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinaryMobileInstall.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidHostServiceFixture.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/ApkActionsBuilder.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java6
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java29
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/genrule/GenRuleBase.java7
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationHelper.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaRuntime.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkCommon.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchain.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/AppleStubBinary.java5
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/CompilationAttributes.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/IosTest.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java2
24 files changed, 275 insertions, 219 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/Expander.java b/src/main/java/com/google/devtools/build/lib/analysis/Expander.java
new file mode 100644
index 0000000000..69f45f9cc4
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/analysis/Expander.java
@@ -0,0 +1,215 @@
+// Copyright 2017 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+package com.google.devtools.build.lib.analysis;
+
+import com.google.common.collect.ImmutableList;
+import com.google.devtools.build.lib.analysis.LocationExpander.Options;
+import com.google.devtools.build.lib.shell.ShellUtils;
+import com.google.devtools.build.lib.syntax.Type;
+import java.util.ArrayList;
+import java.util.List;
+import javax.annotation.Nullable;
+
+/**
+ * Expansion of strings and string lists by replacing make variables and $(location) functions.
+ */
+public final class Expander {
+ /** Indicates whether a string list attribute should be tokenized. */
+ private enum Tokenize {
+ YES,
+ NO
+ }
+
+ private final RuleContext ruleContext;
+ private final ConfigurationMakeVariableContext makeVariableContext;
+ @Nullable private final LocationExpander locationExpander;
+
+ private Expander(
+ RuleContext ruleContext,
+ ConfigurationMakeVariableContext makeVariableContext,
+ @Nullable LocationExpander locationExpander) {
+ this.ruleContext = ruleContext;
+ this.makeVariableContext = makeVariableContext;
+ this.locationExpander = locationExpander;
+ }
+
+ Expander(
+ RuleContext ruleContext,
+ ConfigurationMakeVariableContext makeVariableContext) {
+ this(ruleContext, makeVariableContext, null);
+ }
+
+ /**
+ * Returns a new instance that also expands locations using the default configuration of
+ * {@link LocationExpander}.
+ */
+ public Expander withLocations(Options... options) {
+ LocationExpander newLocationExpander =
+ new LocationExpander(ruleContext, options);
+ return new Expander(ruleContext, makeVariableContext, newLocationExpander);
+ }
+
+ /**
+ * Returns a new instance that also expands locations, passing {@link Options#ALLOW_DATA} to the
+ * underlying {@link LocationExpander}.
+ */
+ public Expander withDataLocations() {
+ return withLocations(Options.ALLOW_DATA);
+ }
+
+ /**
+ * Returns a new instance that also expands locations, passing {@link Options#ALLOW_DATA} and
+ * {@link Options#EXEC_PATHS} to the underlying {@link LocationExpander}.
+ */
+ public Expander withDataExecLocations() {
+ return withLocations(Options.ALLOW_DATA, Options.EXEC_PATHS);
+ }
+
+ /**
+ * Expands the given value string, tokenizes it, and then adds it to the given list. The attribute
+ * name is only used for error reporting.
+ */
+ public void tokenizeAndExpandMakeVars(
+ List<String> result,
+ String attributeName,
+ String value) {
+ expandValue(result, attributeName, value, Tokenize.YES);
+ }
+
+ /**
+ * Expands make variables and $(location) tags in value, and optionally tokenizes the result.
+ */
+ private void expandValue(
+ List<String> tokens,
+ String attributeName,
+ String value,
+ Tokenize tokenize) {
+ value = expand(attributeName, value);
+ if (tokenize == Tokenize.YES) {
+ try {
+ ShellUtils.tokenize(tokens, value);
+ } catch (ShellUtils.TokenizationException e) {
+ ruleContext.attributeError(attributeName, e.getMessage());
+ }
+ } else {
+ tokens.add(value);
+ }
+ }
+
+ /**
+ * Returns the string "expression" after expanding all embedded references to
+ * "Make" variables. If any errors are encountered, they are reported, and
+ * "expression" is returned unchanged.
+ *
+ * @param attributeName the name of the attribute
+ * @return the expansion of "expression".
+ */
+ public String expand(String attributeName) {
+ return expand(attributeName, ruleContext.attributes().get(attributeName, Type.STRING));
+ }
+
+ /**
+ * Returns the string "expression" after expanding all embedded references to
+ * "Make" variables. If any errors are encountered, they are reported, and
+ * "expression" is returned unchanged.
+ *
+ * @param attributeName the name of the attribute from which "expression" comes;
+ * used for error reporting.
+ * @param expression the string to expand.
+ * @return the expansion of "expression".
+ */
+ public String expand(String attributeName, String expression) {
+ if (locationExpander != null) {
+ expression = locationExpander.expandAttribute(attributeName, expression);
+ }
+ try {
+ return MakeVariableExpander.expand(expression, makeVariableContext);
+ } catch (MakeVariableExpander.ExpansionException e) {
+ ruleContext.attributeError(attributeName, e.getMessage());
+ return expression;
+ }
+ }
+
+ /**
+ * Expands all the strings in the given list, optionally tokenizing them after expansion. The
+ * attribute name is only used for error reporting.
+ */
+ private ImmutableList<String> expandAndTokenizeList(
+ String attrName, List<String> values, Tokenize tokenize) {
+ List<String> variables = new ArrayList<>();
+ for (String variable : values) {
+ expandValue(variables, attrName, variable, tokenize);
+ }
+ return ImmutableList.copyOf(variables);
+ }
+
+ /**
+ * Obtains the value of the attribute, expands all values, and returns the resulting list. If the
+ * attribute does not exist or is not of type {@link Type#STRING_LIST}, then this method returns
+ * an empty list.
+ */
+ public ImmutableList<String> list(String attrName) {
+ if (!ruleContext.getRule().isAttrDefined(attrName, Type.STRING_LIST)) {
+ // TODO(bazel-team): This should be an error.
+ return ImmutableList.of();
+ }
+ return list(attrName, ruleContext.attributes().get(attrName, Type.STRING_LIST));
+ }
+
+ /**
+ * Expands all the strings in the given list. The attribute name is only used for error reporting.
+ */
+ public ImmutableList<String> list(String attrName, List<String> values) {
+ return expandAndTokenizeList(attrName, values, Tokenize.NO);
+ }
+
+ /**
+ * Obtains the value of the attribute, expands, and tokenizes all values. If the attribute does
+ * not exist or is not of type {@link Type#STRING_LIST}, then this method returns an empty list.
+ */
+ public ImmutableList<String> tokenized(String attrName) {
+ if (!ruleContext.getRule().isAttrDefined(attrName, Type.STRING_LIST)) {
+ // TODO(bazel-team): This should be an error.
+ return ImmutableList.of();
+ }
+ return tokenized(attrName, ruleContext.attributes().get(attrName, Type.STRING_LIST));
+ }
+
+ /**
+ * Expands all the strings in the given list, and tokenizes them after expansion. The attribute
+ * name is only used for error reporting.
+ */
+ public ImmutableList<String> tokenized(String attrName, List<String> values) {
+ return expandAndTokenizeList(attrName, values, Tokenize.YES);
+ }
+
+ /**
+ * If the string consists of a single variable, returns the expansion of that variable. Otherwise,
+ * returns null. Syntax errors are reported.
+ *
+ * @param attrName the name of the attribute from which "expression" comes; used for error
+ * reporting.
+ * @param expression the string to expand.
+ * @return the expansion of "expression", or null.
+ */
+ @Nullable
+ public String expandSingleMakeVariable(String attrName, String expression) {
+ try {
+ return MakeVariableExpander.expandSingleVariable(expression, makeVariableContext);
+ } catch (MakeVariableExpander.ExpansionException e) {
+ ruleContext.attributeError(attrName, e.getMessage());
+ return expression;
+ }
+ }
+}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/LocationExpander.java b/src/main/java/com/google/devtools/build/lib/analysis/LocationExpander.java
index 5d685160b7..9d3fa1d127 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/LocationExpander.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/LocationExpander.java
@@ -131,7 +131,7 @@ public class LocationExpander {
* Expands attribute's location and locations tags based on the target and
* location map.
*
- * @param attrName name of the attribute
+ * @param attrName name of the attribute; only used for error reporting
* @param attrValue initial value of the attribute
* @return attribute value with expanded location tags or original value in
* case of errors
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
index 9a114f544f..e17f74a21a 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
@@ -38,7 +38,6 @@ import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.actions.ArtifactOwner;
import com.google.devtools.build.lib.actions.Root;
import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider.PrerequisiteValidator;
-import com.google.devtools.build.lib.analysis.LocationExpander.Options;
import com.google.devtools.build.lib.analysis.actions.ActionConstructionContext;
import com.google.devtools.build.lib.analysis.buildinfo.BuildInfoFactory.BuildInfoKey;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
@@ -80,7 +79,6 @@ import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.
import com.google.devtools.build.lib.packages.RuleErrorConsumer;
import com.google.devtools.build.lib.packages.Target;
import com.google.devtools.build.lib.packages.TargetUtils;
-import com.google.devtools.build.lib.shell.ShellUtils;
import com.google.devtools.build.lib.syntax.EvalException;
import com.google.devtools.build.lib.syntax.Type;
import com.google.devtools.build.lib.syntax.Type.LabelClass;
@@ -972,96 +970,12 @@ public final class RuleContext extends TargetContext
initConfigurationMakeVariableContext(ImmutableList.copyOf(makeVariableSuppliers));
}
- /** Indicates whether a string list attribute should be tokenized. */
- public enum Tokenize {
- YES,
- NO
+ public Expander getExpander(ConfigurationMakeVariableContext makeVariableContext) {
+ return new Expander(this, makeVariableContext);
}
- /**
- * Gets an attribute of type STRING_LIST expanding Make variables, $(location) tags into the
- * dependency location (see {@link LocationExpander} for details) and tokenizes the result.
- *
- * @param attributeName the name of the attribute to process
- * @return a list of strings containing the expanded and tokenized values for the attribute
- */
- public ImmutableList<String> getTokenizedStringListAttr(String attributeName) {
- return getExpandedStringListAttr(attributeName, Tokenize.YES);
- }
-
- /**
- * Gets an attribute of type STRING_LIST expanding Make variables and $(location) tags, and
- * optionally tokenizes the result. Doesn't register any {@link MakeVariableSupplier}.
- *
- * @param attributeName the name of the attribute to process
- * @return a list of strings containing the processed values for the attribute
- */
- public ImmutableList<String> getExpandedStringListAttr(String attributeName) {
- return getExpandedStringListAttr(attributeName, Tokenize.NO);
- }
-
- /**
- * Gets an attribute of type STRING_LIST expanding Make variables and $(location) tags, and
- * optionally tokenizes the result.
- *
- * @param attributeName the name of the attribute to process
- * @return a list of strings containing the processed values for the attribute
- */
- private ImmutableList<String> getExpandedStringListAttr(
- String attributeName,
- Tokenize tokenize) {
- if (!getRule().isAttrDefined(attributeName, Type.STRING_LIST)) {
- // TODO(bazel-team): This should be an error.
- return ImmutableList.of();
- }
- List<String> original = attributes().get(attributeName, Type.STRING_LIST);
- if (original.isEmpty()) {
- return ImmutableList.of();
- }
- List<String> tokens = new ArrayList<>();
- LocationExpander locationExpander =
- new LocationExpander(this, LocationExpander.Options.ALLOW_DATA);
-
- for (String token : original) {
- expandValue(tokens, attributeName, token, locationExpander, tokenize);
- }
- return ImmutableList.copyOf(tokens);
- }
-
- /**
- * Expands make variables in value and tokenizes the result into tokens.
- */
- public void tokenizeAndExpandMakeVars(
- List<String> result,
- String attributeName,
- String value) {
- LocationExpander locationExpander =
- new LocationExpander(this, Options.ALLOW_DATA, Options.EXEC_PATHS);
- expandValue(result, attributeName, value, locationExpander, Tokenize.YES);
- }
-
- /**
- * Expands make variables and $(location) tags in value, and optionally tokenizes the result.
- */
- private void expandValue(
- List<String> tokens,
- String attributeName,
- String value,
- @Nullable LocationExpander locationExpander,
- Tokenize tokenize) {
- if (locationExpander != null) {
- value = locationExpander.expandAttribute(attributeName, value);
- }
- value = expandMakeVariables(attributeName, value);
- if (tokenize == Tokenize.YES) {
- try {
- ShellUtils.tokenize(tokens, value);
- } catch (ShellUtils.TokenizationException e) {
- attributeError(attributeName, e.getMessage());
- }
- } else {
- tokens.add(value);
- }
+ public Expander getExpander() {
+ return new Expander(this, getConfigurationMakeVariableContext());
}
public ImmutableMap<String, String> getMakeVariables(Iterable<String> attributeNames) {
@@ -1095,83 +1009,6 @@ public final class RuleContext extends TargetContext
return configurationMakeVariableContext;
}
- /**
- * Expands the make variables in {@code expression}.
- *
- * @param attributeName the name of the attribute from which "expression" comes; used for error
- * reporting.
- * @return the expanded string.
- */
- public String expandedMakeVariables(String attributeName) {
- String expression = attributes().get(attributeName, Type.STRING);
- return expandMakeVariables(attributeName, expression);
- }
-
- /**
- * Expands the make variables in {@code expression}.
- *
- * @param attributeName the name of the attribute from which "expression" comes; used for error
- * reporting.
- * @param expression the string to expand.
- * @return the expanded string.
- */
- public String expandMakeVariables(String attributeName, String expression) {
- return expandMakeVariables(attributeName, expression, getConfigurationMakeVariableContext());
- }
-
- /**
- * Returns the string "expression" after expanding all embedded references to
- * "Make" variables. If any errors are encountered, they are reported, and
- * "expression" is returned unchanged.
- *
- * @param attributeName the name of the attribute from which "expression" comes;
- * used for error reporting.
- * @param expression the string to expand.
- * @param context the ConfigurationMakeVariableContext which can have a customized
- * lookupMakeVariable(String) method.
- * @return the expansion of "expression".
- */
- public String expandMakeVariables(
- String attributeName, String expression, ConfigurationMakeVariableContext context) {
- try {
- return MakeVariableExpander.expand(expression, context);
- } catch (MakeVariableExpander.ExpansionException e) {
- attributeError(attributeName, e.getMessage());
- return expression;
- }
- }
-
- /**
- * Gets the value of the STRING_LIST attribute expanding all make variables.
- */
- public List<String> expandedMakeVariablesList(String attrName) {
- List<String> variables = new ArrayList<>();
- for (String variable : attributes().get(attrName, Type.STRING_LIST)) {
- variables.add(expandMakeVariables(attrName, variable));
- }
- return variables;
- }
-
- /**
- * If the string consists of a single variable, returns the expansion of that variable. Otherwise,
- * returns null. Syntax errors are reported.
- *
- * @param attrName the name of the attribute from which "expression" comes; used for error
- * reporting.
- * @param expression the string to expand.
- * @return the expansion of "expression", or null.
- */
- @Nullable
- public String expandSingleMakeVariable(String attrName, String expression) {
- try {
- return MakeVariableExpander
- .expandSingleVariable(expression, getConfigurationMakeVariableContext());
- } catch (MakeVariableExpander.ExpansionException e) {
- attributeError(attrName, e.getMessage());
- return expression;
- }
- }
-
@Nullable
public ToolchainContext getToolchainContext() {
return toolchainContext;
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RunfilesSupport.java b/src/main/java/com/google/devtools/build/lib/analysis/RunfilesSupport.java
index 7f4c12d14a..230b1fd61e 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/RunfilesSupport.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/RunfilesSupport.java
@@ -428,6 +428,7 @@ public final class RunfilesSupport {
RuleContext ruleContext,
CommandLine additionalArgs) {
return CommandLine.concat(
- ruleContext.getTokenizedStringListAttr("args"), additionalArgs);
+ ruleContext.getExpander().withDataLocations().tokenized("args"),
+ additionalArgs);
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleContext.java b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleContext.java
index deb4595015..fc82668063 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleContext.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleContext.java
@@ -1019,9 +1019,7 @@ public final class SkylarkRuleContext implements SkylarkValue {
public String expandMakeVariables(String attributeName, String command,
final Map<String, String> additionalSubstitutions) throws EvalException {
checkMutable("expand_make_variables");
- return ruleContext.expandMakeVariables(
- attributeName,
- command,
+ ConfigurationMakeVariableContext makeVariableContext =
new ConfigurationMakeVariableContext(
// TODO(lberki): This should be removed. But only after either verifying that no one
// uses it or providing an alternative.
@@ -1036,7 +1034,8 @@ public final class SkylarkRuleContext implements SkylarkValue {
return super.lookupMakeVariable(variableName);
}
}
- });
+ };
+ return ruleContext.getExpander(makeVariableContext).expand(attributeName, command);
}
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/python/BazelPythonSemantics.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/python/BazelPythonSemantics.java
index a11dbe2de4..328f553691 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/python/BazelPythonSemantics.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/python/BazelPythonSemantics.java
@@ -101,7 +101,7 @@ public class BazelPythonSemantics implements PythonSemantics {
// adjusted to be relative to the workspace name.
packageFragment = PathFragment.create(ruleContext.getWorkspaceName())
.getRelative(packageFragment);
- for (String importsAttr : ruleContext.expandedMakeVariablesList("imports")) {
+ for (String importsAttr : ruleContext.getExpander().list("imports")) {
if (importsAttr.startsWith("/")) {
ruleContext.attributeWarning("imports",
"ignoring invalid absolute path '" + importsAttr + "'");
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java
index 39041a2d6b..bfa807401d 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java
@@ -246,7 +246,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
resourceDeps,
ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_R_TXT),
ResourceFilter.fromRuleContext(ruleContext),
- ruleContext.getTokenizedStringListAttr("nocompress_extensions"),
+ ruleContext.getExpander().withDataLocations().tokenized("nocompress_extensions"),
ruleContext.attributes().get("crunch_png", Type.BOOLEAN),
ProguardHelper.getProguardConfigArtifact(ruleContext, ""),
createMainDexProguardSpec(ruleContext),
@@ -266,7 +266,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
ruleContext,
getDxArtifact(ruleContext, "android_instant_run.ap_"),
resourceDeps,
- ruleContext.getTokenizedStringListAttr("nocompress_extensions"),
+ ruleContext.getExpander().withDataLocations().tokenized("nocompress_extensions"),
ruleContext.attributes().get("crunch_png", Type.BOOLEAN),
ProguardHelper.getProguardConfigArtifact(ruleContext, "instant_run"));
ruleContext.assertNoErrors();
@@ -894,7 +894,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
.setTargetAaptVersion(AndroidAaptVersion.chooseTargetAaptVersion(ruleContext))
.setResourceFilter(ResourceFilter.fromRuleContext(ruleContext))
.setUncompressedExtensions(
- ruleContext.getTokenizedStringListAttr("nocompress_extensions"))
+ ruleContext.getExpander().withDataLocations().tokenized("nocompress_extensions"))
.build();
filesBuilder.add(ruleContext.getImplicitOutputArtifact(
AndroidRuleClasses.ANDROID_RESOURCE_SHRINKER_LOG));
@@ -938,7 +938,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
Function<Artifact, Artifact> derivedJarFunction,
@Nullable Artifact proguardOutputMap)
throws InterruptedException, RuleErrorException {
- List<String> dexopts = ruleContext.getTokenizedStringListAttr("dexopts");
+ List<String> dexopts = ruleContext.getExpander().withDataLocations().tokenized("dexopts");
MultidexMode multidexMode = getMultidexMode(ruleContext);
if (!supportsMultidexMode(ruleContext, multidexMode)) {
ruleContext.throwWithRuleError("Multidex mode \"" + multidexMode.getAttributeValue()
@@ -1456,7 +1456,9 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
.addExecPath(mainDexList)
.addExecPath(strippedJar)
.addExecPath(jar)
- .addAll(ruleContext.getTokenizedStringListAttr("main_dex_list_opts"))
+ .addAll(
+ ruleContext
+ .getExpander().withDataLocations().tokenized("main_dex_list_opts"))
.build())
.build(ruleContext));
return mainDexList;
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinaryMobileInstall.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinaryMobileInstall.java
index 4cde375390..a8eb438270 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinaryMobileInstall.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinaryMobileInstall.java
@@ -78,7 +78,7 @@ public final class AndroidBinaryMobileInstall {
ruleContext.getImplicitOutputArtifact(
AndroidRuleClasses.ANDROID_INCREMENTAL_RESOURCES_APK),
resourceDeps,
- ruleContext.getTokenizedStringListAttr("nocompress_extensions"),
+ ruleContext.getExpander().withDataLocations().tokenized("nocompress_extensions"),
ruleContext.attributes().get("crunch_png", Type.BOOLEAN),
ProguardHelper.getProguardConfigArtifact(ruleContext, "incremental"));
ruleContext.assertNoErrors();
@@ -90,7 +90,7 @@ public final class AndroidBinaryMobileInstall {
ruleContext,
getMobileInstallArtifact(ruleContext, "android_resources.ap_"),
resourceDeps,
- ruleContext.getTokenizedStringListAttr("nocompress_extensions"),
+ ruleContext.getExpander().withDataLocations().tokenized("nocompress_extensions"),
ruleContext.attributes().get("crunch_png", Type.BOOLEAN),
ProguardHelper.getProguardConfigArtifact(ruleContext, "incremental_split"));
ruleContext.assertNoErrors();
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidHostServiceFixture.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidHostServiceFixture.java
index dbe0034f58..676a9ee6df 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidHostServiceFixture.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidHostServiceFixture.java
@@ -52,7 +52,7 @@ public class AndroidHostServiceFixture implements RuleConfiguredTargetFactory {
.addNativeDeclaredProvider(
new AndroidHostServiceFixtureInfoProvider(
executable.getExecutable(),
- ruleContext.getTokenizedStringListAttr("service_names"),
+ ruleContext.getExpander().withDataLocations().tokenized("service_names"),
AndroidCommon.getSupportApks(ruleContext),
ruleContext.attributes().get("provides_test_args", Type.BOOLEAN),
ruleContext.attributes().get("daemon", Type.BOOLEAN)))
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ApkActionsBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/android/ApkActionsBuilder.java
index c7abbb81f6..8391c5efa1 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/ApkActionsBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/ApkActionsBuilder.java
@@ -332,7 +332,7 @@ public class ApkActionsBuilder {
}
ImmutableList<String> noCompressExtensions =
- ruleContext.getTokenizedStringListAttr("nocompress_extensions");
+ ruleContext.getExpander().withDataLocations().tokenized("nocompress_extensions");
if (!noCompressExtensions.isEmpty()) {
compressedApkCommandLine.addAll("--nocompress_suffixes", noCompressExtensions);
singleJarCommandLine.addAll("--nocompress_suffixes", noCompressExtensions);
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java b/src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java
index e70bf42bf5..bf89607b82 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java
@@ -213,7 +213,7 @@ public final class ApplicationManifest {
for (String variable : manifestValues.keySet()) {
manifestValues.put(
- variable, context.expandMakeVariables("manifest_values", manifestValues.get(variable)));
+ variable, context.getExpander().expand("manifest_values", manifestValues.get(variable)));
}
return ImmutableMap.copyOf(manifestValues);
}
@@ -805,7 +805,7 @@ public final class ApplicationManifest {
ResourceFilter resourceFilter = ResourceFilter.fromRuleContext(ruleContext);
List<String> uncompressedExtensions =
- ruleContext.getTokenizedStringListAttr("nocompress_extensions");
+ ruleContext.getExpander().withDataLocations().tokenized("nocompress_extensions");
ImmutableList.Builder<String> additionalAaptOpts = ImmutableList.builder();
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 36278ef9c9..2bd0e14767 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
@@ -353,7 +353,7 @@ public final class CcCommon {
if (!ruleContext.getRule().isAttrDefined(NO_COPTS_ATTRIBUTE, Type.STRING)) {
return null;
}
- String nocoptsAttr = ruleContext.expandedMakeVariables(NO_COPTS_ATTRIBUTE);
+ String nocoptsAttr = ruleContext.getExpander().expand(NO_COPTS_ATTRIBUTE);
try {
return Pattern.compile(nocoptsAttr);
} catch (PatternSyntaxException e) {
@@ -388,7 +388,7 @@ public final class CcCommon {
*/
public List<String> getDefines() {
List<String> defines = new ArrayList<>();
- for (String define : ruleContext.expandedMakeVariablesList(DEFINES_ATTRIBUTE)) {
+ for (String define : ruleContext.getExpander().list(DEFINES_ATTRIBUTE)) {
List<String> tokens = new ArrayList<>();
try {
ShellUtils.tokenize(tokens, define);
@@ -447,7 +447,7 @@ public final class CcCommon {
List<PathFragment> result = new ArrayList<>();
PackageIdentifier packageIdentifier = ruleContext.getLabel().getPackageIdentifier();
PathFragment packageFragment = packageIdentifier.getPathUnderExecRoot();
- for (String includesAttr : ruleContext.expandedMakeVariablesList("includes")) {
+ for (String includesAttr : ruleContext.getExpander().list("includes")) {
if (includesAttr.startsWith("/")) {
ruleContext.attributeWarning("includes",
"ignoring invalid absolute path '" + includesAttr + "'");
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 e5c871ef8a..6a21ba0b9d 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
@@ -27,6 +27,7 @@ import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.actions.MiddlemanFactory;
import com.google.devtools.build.lib.actions.ParameterFile;
import com.google.devtools.build.lib.analysis.AnalysisUtils;
+import com.google.devtools.build.lib.analysis.Expander;
import com.google.devtools.build.lib.analysis.FileProvider;
import com.google.devtools.build.lib.analysis.PlatformConfiguration;
import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder;
@@ -155,23 +156,22 @@ public class CppHelper {
!ruleContext.getFeatures().contains("no_copts_tokenization");
List<String> tokens = new ArrayList<>();
+ Expander expander = ruleContext.getExpander().withDataExecLocations();
for (String token : input) {
- try {
- // Legacy behavior: tokenize all items.
- if (tokenization) {
- ruleContext.tokenizeAndExpandMakeVars(tokens, attributeName, token);
- } else {
- String exp =
- ruleContext.expandSingleMakeVariable(attributeName, token);
- if (exp != null) {
+ // Legacy behavior: tokenize all items.
+ if (tokenization) {
+ expander.tokenizeAndExpandMakeVars(tokens, attributeName, token);
+ } else {
+ String exp = expander.expandSingleMakeVariable(attributeName, token);
+ if (exp != null) {
+ try {
ShellUtils.tokenize(tokens, exp);
- } else {
- tokens.add(
- ruleContext.expandMakeVariables(attributeName, token));
+ } catch (ShellUtils.TokenizationException e) {
+ ruleContext.attributeError(attributeName, e.getMessage());
}
+ } else {
+ tokens.add(expander.expand(attributeName, token));
}
- } catch (ShellUtils.TokenizationException e) {
- ruleContext.attributeError(attributeName, e.getMessage());
}
}
return ImmutableList.copyOf(tokens);
@@ -202,13 +202,14 @@ public class CppHelper {
public static List<String> expandLinkopts(
RuleContext ruleContext, String attrName, Iterable<String> values) {
List<String> result = new ArrayList<>();
+ Expander expander = ruleContext.getExpander().withDataExecLocations();
for (String value : values) {
if (isLinkoptLabel(value)) {
if (!expandLabel(ruleContext, result, value)) {
ruleContext.attributeError(attrName, "could not resolve label '" + value + "'");
}
} else {
- ruleContext
+ expander
.tokenizeAndExpandMakeVars(
result,
attrName,
diff --git a/src/main/java/com/google/devtools/build/lib/rules/genrule/GenRuleBase.java b/src/main/java/com/google/devtools/build/lib/rules/genrule/GenRuleBase.java
index f91bcdec48..2a59bffbc7 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/genrule/GenRuleBase.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/genrule/GenRuleBase.java
@@ -270,10 +270,9 @@ public abstract class GenRuleBase implements RuleConfiguredTargetFactory {
*/
protected String resolveCommand(String command, final RuleContext ruleContext,
final NestedSet<Artifact> resolvedSrcs, final NestedSet<Artifact> filesToBuild) {
- return ruleContext.expandMakeVariables(
- "cmd",
- command,
- new CommandResolverContext(ruleContext, resolvedSrcs, filesToBuild));
+ return ruleContext
+ .getExpander(new CommandResolverContext(ruleContext, resolvedSrcs, filesToBuild))
+ .expand("cmd", command);
}
/**
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java
index b394ef6aaf..489844c265 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java
@@ -461,7 +461,7 @@ public class JavaCommon {
return Streams.concat(
JavaToolchainProvider.fromRuleContext(ruleContext).getJavacOptions().stream(),
Streams.stream(extraJavacOpts),
- ruleContext.getTokenizedStringListAttr("javacopts").stream())
+ ruleContext.getExpander().withDataLocations().tokenized("javacopts").stream())
.collect(toImmutableList());
}
@@ -569,7 +569,7 @@ public class JavaCommon {
public static List<String> getJvmFlags(RuleContext ruleContext) {
List<String> jvmFlags = new ArrayList<>();
jvmFlags.addAll(ruleContext.getFragment(JavaConfiguration.class).getDefaultJvmFlags());
- jvmFlags.addAll(ruleContext.getExpandedStringListAttr("jvm_flags"));
+ jvmFlags.addAll(ruleContext.getExpander().withDataLocations().list("jvm_flags"));
return jvmFlags;
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationHelper.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationHelper.java
index b1629f0063..e235cd5d10 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationHelper.java
@@ -721,7 +721,7 @@ public final class JavaCompilationHelper {
return ImmutableList.copyOf(
Iterables.concat(
JavaToolchainProvider.fromRuleContext(ruleContext).getJavacOptions(),
- ruleContext.getTokenizedStringListAttr("javacopts")));
+ ruleContext.getExpander().withDataLocations().tokenized("javacopts")));
}
public void setTranslations(Collection<Artifact> translations) {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuntime.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuntime.java
index 5f0cbdbcb3..004ce3e5c6 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuntime.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuntime.java
@@ -47,7 +47,7 @@ public class JavaRuntime implements RuleConfiguredTargetFactory {
PathFragment javaHome = defaultJavaHome(ruleContext.getLabel());
if (ruleContext.attributes().isAttributeValueExplicitlySpecified("java_home")) {
PathFragment javaHomeAttribute =
- PathFragment.create(ruleContext.expandedMakeVariables("java_home"));
+ PathFragment.create(ruleContext.getExpander().expand("java_home"));
if (!filesToBuild.isEmpty() && javaHomeAttribute.isAbsolute()) {
ruleContext.ruleError("'java_home' with an absolute path requires 'srcs' to be empty.");
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkCommon.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkCommon.java
index 1c87c48911..9e46ef9f34 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkCommon.java
@@ -512,7 +512,8 @@ public class JavaSkylarkCommon {
(ConfiguredTarget) skylarkRuleContext.getAttr().getValue(javaToolchainAttr);
JavaToolchainProvider toolchain = getJavaToolchainProvider(javaToolchainConfigTarget);
return ImmutableList.copyOf(Iterables.concat(
- toolchain.getJavacOptions(), ruleContext.getTokenizedStringListAttr("javacopts")));
+ toolchain.getJavacOptions(),
+ ruleContext.getExpander().withDataLocations().tokenized("javacopts")));
}
@SkylarkCallable(
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchain.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchain.java
index 06d6fa7561..35102f374e 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchain.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchain.java
@@ -54,7 +54,7 @@ public final class JavaToolchain implements RuleConfiguredTargetFactory {
ruleContext, "extclasspath", Mode.HOST);
String encoding = ruleContext.attributes().get("encoding", Type.STRING);
List<String> xlint = ruleContext.attributes().get("xlint", Type.STRING_LIST);
- List<String> misc = ruleContext.getTokenizedStringListAttr("misc");
+ List<String> misc = ruleContext.getExpander().withDataLocations().tokenized("misc");
boolean javacSupportsWorkers =
ruleContext.attributes().get("javac_supports_workers", Type.BOOLEAN);
Artifact javac = ruleContext.getPrerequisiteArtifact("javac", Mode.HOST);
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStubBinary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStubBinary.java
index 2d027bc0a2..43ea21958b 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStubBinary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStubBinary.java
@@ -194,7 +194,8 @@ public class AppleStubBinary implements RuleConfiguredTargetFactory {
AppleStubBinaryRule.XCENV_BASED_PATH_ATTR, PATH_NOT_NORMALIZED_ERROR);
}
- return ruleContext.expandMakeVariables(
- AppleStubBinaryRule.XCENV_BASED_PATH_ATTR, pathString, makeVariableContext);
+ return ruleContext
+ .getExpander(makeVariableContext)
+ .expand(AppleStubBinaryRule.XCENV_BASED_PATH_ATTR, pathString);
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationAttributes.java b/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationAttributes.java
index 6700f31512..39c28b750a 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationAttributes.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationAttributes.java
@@ -253,11 +253,11 @@ final class CompilationAttributes {
private static void addCompileOptionsFromRuleContext(Builder builder, RuleContext ruleContext) {
if (ruleContext.attributes().has("copts", Type.STRING_LIST)) {
- builder.addCopts(ruleContext.getTokenizedStringListAttr("copts"));
+ builder.addCopts(ruleContext.getExpander().withDataLocations().tokenized("copts"));
}
if (ruleContext.attributes().has("linkopts", Type.STRING_LIST)) {
- builder.addLinkopts(ruleContext.getTokenizedStringListAttr("linkopts"));
+ builder.addLinkopts(ruleContext.getExpander().withDataLocations().tokenized("linkopts"));
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/IosTest.java b/src/main/java/com/google/devtools/build/lib/rules/objc/IosTest.java
index b6561b1304..9b5d87a897 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/IosTest.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/IosTest.java
@@ -260,7 +260,7 @@ public final class IosTest implements RuleConfiguredTargetFactory {
CompilationAttributes.Builder.fromRuleContext(ruleContext).build())
.setCompilationArtifacts(compilationArtifacts)
.setResourceAttributes(new ResourceAttributes(ruleContext))
- .addDefines(ruleContext.getTokenizedStringListAttr("defines"))
+ .addDefines(ruleContext.getExpander().withDataLocations().tokenized("defines"))
.addDeps(ruleContext.getPrerequisites("deps", Mode.TARGET))
.addRuntimeDeps(ruleContext.getPrerequisites("runtime_deps", Mode.TARGET))
.addDeps(ruleContext.getPrerequisites("bundles", Mode.TARGET))
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java
index f6b0efe577..c104bf072a 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java
@@ -645,7 +645,7 @@ public final class ObjcCommon {
static Iterable<String> getNonCrosstoolCopts(RuleContext ruleContext) {
return Iterables.concat(
ruleContext.getFragment(ObjcConfiguration.class).getCopts(),
- ruleContext.getTokenizedStringListAttr("copts"));
+ ruleContext.getExpander().withDataLocations().tokenized("copts"));
}
static ImmutableSet<PathFragment> userHeaderSearchPaths(
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java
index b93baea714..be449de555 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java
@@ -41,7 +41,7 @@ public class ObjcLibrary implements RuleConfiguredTargetFactory {
.setCompilationAttributes(
CompilationAttributes.Builder.fromRuleContext(ruleContext).build())
.setResourceAttributes(new ResourceAttributes(ruleContext))
- .addDefines(ruleContext.getTokenizedStringListAttr("defines"))
+ .addDefines(ruleContext.getExpander().withDataLocations().tokenized("defines"))
.setCompilationArtifacts(CompilationSupport.compilationArtifacts(ruleContext))
.addDeps(ruleContext.getPrerequisites("deps", Mode.TARGET))
.addRuntimeDeps(ruleContext.getPrerequisites("runtime_deps", Mode.TARGET))