diff options
author | 2016-02-10 15:57:58 +0000 | |
---|---|---|
committer | 2016-02-11 11:48:27 +0000 | |
commit | 33ec191dba103474d95649ab3849cc37f00947f2 (patch) | |
tree | 4abd7ceb380eaec3497f29cc612381a357ead2c6 /src/main/java/com/google/devtools/build | |
parent | 79adf59e2973754c8c0415fcab45cd58c7c34697 (diff) |
Implement TODO from: https://github.com/bazelbuild/bazel/blo[]fbbd6a32b95ba746f09dae1eaeaccf675cd5b3/src/main/java/com/google/devtools/build/lib/packages/Attribute.java#L1045
This allows the default value computation for latebound attributes to consider
the values of configurable attributes. This is most directly useful for user-definable Skylark defaults, which have full access to the values of all non-latebound attributes.
Without this change, this kind of scenario crashes Bazel. For example:
------------------
select_rules.bzl:
------------------
def _impl(ctx):
ctx.file_action(
output=ctx.outputs.out_file,
content=ctx.attr.string_value,
)
return struct()
# Bug does not manifest without using this as a default.
def _derived_value(attrs, _):
return Label("//some:dep")
selector_rule = rule(
implementation=_impl,
attrs={
"string_value": attr.string(default=""),
"out_file": attr.output(),
"_derived": attr.label(default=_derived_value),
},
output_to_genfiles=True,
)
def selector_macro(name, out_file="", string_value=""):
# This will fail with selectors.
selector_rule(
name="%s_skylark" % name,
string_value=string_value,
out_file=out_file + ".skylark",
)
# This does not.
native.genrule(
name="%s_genrule" % name,
cmd="echo '" + string_value + "' > $@",
outs=[out_file + ".genrule"],
)
native.filegroup(
name=name,
srcs=[":%s_genrule" % name, "%s_skylark" % name],
)
------------------
BUILD.bzl:
------------------
config_setting(
name = "selector",
values = {"compilation_mode": "opt"},
)
selector_macro(
name = "this_rule",
string_value = """soup? """ + select({
":selector": "no, thank you.",
"//conditions:default": "yes, please!!",
}),
out_file = "this_rule.txt",
)
--
MOS_MIGRATED_REVID=114326474
Diffstat (limited to 'src/main/java/com/google/devtools/build')
11 files changed, 64 insertions, 34 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/BaseRuleClasses.java b/src/main/java/com/google/devtools/build/lib/analysis/BaseRuleClasses.java index 5b9347cf16..3f277d18c0 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/BaseRuleClasses.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/BaseRuleClasses.java @@ -81,7 +81,8 @@ public class BaseRuleClasses { static final LateBoundLabelList<BuildConfiguration> ACTION_LISTENER = new LateBoundLabelList<BuildConfiguration>() { @Override - public List<Label> getDefault(Rule rule, BuildConfiguration configuration) { + public List<Label> getDefault(Rule rule, AttributeMap attributes, + BuildConfiguration configuration) { // action_listeners are special rules; they tell the build system to add extra_actions to // existing rules. As such they need an edge to every ConfiguredTarget with the limitation // that they only run on the target configuration and should not operate on action_listeners @@ -93,7 +94,8 @@ public class BaseRuleClasses { private static final LateBoundLabelList<BuildConfiguration> COVERAGE_SUPPORT = new LateBoundLabelList<BuildConfiguration>(ImmutableList.of(COVERAGE_SUPPORT_LABEL)) { @Override - public List<Label> getDefault(Rule rule, BuildConfiguration configuration) { + public List<Label> getDefault(Rule rule, AttributeMap attributes, + BuildConfiguration configuration) { return configuration.isCodeCoverageEnabled() ? ImmutableList.copyOf(configuration.getCoverageLabels()) : ImmutableList.<Label>of(); @@ -103,7 +105,8 @@ public class BaseRuleClasses { private static final LateBoundLabelList<BuildConfiguration> GCOV = new LateBoundLabelList<BuildConfiguration>(ImmutableList.of(COVERAGE_SUPPORT_LABEL)) { @Override - public List<Label> getDefault(Rule rule, BuildConfiguration configuration) { + public List<Label> getDefault(Rule rule, AttributeMap attributes, + BuildConfiguration configuration) { return configuration.isCodeCoverageEnabled() ? ImmutableList.copyOf(configuration.getGcovLabels()) : ImmutableList.<Label>of(); @@ -113,7 +116,8 @@ public class BaseRuleClasses { private static final LateBoundLabelList<BuildConfiguration> COVERAGE_REPORT_GENERATOR = new LateBoundLabelList<BuildConfiguration>(ImmutableList.of(COVERAGE_SUPPORT_LABEL)) { @Override - public List<Label> getDefault(Rule rule, BuildConfiguration configuration) { + public List<Label> getDefault(Rule rule, AttributeMap attributes, + BuildConfiguration configuration) { return configuration.isCodeCoverageEnabled() ? ImmutableList.copyOf(configuration.getCoverageReportGeneratorLabels()) : ImmutableList.<Label>of(); @@ -126,7 +130,8 @@ public class BaseRuleClasses { private static final LateBoundLabel<BuildConfiguration> RUN_UNDER = new LateBoundLabel<BuildConfiguration>() { @Override - public Label getDefault(Rule rule, BuildConfiguration configuration) { + public Label getDefault(Rule rule, AttributeMap attributes, + BuildConfiguration configuration) { RunUnder runUnder = configuration.getRunUnder(); return runUnder == null ? null : runUnder.getLabel(); } diff --git a/src/main/java/com/google/devtools/build/lib/analysis/DependencyResolver.java b/src/main/java/com/google/devtools/build/lib/analysis/DependencyResolver.java index 3021159ffd..b694cc631c 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/DependencyResolver.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/DependencyResolver.java @@ -380,7 +380,7 @@ public abstract class DependencyResolver { // TODO(bazel-team): We should check if the implementation tries to access an undeclared // fragment. - Object actualValue = lateBoundDefault.getDefault(rule, actualConfig); + Object actualValue = lateBoundDefault.getDefault(rule, attributeMap, actualConfig); if (EvalUtils.isNullOrNone(actualValue)) { continue; } diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCppRuleClasses.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCppRuleClasses.java index 8b5171c2a6..748e1f73f0 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCppRuleClasses.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCppRuleClasses.java @@ -159,7 +159,8 @@ public class BazelCppRuleClasses { public static final LateBoundLabel<BuildConfiguration> CC_TOOLCHAIN = new LateBoundLabel<BuildConfiguration>(CROSSTOOL_LABEL) { @Override - public Label getDefault(Rule rule, BuildConfiguration configuration) { + public Label getDefault(Rule rule, AttributeMap attributes, + BuildConfiguration configuration) { return configuration.getFragment(CppConfiguration.class).getCcToolchainRuleLabel(); } }; @@ -167,7 +168,8 @@ public class BazelCppRuleClasses { public static final LateBoundLabel<BuildConfiguration> DEFAULT_MALLOC = new LateBoundLabel<BuildConfiguration>() { @Override - public Label getDefault(Rule rule, BuildConfiguration configuration) { + public Label getDefault(Rule rule, AttributeMap attributes, + BuildConfiguration configuration) { return configuration.getFragment(CppConfiguration.class).customMalloc(); } }; @@ -175,7 +177,8 @@ public class BazelCppRuleClasses { public static final LateBoundLabel<BuildConfiguration> STL = new LateBoundLabel<BuildConfiguration>() { @Override - public Label getDefault(Rule rule, BuildConfiguration configuration) { + public Label getDefault(Rule rule, AttributeMap attributes, + BuildConfiguration configuration) { return getStl(rule, configuration); } }; @@ -186,7 +189,7 @@ public class BazelCppRuleClasses { public static final LateBoundLabel<BuildConfiguration> LIPO_CONTEXT_COLLECTOR = new LateBoundLabel<BuildConfiguration>() { @Override - public Label getDefault(Rule rule, BuildConfiguration configuration) { + public Label getDefault(Rule rule, AttributeMap attributes, BuildConfiguration configuration) { // This attribute connects a target to the LIPO context target configured with the // lipo input collector configuration. CppConfiguration cppConfiguration = configuration.getFragment(CppConfiguration.class); @@ -674,7 +677,7 @@ public class BazelCppRuleClasses { private static final LateBoundLabel<BuildConfiguration> LIPO_CONTEXT = new LateBoundLabel<BuildConfiguration>() { @Override - public Label getDefault(Rule rule, BuildConfiguration configuration) { + public Label getDefault(Rule rule, AttributeMap attributes, BuildConfiguration configuration) { Label result = configuration.getFragment(CppConfiguration.class).getLipoContextLabel(); return (rule == null || rule.getLabel().equals(result)) ? null : result; } diff --git a/src/main/java/com/google/devtools/build/lib/packages/Attribute.java b/src/main/java/com/google/devtools/build/lib/packages/Attribute.java index daf61066b2..cd808c55d4 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/Attribute.java +++ b/src/main/java/com/google/devtools/build/lib/packages/Attribute.java @@ -922,8 +922,13 @@ public final class Attribute implements Comparable<Attribute> { * The actual value for the attribute for the analysis phase, which depends on the build * configuration. Note that configurations transitions are applied after the late-bound * attribute was evaluated. + * + * @param rule the rule being evaluated + * @param attributes interface for retrieving the values of the rule's other attributes + * @param o the configuration to evaluate with */ - Object getDefault(Rule rule, T o) throws EvalException, InterruptedException; + Object getDefault(Rule rule, AttributeMap attributes, T o) + throws EvalException, InterruptedException; } /** @@ -976,7 +981,7 @@ public final class Attribute implements Comparable<Attribute> { } @Override - public abstract Label getDefault(Rule rule, T configuration); + public abstract Label getDefault(Rule rule, AttributeMap attributes, T configuration); } /** @@ -1010,7 +1015,7 @@ public final class Attribute implements Comparable<Attribute> { } @Override - public abstract List<Label> getDefault(Rule rule, T configuration); + public abstract List<Label> getDefault(Rule rule, AttributeMap attributes, T configuration); } /** @@ -1040,11 +1045,9 @@ public final class Attribute implements Comparable<Attribute> { } @Override - public Object getDefault(Rule rule, Object o) throws EvalException, InterruptedException { + public Object getDefault(Rule rule, AttributeMap attributes, Object o) + throws EvalException, InterruptedException { Map<String, Object> attrValues = new HashMap<>(); - // TODO(bazel-team): support configurable attributes here. RawAttributeMapper will throw - // an exception on any instance of configurable attributes. - AttributeMap attributes = RawAttributeMapper.of(rule); for (Attribute attr : rule.getAttributes()) { if (!attr.isLateBound()) { Object value = attributes.get(attr.getName(), attr.getType()); diff --git a/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleClassFunctions.java b/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleClassFunctions.java index 3c38f3ff98..377652bf41 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleClassFunctions.java +++ b/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleClassFunctions.java @@ -116,7 +116,8 @@ public class SkylarkRuleClassFunctions { private static final LateBoundLabel<BuildConfiguration> RUN_UNDER = new LateBoundLabel<BuildConfiguration>() { @Override - public Label getDefault(Rule rule, BuildConfiguration configuration) { + public Label getDefault(Rule rule, AttributeMap attributes, + BuildConfiguration configuration) { RunUnder runUnder = configuration.getRunUnder(); return runUnder == null ? null : runUnder.getLabel(); } @@ -128,7 +129,8 @@ public class SkylarkRuleClassFunctions { private static final LateBoundLabelList<BuildConfiguration> GCOV = new LateBoundLabelList<BuildConfiguration>(ImmutableList.of(COVERAGE_SUPPORT_LABEL)) { @Override - public List<Label> getDefault(Rule rule, BuildConfiguration configuration) { + public List<Label> getDefault(Rule rule, AttributeMap attributes, + BuildConfiguration configuration) { return configuration.isCodeCoverageEnabled() ? ImmutableList.copyOf(configuration.getGcovLabels()) : ImmutableList.<Label>of(); @@ -138,7 +140,8 @@ public class SkylarkRuleClassFunctions { private static final LateBoundLabelList<BuildConfiguration> COVERAGE_REPORT_GENERATOR = new LateBoundLabelList<BuildConfiguration>(ImmutableList.of(COVERAGE_SUPPORT_LABEL)) { @Override - public List<Label> getDefault(Rule rule, BuildConfiguration configuration) { + public List<Label> getDefault(Rule rule, AttributeMap attributes, + BuildConfiguration configuration) { return configuration.isCodeCoverageEnabled() ? ImmutableList.copyOf(configuration.getCoverageReportGeneratorLabels()) : ImmutableList.<Label>of(); @@ -148,7 +151,8 @@ public class SkylarkRuleClassFunctions { private static final LateBoundLabelList<BuildConfiguration> COVERAGE_SUPPORT = new LateBoundLabelList<BuildConfiguration>(ImmutableList.of(COVERAGE_SUPPORT_LABEL)) { @Override - public List<Label> getDefault(Rule rule, BuildConfiguration configuration) { + public List<Label> getDefault(Rule rule, AttributeMap attributes, + BuildConfiguration configuration) { return configuration.isCodeCoverageEnabled() ? ImmutableList.copyOf(configuration.getCoverageLabels()) : ImmutableList.<Label>of(); diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java index 18f0b5b622..49ed57ad30 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java @@ -146,7 +146,8 @@ public final class AndroidRuleClasses { public static final LateBoundLabel<BuildConfiguration> ANDROID_SDK = new LateBoundLabel<BuildConfiguration>(DEFAULT_ANDROID_SDK, AndroidConfiguration.class) { @Override - public Label getDefault(Rule rule, BuildConfiguration configuration) { + public Label getDefault(Rule rule, AttributeMap attributes, + BuildConfiguration configuration) { return configuration.getFragment(AndroidConfiguration.class).getSdk(); } }; diff --git a/src/main/java/com/google/devtools/build/lib/rules/apple/AppleToolchain.java b/src/main/java/com/google/devtools/build/lib/rules/apple/AppleToolchain.java index 1c4b6bf509..31d223b66d 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/apple/AppleToolchain.java +++ b/src/main/java/com/google/devtools/build/lib/rules/apple/AppleToolchain.java @@ -27,6 +27,7 @@ import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment; import com.google.devtools.build.lib.analysis.config.BuildConfiguration; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.packages.Attribute.LateBoundLabel; +import com.google.devtools.build.lib.packages.AttributeMap; import com.google.devtools.build.lib.packages.Rule; import com.google.devtools.build.lib.packages.RuleClass; import com.google.devtools.build.lib.packages.RuleClass.Builder; @@ -174,7 +175,8 @@ public class AppleToolchain { new LateBoundLabel<BuildConfiguration>( AppleCommandLineOptions.DEFAULT_XCODE_VERSION_CONFIG_LABEL, AppleConfiguration.class) { @Override - public Label getDefault(Rule rule, BuildConfiguration configuration) { + public Label getDefault(Rule rule, AttributeMap attributes, + BuildConfiguration configuration) { return configuration.getFragment(AppleConfiguration.class).getXcodeConfigLabel(); } }; diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainRule.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainRule.java index d8892df7d5..8b7d64a35e 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainRule.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainRule.java @@ -27,6 +27,7 @@ import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment; import com.google.devtools.build.lib.analysis.config.BuildConfiguration; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.packages.Attribute.LateBoundLabel; +import com.google.devtools.build.lib.packages.AttributeMap; import com.google.devtools.build.lib.packages.Rule; import com.google.devtools.build.lib.packages.RuleClass; import com.google.devtools.build.lib.packages.RuleClass.Builder; @@ -38,7 +39,8 @@ public final class CcToolchainRule implements RuleDefinition { private static final LateBoundLabel<BuildConfiguration> LIBC_LINK = new LateBoundLabel<BuildConfiguration>(CppConfiguration.class) { @Override - public Label getDefault(Rule rule, BuildConfiguration configuration) { + public Label getDefault(Rule rule, AttributeMap attributes, + BuildConfiguration configuration) { return configuration.getFragment(CppConfiguration.class).getLibcLabel(); } }; diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaSemantics.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaSemantics.java index 86bd7d87dd..911c1011c0 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaSemantics.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaSemantics.java @@ -33,6 +33,7 @@ import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.packages.Attribute.LateBoundLabel; import com.google.devtools.build.lib.packages.Attribute.LateBoundLabelList; +import com.google.devtools.build.lib.packages.AttributeMap; import com.google.devtools.build.lib.packages.ImplicitOutputsFunction.SafeImplicitOutputsFunction; import com.google.devtools.build.lib.packages.Rule; import com.google.devtools.build.lib.rules.java.DeployArchiveBuilder.Compression; @@ -88,7 +89,8 @@ public interface JavaSemantics { LateBoundLabel<BuildConfiguration> JAVA_TOOLCHAIN = new LateBoundLabel<BuildConfiguration>(JAVA_TOOLCHAIN_LABEL, JavaConfiguration.class) { @Override - public Label getDefault(Rule rule, BuildConfiguration configuration) { + public Label getDefault(Rule rule, AttributeMap attributes, + BuildConfiguration configuration) { return configuration.getFragment(JavaConfiguration.class).getToolchainLabel(); } }; @@ -145,7 +147,8 @@ public interface JavaSemantics { LateBoundLabel<BuildConfiguration> JVM = new LateBoundLabel<BuildConfiguration>(JavaImplicitAttributes.JDK_LABEL, Jvm.class) { @Override - public Label getDefault(Rule rule, BuildConfiguration configuration) { + public Label getDefault(Rule rule, AttributeMap attributes, + BuildConfiguration configuration) { return configuration.getFragment(Jvm.class).getJvmLabel(); } }; @@ -161,7 +164,8 @@ public interface JavaSemantics { } @Override - public Label getDefault(Rule rule, BuildConfiguration configuration) { + public Label getDefault(Rule rule, AttributeMap attributes, + BuildConfiguration configuration) { return configuration.getFragment(Jvm.class).getJvmLabel(); } }; @@ -173,7 +177,8 @@ public interface JavaSemantics { LateBoundLabel<BuildConfiguration> JAVA_LAUNCHER = new LateBoundLabel<BuildConfiguration>(JavaConfiguration.class) { @Override - public Label getDefault(Rule rule, BuildConfiguration configuration) { + public Label getDefault(Rule rule, AttributeMap attributes, + BuildConfiguration configuration) { return configuration.getFragment(JavaConfiguration.class).getJavaLauncherLabel(); } }; @@ -181,7 +186,8 @@ public interface JavaSemantics { LateBoundLabelList<BuildConfiguration> JAVA_PLUGINS = new LateBoundLabelList<BuildConfiguration>() { @Override - public List<Label> getDefault(Rule rule, BuildConfiguration configuration) { + public List<Label> getDefault(Rule rule, AttributeMap attributes, + BuildConfiguration configuration) { return ImmutableList.copyOf(configuration.getPlugins()); } }; @@ -192,7 +198,8 @@ public interface JavaSemantics { LateBoundLabel<BuildConfiguration> PROGUARD = new LateBoundLabel<BuildConfiguration>(JavaConfiguration.class) { @Override - public Label getDefault(Rule rule, BuildConfiguration configuration) { + public Label getDefault(Rule rule, AttributeMap attributes, + BuildConfiguration configuration) { return configuration.getFragment(JavaConfiguration.class).getProguardBinary(); } }; @@ -200,7 +207,8 @@ public interface JavaSemantics { LateBoundLabelList<BuildConfiguration> EXTRA_PROGUARD_SPECS = new LateBoundLabelList<BuildConfiguration>() { @Override - public List<Label> getDefault(Rule rule, BuildConfiguration configuration) { + public List<Label> getDefault(Rule rule, AttributeMap attributes, + BuildConfiguration configuration) { return ImmutableList.copyOf( configuration.getFragment(JavaConfiguration.class).getExtraProguardSpecs()); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/IosTestRule.java b/src/main/java/com/google/devtools/build/lib/rules/objc/IosTestRule.java index 84a9d43009..8f3ed37fc5 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/IosTestRule.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/IosTestRule.java @@ -148,7 +148,8 @@ public class IosTestRule implements RuleDefinition { .value( new LateBoundLabelList<BuildConfiguration>(gcov) { @Override - public List<Label> getDefault(Rule rule, BuildConfiguration configuration) { + public List<Label> getDefault(Rule rule, AttributeMap attributes, + BuildConfiguration configuration) { if (!configuration.isCodeCoverageEnabled()) { return ImmutableList.of(); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java index 5dca7d87fb..6d9a07b300 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java @@ -865,7 +865,8 @@ public class ObjcRuleClasses { .value( new LateBoundLabel<BuildConfiguration>(ObjcConfiguration.class) { @Override - public Label getDefault(Rule rule, BuildConfiguration configuration) { + public Label getDefault(Rule rule, AttributeMap attributes, + BuildConfiguration configuration) { AppleConfiguration appleConfiguration = configuration.getFragment(AppleConfiguration.class); if (appleConfiguration.getBundlingPlatform() != Platform.IOS_DEVICE) { |