aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/rules
diff options
context:
space:
mode:
authorGravatar mstaib <mstaib@google.com>2017-09-19 17:06:32 +0200
committerGravatar László Csomor <laszlocsomor@google.com>2017-09-19 17:18:55 +0200
commit807a9b236963ff863573050d5aba146a9bbe23db (patch)
tree62b94e0f55a8c3f2a6f806f0f2288a507a6a5f77 /src/main/java/com/google/devtools/build/lib/rules
parentfd62e761b5109a721aeec7879c7194404a512535 (diff)
LateBoundDefault: enforce access to a single fragment (or none).
Currently, there is no way to enforce that LateBoundDefaults only access the fragments that they declare. This means that LateBoundDefaults can fail to declare fragments at all, or declare the wrong ones, and still have no troubles. But when trimming, these fragments must be declared, because otherwise they will not necessarily be available. This change refactors LateBoundDefault to declare a single fragment type, not a set. All existing LateBoundDefaults use sets with a single element or no elements at all for their set of fragment classes, so this does not limit anything being done currently. To account for LateBoundDefaults which do not use configuration at all, typically those which only want to access the configured attribute map, it is possible for Void to be the fragment class which is requested. To account for LateBoundDefaults which need to access methods of the BuildConfiguration instance itself, it is possible for BuildConfiguration to be the fragment class which is requested; however, this is unsafe, so it is only a temporary state until a way to do this without also giving access to all of the fragments can be added. Drive-by refactoring: LateBoundDefaults' values are now typed. All actual production LateBoundDefaults were Label or List<Label> typed, through the LateBoundLabel and LateBoundLabelList subclasses. These subclasses have been removed, and LateBoundDefault has two type parameters, one for the type of its input, and one for the type of its output. RELNOTES: None. PiperOrigin-RevId: 169242278
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java21
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/DexArchiveAspect.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/apple/AppleToolchain.java37
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainRule.java34
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CppRuleClasses.java58
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/proto/CcProtoAspect.java21
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/genrule/GenRuleBaseRule.java41
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaSemantics.java181
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoAspect.java23
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoAspect.java25
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/IosTestRule.java20
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcAspect.java37
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java181
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/proto/BazelProtoLibraryRule.java22
15 files changed, 276 insertions, 429 deletions
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 2842572fd5..b2f064848e 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
@@ -39,7 +39,7 @@ import com.google.devtools.build.lib.analysis.config.BuildOptions;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.packages.Attribute;
import com.google.devtools.build.lib.packages.Attribute.AllowedValueSet;
-import com.google.devtools.build.lib.packages.Attribute.LateBoundLabel;
+import com.google.devtools.build.lib.packages.Attribute.LateBoundDefault;
import com.google.devtools.build.lib.packages.Attribute.SplitTransition;
import com.google.devtools.build.lib.packages.AttributeMap;
import com.google.devtools.build.lib.packages.BuildType;
@@ -191,17 +191,12 @@ public final class AndroidRuleClasses {
fromTemplates("%{name}_images/emulator-meta-data.pb");
static final FileType APK = FileType.of(".apk");
- /**
- * The default label of android_sdk option
- */
- public static final class AndroidSdkLabel extends LateBoundLabel<BuildConfiguration> {
- public AndroidSdkLabel(Label androidSdk) {
- super(androidSdk, AndroidConfiguration.class);
- }
- @Override
- public Label resolve(Rule rule, AttributeMap attributes, BuildConfiguration configuration) {
- return configuration.getFragment(AndroidConfiguration.class).getSdk();
- }
+ /** The default label of android_sdk option */
+ public static LateBoundDefault<?, Label> getAndroidSdkLabel(Label androidSdk) {
+ return LateBoundDefault.fromTargetConfiguration(
+ AndroidConfiguration.class,
+ androidSdk,
+ (rule, attributes, configuration) -> configuration.getSdk());
}
public static final SplitTransition<BuildOptions> ANDROID_SPLIT_TRANSITION =
@@ -555,7 +550,7 @@ public final class AndroidRuleClasses {
.add(
attr(":android_sdk", LABEL)
.allowedRuleClasses("android_sdk", "filegroup")
- .value(new AndroidSdkLabel(env.getToolsLabel(AndroidRuleClasses.DEFAULT_SDK))))
+ .value(getAndroidSdkLabel(env.getToolsLabel(AndroidRuleClasses.DEFAULT_SDK))))
/* <!-- #BLAZE_RULE($android_base).ATTRIBUTE(plugins) -->
Java compiler plugins to run at compile-time.
Every <code>java_plugin</code> specified in
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/DexArchiveAspect.java b/src/main/java/com/google/devtools/build/lib/rules/android/DexArchiveAspect.java
index b3a5ff58e7..8f4a8ff45c 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/DexArchiveAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/DexArchiveAspect.java
@@ -146,7 +146,7 @@ public final class DexArchiveAspect extends NativeAspectClass implements Configu
attr(":dex_archive_android_sdk", LABEL)
.allowedRuleClasses("android_sdk", "filegroup")
.value(
- new AndroidRuleClasses.AndroidSdkLabel(
+ AndroidRuleClasses.getAndroidSdkLabel(
Label.parseAbsoluteUnchecked(
toolsRepository + AndroidRuleClasses.DEFAULT_SDK))))
.requiresConfigurationFragments(AndroidConfiguration.class)
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 a380f52713..0cc09b83ea 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
@@ -22,12 +22,9 @@ import com.google.common.collect.ImmutableMap;
import com.google.devtools.build.lib.analysis.RuleContext;
import com.google.devtools.build.lib.analysis.RuleDefinition;
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.concurrent.ThreadSafety.Immutable;
-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.Attribute.LateBoundDefault;
import com.google.devtools.build.lib.packages.RuleClass;
import com.google.devtools.build.lib.packages.RuleClass.Builder;
import com.google.devtools.build.lib.packages.RuleClass.Builder.RuleClassType;
@@ -151,20 +148,13 @@ public class AppleToolchain {
return sdkDir() + relativePath;
}
- /**
- * The default label of the build-wide {@code xcode_config} configuration rule.
- */
- @Immutable
- public static final class XcodeConfigLabel extends LateBoundLabel<BuildConfiguration> {
- public XcodeConfigLabel(String toolsRepository) {
- super(toolsRepository + AppleCommandLineOptions.DEFAULT_XCODE_VERSION_CONFIG_LABEL,
- AppleConfiguration.class);
- }
-
- @Override
- public Label resolve(Rule rule, AttributeMap attributes, BuildConfiguration configuration) {
- return configuration.getFragment(AppleConfiguration.class).getXcodeConfigLabel();
- }
+ /** The default label of the build-wide {@code xcode_config} configuration rule. */
+ public static LateBoundDefault<?, Label> getXcodeConfigLabel(String toolsRepository) {
+ return LateBoundDefault.fromTargetConfiguration(
+ AppleConfiguration.class,
+ Label.parseAbsoluteUnchecked(
+ toolsRepository + AppleCommandLineOptions.DEFAULT_XCODE_VERSION_CONFIG_LABEL),
+ (rule, attributes, appleConfig) -> appleConfig.getXcodeConfigLabel());
}
/**
@@ -180,11 +170,12 @@ public class AppleToolchain {
@Override
public RuleClass build(Builder builder, RuleDefinitionEnvironment env) {
return builder
- .add(attr(XcodeConfigRule.XCODE_CONFIG_ATTR_NAME, LABEL)
- .allowedRuleClasses("xcode_config")
- .checkConstraints()
- .direct_compile_time_input()
- .value(new XcodeConfigLabel(toolsRepository)))
+ .add(
+ attr(XcodeConfigRule.XCODE_CONFIG_ATTR_NAME, LABEL)
+ .allowedRuleClasses("xcode_config")
+ .checkConstraints()
+ .direct_compile_time_input()
+ .value(getXcodeConfigLabel(toolsRepository)))
.build();
}
@Override
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java
index 0bd4093864..11781594b5 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java
@@ -70,7 +70,7 @@ public class CcToolchain implements RuleConfiguredTargetFactory {
public static final String CC_TOOLCHAIN_DEFAULT_ATTRIBUTE_NAME = ":cc_toolchain";
/** Default attribute name for the c++ toolchain type */
- public static final String CC_TOOLCHAIN_TYPE_ATTRIBUTE_NAME = ":cc_toolchain_type";
+ public static final String CC_TOOLCHAIN_TYPE_ATTRIBUTE_NAME = "$cc_toolchain_type";
/**
* This file (found under the sysroot) may be unconditionally included in every C/C++ compilation.
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 23cc7fc326..6672ca93bd 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
@@ -25,10 +25,8 @@ import com.google.devtools.build.lib.analysis.BaseRuleClasses;
import com.google.devtools.build.lib.analysis.MakeVariableInfo;
import com.google.devtools.build.lib.analysis.RuleDefinition;
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.Attribute.LateBoundDefault;
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;
@@ -66,13 +64,11 @@ public final class CcToolchainRule implements RuleDefinition {
return ruleClass.endsWith("cc_toolchain");
}
- private static final LateBoundLabel<BuildConfiguration> LIBC_TOP =
- new LateBoundLabel<BuildConfiguration>(CppConfiguration.class) {
- @Override
- public Label resolve(Rule rule, AttributeMap attributes, BuildConfiguration configuration) {
- return configuration.getFragment(CppConfiguration.class).getSysrootLabel();
- }
- };
+ private static final LateBoundDefault<?, Label> LIBC_TOP =
+ LateBoundDefault.fromTargetConfiguration(
+ CppConfiguration.class,
+ null,
+ (rule, attributes, cppConfig) -> cppConfig.getSysrootLabel());
@Override
public RuleClass build(Builder builder, RuleDefinitionEnvironment env) {
@@ -117,19 +113,11 @@ public final class CcToolchainRule implements RuleDefinition {
.cfg(HOST)
.singleArtifact()
.value(
- new LateBoundLabel<BuildConfiguration>() {
- @Override
- public Label resolve(
- Rule rule, AttributeMap attributes, BuildConfiguration configuration) {
- CppConfiguration cppConfiguration =
- configuration.getFragment(CppConfiguration.class);
- if (cppConfiguration.isLLVMOptimizedFdo()) {
- return zipper;
- } else {
- return null;
- }
- }
- }))
+ LateBoundDefault.fromTargetConfiguration(
+ CppConfiguration.class,
+ null,
+ (rule, attributes, cppConfig) ->
+ cppConfig.isLLVMOptimizedFdo() ? zipper : null)))
.add(attr(":libc_top", LABEL).value(LIBC_TOP))
.add(
attr(":lipo_context_collector", LABEL)
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppRuleClasses.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppRuleClasses.java
index 953044781b..a4ad59ec05 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppRuleClasses.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppRuleClasses.java
@@ -33,16 +33,13 @@ import static com.google.devtools.build.lib.rules.cpp.CppFileTypes.VERSIONED_SHA
import com.google.common.collect.ImmutableMap;
import com.google.devtools.build.lib.analysis.LanguageDependentFragment.LibraryLanguage;
import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
import com.google.devtools.build.lib.analysis.config.PatchTransition;
import com.google.devtools.build.lib.analysis.test.InstrumentedFilesCollector.InstrumentationSpec;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.packages.Attribute;
-import com.google.devtools.build.lib.packages.Attribute.LateBoundLabel;
+import com.google.devtools.build.lib.packages.Attribute.LateBoundDefault;
import com.google.devtools.build.lib.packages.Attribute.Transition;
-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.packages.RuleTransitionFactory;
import com.google.devtools.build.lib.rules.cpp.transitions.DisableLipoTransition;
import com.google.devtools.build.lib.rules.cpp.transitions.EnableLipoTransition;
@@ -55,17 +52,16 @@ import com.google.devtools.build.lib.util.OsUtils;
public class CppRuleClasses {
/**
* Implementation for the :lipo_context_collector attribute.
+ *
+ * <p>This attribute connects a target to the LIPO context target configured with the lipo input
+ * collector configuration.
*/
- public static final LateBoundLabel<BuildConfiguration> LIPO_CONTEXT_COLLECTOR =
- new LateBoundLabel<BuildConfiguration>() {
- @Override
- public Label resolve(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);
- return cppConfiguration.isLipoOptimization() ? cppConfiguration.getLipoContextLabel() : null;
- }
- };
+ public static final LateBoundDefault<?, Label> LIPO_CONTEXT_COLLECTOR =
+ LateBoundDefault.fromTargetConfiguration(
+ CppConfiguration.class,
+ null,
+ (rule, attributes, cppConfig) ->
+ cppConfig.isLipoOptimization() ? cppConfig.getLipoContextLabel() : null);
/**
* Declares the implementations for C++ transition enums.
@@ -91,34 +87,20 @@ public class CppRuleClasses {
*/
public static final String CROSSTOOL_LABEL = "//tools/cpp:toolchain";
- public static final LateBoundLabel<BuildConfiguration> DEFAULT_MALLOC =
- new LateBoundLabel<BuildConfiguration>() {
- @Override
- public Label resolve(Rule rule, AttributeMap attributes, BuildConfiguration configuration) {
- return configuration.getFragment(CppConfiguration.class).customMalloc();
- }
- };
+ public static final LateBoundDefault<?, Label> DEFAULT_MALLOC =
+ LateBoundDefault.fromTargetConfiguration(
+ CppConfiguration.class, null, (rule, attributes, cppConfig) -> cppConfig.customMalloc());
- public static LateBoundLabel<BuildConfiguration> ccToolchainAttribute(
+ public static LateBoundDefault<CppConfiguration, Label> ccToolchainAttribute(
RuleDefinitionEnvironment env) {
- return new LateBoundLabel<BuildConfiguration>(
- env.getToolsLabel(CROSSTOOL_LABEL), CppConfiguration.class) {
- @Override
- public Label resolve(Rule rule, AttributeMap attributes, BuildConfiguration configuration) {
- return configuration.getFragment(CppConfiguration.class).getCcToolchainRuleLabel();
- }
- };
+ return LateBoundDefault.fromTargetConfiguration(
+ CppConfiguration.class,
+ env.getToolsLabel(CROSSTOOL_LABEL),
+ (rules, attributes, cppConfig) -> cppConfig.getCcToolchainRuleLabel());
}
- public static LateBoundLabel<BuildConfiguration> ccToolchainTypeAttribute(
- RuleDefinitionEnvironment env) {
- return new LateBoundLabel<BuildConfiguration>(
- env.getToolsLabel(CppHelper.TOOLCHAIN_TYPE_LABEL), CppConfiguration.class) {
- @Override
- public Label resolve(Rule rule, AttributeMap attributes, BuildConfiguration configuration) {
- return CppHelper.getCcToolchainType(env.getToolsRepository());
- }
- };
+ public static Label ccToolchainTypeAttribute(RuleDefinitionEnvironment env) {
+ return env.getToolsLabel(CppHelper.TOOLCHAIN_TYPE_LABEL);
}
// Artifacts of these types are discarded from the 'hdrs' attribute in cc rules
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/proto/CcProtoAspect.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/proto/CcProtoAspect.java
index dd73adffd1..35538cc8c0 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/proto/CcProtoAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/proto/CcProtoAspect.java
@@ -31,16 +31,13 @@ import com.google.devtools.build.lib.analysis.RuleContext;
import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
import com.google.devtools.build.lib.analysis.TransitiveInfoProviderMap;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.packages.AspectDefinition;
import com.google.devtools.build.lib.packages.AspectParameters;
import com.google.devtools.build.lib.packages.Attribute;
-import com.google.devtools.build.lib.packages.AttributeMap;
import com.google.devtools.build.lib.packages.NativeAspectClass;
-import com.google.devtools.build.lib.packages.Rule;
import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException;
import com.google.devtools.build.lib.rules.cpp.CcCommon;
import com.google.devtools.build.lib.rules.cpp.CcLibraryHelper;
@@ -71,21 +68,17 @@ public class CcProtoAspect extends NativeAspectClass implements ConfiguredAspect
private static final String PROTO_TOOLCHAIN_ATTR = ":aspect_cc_proto_toolchain";
- private static final Attribute.LateBoundLabel<BuildConfiguration> PROTO_TOOLCHAIN_LABEL =
- new Attribute.LateBoundLabel<BuildConfiguration>(
- "@com_google_protobuf_cc//:cc_toolchain", ProtoConfiguration.class) {
- @Override
- public Label resolve(Rule rule, AttributeMap attributes, BuildConfiguration configuration) {
- return configuration.getFragment(ProtoConfiguration.class).protoToolchainForCc();
- }
- };
+ private static final Attribute.LateBoundDefault<?, Label> PROTO_TOOLCHAIN_LABEL =
+ Attribute.LateBoundDefault.fromTargetConfiguration(
+ ProtoConfiguration.class,
+ Label.parseAbsoluteUnchecked("@com_google_protobuf_cc//:cc_toolchain"),
+ (rule, attributes, protoConfig) -> protoConfig.protoToolchainForCc());
private final CppSemantics cppSemantics;
- private final Attribute.LateBoundLabel<BuildConfiguration> ccToolchainAttrValue;
+ private final Attribute.LateBoundDefault<?, Label> ccToolchainAttrValue;
public CcProtoAspect(
- CppSemantics cppSemantics,
- Attribute.LateBoundLabel<BuildConfiguration> ccToolchainAttrValue) {
+ CppSemantics cppSemantics, Attribute.LateBoundDefault<?, Label> ccToolchainAttrValue) {
this.cppSemantics = cppSemantics;
this.ccToolchainAttrValue = ccToolchainAttrValue;
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/genrule/GenRuleBaseRule.java b/src/main/java/com/google/devtools/build/lib/rules/genrule/GenRuleBaseRule.java
index 67e5a6f8b7..1bd75edd74 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/genrule/GenRuleBaseRule.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/genrule/GenRuleBaseRule.java
@@ -25,13 +25,12 @@ import com.google.devtools.build.lib.analysis.BaseRuleClasses;
import com.google.devtools.build.lib.analysis.MakeVariableInfo;
import com.google.devtools.build.lib.analysis.RuleDefinition;
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;
-import com.google.devtools.build.lib.packages.Attribute.LateBoundLabel;
+import com.google.devtools.build.lib.packages.Attribute.ComputedDefault;
+import com.google.devtools.build.lib.packages.Attribute.LateBoundDefault;
import com.google.devtools.build.lib.packages.AttributeMap;
import com.google.devtools.build.lib.packages.BuildType;
-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.RuleClassType;
import com.google.devtools.build.lib.rules.cpp.CppConfiguration;
@@ -50,29 +49,25 @@ public class GenRuleBaseRule implements RuleDefinition {
* Late-bound dependency on the C++ toolchain <i>iff</i> the genrule has make variables that need
* that toolchain.
*/
- public static Attribute.LateBoundLabel<BuildConfiguration> ccToolchainAttribute(
- RuleDefinitionEnvironment env) {
- return new LateBoundLabel<BuildConfiguration>(
- env.getToolsLabel(CppRuleClasses.CROSSTOOL_LABEL), CppConfiguration.class) {
- @Override
- public Label resolve(Rule rule, AttributeMap attributes, BuildConfiguration configuration) {
- return attributes != null
- && GenRuleBase.requiresCrosstool(attributes.get("cmd", Type.STRING))
- ? CppRuleClasses.ccToolchainAttribute(env).resolve(rule, attributes, configuration)
- : null;
- }
- };
+ public static LateBoundDefault<?, Label> ccToolchainAttribute(RuleDefinitionEnvironment env) {
+ return LateBoundDefault.fromTargetConfiguration(
+ CppConfiguration.class,
+ env.getToolsLabel(CppRuleClasses.CROSSTOOL_LABEL),
+ // null guards are needed for LateBoundAttributeTest
+ (rule, attributes, cppConfig) ->
+ attributes != null
+ && attributes.get("cmd", Type.STRING) != null
+ && GenRuleBase.requiresCrosstool(attributes.get("cmd", Type.STRING))
+ ? CppRuleClasses.ccToolchainAttribute(env).resolve(rule, attributes, cppConfig)
+ : null);
}
- /** Late-bound dependency on the C++ toolchain type. */
- public static Attribute.LateBoundLabel<BuildConfiguration> ccToolchainTypeAttribute(
- RuleDefinitionEnvironment env) {
- return new LateBoundLabel<BuildConfiguration>(
- env.getToolsLabel(CppHelper.TOOLCHAIN_TYPE_LABEL), CppConfiguration.class) {
+ /** Computed dependency on the C++ toolchain type. */
+ public static ComputedDefault ccToolchainTypeAttribute(RuleDefinitionEnvironment env) {
+ return new ComputedDefault("cmd") {
@Override
- public Label resolve(Rule rule, AttributeMap attributes, BuildConfiguration configuration) {
- return attributes != null
- && GenRuleBase.requiresCrosstool(attributes.get("cmd", Type.STRING))
+ public Object getDefault(AttributeMap rule) {
+ return GenRuleBase.requiresCrosstool(rule.get("cmd", Type.STRING))
? CppHelper.getCcToolchainType(env.getToolsRepository())
: null;
}
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 f83d0fe82e..ca43c7e92e 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
@@ -35,11 +35,8 @@ import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
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.Attribute.LateBoundDefault;
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;
import com.google.devtools.build.lib.rules.java.JavaCompilationArgs.ClasspathType;
import com.google.devtools.build.lib.rules.java.JavaConfiguration.JavaOptimizationMode;
@@ -112,14 +109,11 @@ public interface JavaSemantics {
/** The java_toolchain.compatible_javacopts key for proto compilations. */
public static final String PROTO_JAVACOPTS_KEY = "proto";
- LateBoundLabel<BuildConfiguration> JAVA_TOOLCHAIN =
- new LateBoundLabel<BuildConfiguration>(JAVA_TOOLCHAIN_LABEL, JavaConfiguration.class) {
- @Override
- public Label resolve(Rule rule, AttributeMap attributes,
- BuildConfiguration configuration) {
- return configuration.getFragment(JavaConfiguration.class).getToolchainLabel();
- }
- };
+ LateBoundDefault<?, Label> JAVA_TOOLCHAIN =
+ LateBoundDefault.fromTargetConfiguration(
+ JavaConfiguration.class,
+ Label.parseAbsoluteUnchecked(JAVA_TOOLCHAIN_LABEL),
+ (rule, attributes, javaConfig) -> javaConfig.getToolchainLabel());
/**
* Name of the output group used for source jars.
@@ -135,111 +129,86 @@ public interface JavaSemantics {
OutputGroupProvider.HIDDEN_OUTPUT_GROUP_PREFIX + "gen_jars";
/** Implementation for the :jvm attribute. */
- static LateBoundLabel<BuildConfiguration> jvmAttribute(RuleDefinitionEnvironment env) {
- return new LateBoundLabel<BuildConfiguration>(
- env.getToolsLabel(JavaImplicitAttributes.JDK_LABEL), Jvm.class) {
- @Override
- public Label resolve(Rule rule, AttributeMap attributes, BuildConfiguration configuration) {
- return configuration.getFragment(Jvm.class).getJvmLabel();
- }
- };
+ static LateBoundDefault<?, Label> jvmAttribute(RuleDefinitionEnvironment env) {
+ return LateBoundDefault.fromTargetConfiguration(
+ Jvm.class,
+ env.getToolsLabel(JavaImplicitAttributes.JDK_LABEL),
+ (rule, attributes, jvm) -> jvm.getJvmLabel());
}
/** Implementation for the :host_jdk attribute. */
- static LateBoundLabel<BuildConfiguration> hostJdkAttribute(RuleDefinitionEnvironment env) {
- return new LateBoundLabel<BuildConfiguration>(
- env.getToolsLabel(JavaImplicitAttributes.JDK_LABEL), Jvm.class) {
- @Override
- public boolean useHostConfiguration() {
- return true;
- }
-
- @Override
- public Label resolve(Rule rule, AttributeMap attributes, BuildConfiguration configuration) {
- return configuration.getFragment(Jvm.class).getJvmLabel();
- }
- };
+ static LateBoundDefault<?, Label> hostJdkAttribute(RuleDefinitionEnvironment env) {
+ return LateBoundDefault.fromHostConfiguration(
+ Jvm.class,
+ env.getToolsLabel(JavaImplicitAttributes.JDK_LABEL),
+ (rule, attributes, jvm) -> jvm.getJvmLabel());
}
/**
* Implementation for the :java_launcher attribute. Note that the Java launcher is disabled by
* default, so it returns null for the configuration-independent default value.
*/
- LateBoundLabel<BuildConfiguration> JAVA_LAUNCHER =
- new LateBoundLabel<BuildConfiguration>(JavaConfiguration.class) {
- @Override
- public Label resolve(Rule rule, AttributeMap attributes, BuildConfiguration configuration) {
- // This nullness check is purely for the sake of a test that doesn't bother to include an
- // attribute map when calling this method.
- if (attributes != null) {
- // Don't depend on the launcher if we don't create an executable anyway
- if (attributes.has("create_executable")
- && !attributes.get("create_executable", Type.BOOLEAN)) {
- return null;
+ LateBoundDefault<?, Label> JAVA_LAUNCHER =
+ LateBoundDefault.fromTargetConfiguration(
+ JavaConfiguration.class,
+ null,
+ (rule, attributes, javaConfig) -> {
+ // This nullness check is purely for the sake of a test that doesn't bother to include
+ // an
+ // attribute map when calling this method.
+ if (attributes != null) {
+ // Don't depend on the launcher if we don't create an executable anyway
+ if (attributes.has("create_executable")
+ && !attributes.get("create_executable", Type.BOOLEAN)) {
+ return null;
+ }
+
+ // don't read --java_launcher if this target overrides via a launcher attribute
+ if (attributes.isAttributeValueExplicitlySpecified("launcher")) {
+ return attributes.get("launcher", LABEL);
+ }
}
-
- // don't read --java_launcher if this target overrides via a launcher attribute
- if (attributes.isAttributeValueExplicitlySpecified("launcher")) {
- return attributes.get("launcher", LABEL);
+ return javaConfig.getJavaLauncherLabel();
+ });
+
+ // TODO(b/65746853): provide a way to do this without passing the entire configuration
+ LateBoundDefault<?, List<Label>> JAVA_PLUGINS =
+ LateBoundDefault.fromTargetConfiguration(
+ BuildConfiguration.class,
+ ImmutableList.of(),
+ (rule, attributes, configuration) -> ImmutableList.copyOf(configuration.getPlugins()));
+
+ /** Implementation for the :proguard attribute. */
+ LateBoundDefault<?, Label> PROGUARD =
+ LateBoundDefault.fromTargetConfiguration(
+ JavaConfiguration.class,
+ null,
+ (rule, attributes, javaConfig) -> javaConfig.getProguardBinary());
+
+ LateBoundDefault<?, List<Label>> EXTRA_PROGUARD_SPECS =
+ LateBoundDefault.fromTargetConfiguration(
+ JavaConfiguration.class,
+ ImmutableList.of(),
+ (rule, attributes, javaConfig) ->
+ ImmutableList.copyOf(javaConfig.getExtraProguardSpecs()));
+
+ LateBoundDefault<?, List<Label>> BYTECODE_OPTIMIZERS =
+ LateBoundDefault.fromTargetConfiguration(
+ JavaConfiguration.class,
+ ImmutableList.of(),
+ (rule, attributes, javaConfig) -> {
+ // Use a modicum of smarts to avoid implicit dependencies where we don't need them.
+ JavaOptimizationMode optMode = javaConfig.getJavaOptimizationMode();
+ boolean hasProguardSpecs =
+ attributes.has("proguard_specs")
+ && !attributes.get("proguard_specs", LABEL_LIST).isEmpty();
+ if (optMode == JavaOptimizationMode.NOOP
+ || (optMode == JavaOptimizationMode.LEGACY && !hasProguardSpecs)) {
+ return ImmutableList.<Label>of();
}
- }
- return configuration.getFragment(JavaConfiguration.class).getJavaLauncherLabel();
- }
- };
-
- LateBoundLabelList<BuildConfiguration> JAVA_PLUGINS =
- new LateBoundLabelList<BuildConfiguration>() {
- @Override
- public List<Label> resolve(Rule rule, AttributeMap attributes,
- BuildConfiguration configuration) {
- return ImmutableList.copyOf(configuration.getPlugins());
- }
- };
-
- /**
- * Implementation for the :proguard attribute.
- */
- LateBoundLabel<BuildConfiguration> PROGUARD =
- new LateBoundLabel<BuildConfiguration>(JavaConfiguration.class) {
- @Override
- public Label resolve(Rule rule, AttributeMap attributes,
- BuildConfiguration configuration) {
- return configuration.getFragment(JavaConfiguration.class).getProguardBinary();
- }
- };
-
- LateBoundLabelList<BuildConfiguration> EXTRA_PROGUARD_SPECS =
- new LateBoundLabelList<BuildConfiguration>() {
- @Override
- public List<Label> resolve(Rule rule, AttributeMap attributes,
- BuildConfiguration configuration) {
- return ImmutableList.copyOf(
- configuration.getFragment(JavaConfiguration.class).getExtraProguardSpecs());
- }
- };
-
- LateBoundLabelList<BuildConfiguration> BYTECODE_OPTIMIZERS =
- new LateBoundLabelList<BuildConfiguration>(JavaConfiguration.class) {
- @Override
- public List<Label> resolve(
- Rule rule, AttributeMap attributes, BuildConfiguration configuration) {
- // Use a modicum of smarts to avoid implicit dependencies where we don't need them.
- JavaOptimizationMode optMode =
- configuration.getFragment(JavaConfiguration.class).getJavaOptimizationMode();
- boolean hasProguardSpecs = attributes.has("proguard_specs")
- && !attributes.get("proguard_specs", LABEL_LIST).isEmpty();
- if (optMode == JavaOptimizationMode.NOOP
- || (optMode == JavaOptimizationMode.LEGACY && !hasProguardSpecs)) {
- return ImmutableList.<Label>of();
- }
- return ImmutableList.copyOf(
- Optional.presentInstances(
- configuration
- .getFragment(JavaConfiguration.class)
- .getBytecodeOptimizers()
- .values()));
- }
- };
+ return ImmutableList.copyOf(
+ Optional.presentInstances(javaConfig.getBytecodeOptimizers().values()));
+ });
String IJAR_LABEL = "//tools/defaults:ijar";
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoAspect.java b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoAspect.java
index fbf667e4d8..9b09be1b1a 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoAspect.java
@@ -35,7 +35,6 @@ import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
import com.google.devtools.build.lib.analysis.TransitiveInfoProviderMap;
import com.google.devtools.build.lib.analysis.TransitiveInfoProviderMapBuilder;
import com.google.devtools.build.lib.analysis.WrappingProvider;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration.StrictDepsMode;
import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget;
import com.google.devtools.build.lib.cmdline.Label;
@@ -45,10 +44,8 @@ import com.google.devtools.build.lib.collect.nestedset.Order;
import com.google.devtools.build.lib.packages.AspectDefinition;
import com.google.devtools.build.lib.packages.AspectParameters;
import com.google.devtools.build.lib.packages.Attribute;
-import com.google.devtools.build.lib.packages.Attribute.LateBoundLabel;
-import com.google.devtools.build.lib.packages.AttributeMap;
+import com.google.devtools.build.lib.packages.Attribute.LateBoundDefault;
import com.google.devtools.build.lib.packages.NativeAspectClass;
-import com.google.devtools.build.lib.packages.Rule;
import com.google.devtools.build.lib.rules.java.JavaCompilationArgsProvider;
import com.google.devtools.build.lib.rules.java.JavaCompilationArtifacts;
import com.google.devtools.build.lib.rules.java.JavaCompilationHelper;
@@ -72,28 +69,24 @@ public class JavaLiteProtoAspect extends NativeAspectClass implements Configured
public static final String PROTO_TOOLCHAIN_ATTR = ":aspect_proto_toolchain_for_javalite";
- public static Attribute.LateBoundLabel<BuildConfiguration> getProtoToolchainLabel(
- String defaultValue) {
- return new Attribute.LateBoundLabel<BuildConfiguration>(
- defaultValue, ProtoConfiguration.class) {
- @Override
- public Label resolve(Rule rule, AttributeMap attributes, BuildConfiguration configuration) {
- return configuration.getFragment(ProtoConfiguration.class).protoToolchainForJavaLite();
- }
- };
+ public static LateBoundDefault<?, Label> getProtoToolchainLabel(String defaultValue) {
+ return LateBoundDefault.fromTargetConfiguration(
+ ProtoConfiguration.class,
+ Label.parseAbsoluteUnchecked(defaultValue),
+ (rule, attributes, protoConfig) -> protoConfig.protoToolchainForJavaLite());
}
private final JavaSemantics javaSemantics;
@Nullable private final String jacocoLabel;
private final String defaultProtoToolchainLabel;
- private final LateBoundLabel<BuildConfiguration> hostJdkAttribute;
+ private final LateBoundDefault<?, Label> hostJdkAttribute;
public JavaLiteProtoAspect(
JavaSemantics javaSemantics,
@Nullable String jacocoLabel,
String defaultProtoToolchainLabel,
- LateBoundLabel<BuildConfiguration> hostJdkAttribute) {
+ LateBoundDefault<?, Label> hostJdkAttribute) {
this.javaSemantics = javaSemantics;
this.jacocoLabel = jacocoLabel;
this.defaultProtoToolchainLabel = defaultProtoToolchainLabel;
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoAspect.java b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoAspect.java
index ec843a00d8..91e4b3b734 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoAspect.java
@@ -34,7 +34,6 @@ import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
import com.google.devtools.build.lib.analysis.TransitiveInfoProviderMap;
import com.google.devtools.build.lib.analysis.TransitiveInfoProviderMapBuilder;
import com.google.devtools.build.lib.analysis.WrappingProvider;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration.StrictDepsMode;
import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget;
import com.google.devtools.build.lib.cmdline.Label;
@@ -44,10 +43,8 @@ import com.google.devtools.build.lib.collect.nestedset.Order;
import com.google.devtools.build.lib.packages.AspectDefinition;
import com.google.devtools.build.lib.packages.AspectParameters;
import com.google.devtools.build.lib.packages.Attribute;
-import com.google.devtools.build.lib.packages.Attribute.LateBoundLabel;
-import com.google.devtools.build.lib.packages.AttributeMap;
+import com.google.devtools.build.lib.packages.Attribute.LateBoundDefault;
import com.google.devtools.build.lib.packages.NativeAspectClass;
-import com.google.devtools.build.lib.packages.Rule;
import com.google.devtools.build.lib.rules.java.JavaCompilationArgsProvider;
import com.google.devtools.build.lib.rules.java.JavaCompilationHelper;
import com.google.devtools.build.lib.rules.java.JavaConfiguration;
@@ -71,17 +68,13 @@ import javax.annotation.Nullable;
public class JavaProtoAspect extends NativeAspectClass implements ConfiguredAspectFactory {
private static final String SPEED_PROTO_TOOLCHAIN_ATTR = ":aspect_java_proto_toolchain";
- private final LateBoundLabel<BuildConfiguration> hostJdkAttribute;
-
- private static Attribute.LateBoundLabel<BuildConfiguration> getSpeedProtoToolchainLabel(
- String defaultValue) {
- return new Attribute.LateBoundLabel<BuildConfiguration>(
- defaultValue, ProtoConfiguration.class) {
- @Override
- public Label resolve(Rule rule, AttributeMap attributes, BuildConfiguration configuration) {
- return configuration.getFragment(ProtoConfiguration.class).protoToolchainForJava();
- }
- };
+ private final LateBoundDefault<?, Label> hostJdkAttribute;
+
+ private static LateBoundDefault<?, Label> getSpeedProtoToolchainLabel(String defaultValue) {
+ return LateBoundDefault.fromTargetConfiguration(
+ ProtoConfiguration.class,
+ Label.parseAbsoluteUnchecked(defaultValue),
+ (rule, attributes, protoConfig) -> protoConfig.protoToolchainForJava());
}
private final JavaSemantics javaSemantics;
@@ -95,7 +88,7 @@ public class JavaProtoAspect extends NativeAspectClass implements ConfiguredAspe
@Nullable String jacocoLabel,
RpcSupport rpcSupport,
String defaultSpeedProtoToolchainLabel,
- LateBoundLabel<BuildConfiguration> hostJdkAttribute) {
+ LateBoundDefault<?, Label> hostJdkAttribute) {
this.javaSemantics = javaSemantics;
this.jacocoLabel = jacocoLabel;
this.rpcSupport = rpcSupport;
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 78aaba6988..d5d5851072 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
@@ -27,9 +27,8 @@ 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.ComputedDefault;
-import com.google.devtools.build.lib.packages.Attribute.LateBoundLabel;
+import com.google.devtools.build.lib.packages.Attribute.LateBoundDefault;
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.RuleClassType;
import com.google.devtools.build.lib.rules.apple.AppleConfiguration;
@@ -140,21 +139,16 @@ public class IosTestRule implements RuleDefinition {
attr(IosTest.OBJC_GCOV_ATTR, LABEL)
.cfg(HOST)
.value(env.getToolsLabel("//tools/objc:gcov")))
+ // TODO(b/65746853): provide a way to do this without passing the entire configuration
.add(
attr(IosTest.MCOV_TOOL_ATTR, LABEL)
.cfg(HOST)
.value(
- new LateBoundLabel<BuildConfiguration>(mcov) {
- @Override
- public Label resolve(
- Rule rule, AttributeMap attributes, BuildConfiguration configuration) {
- if (!configuration.isCodeCoverageEnabled()) {
- return null;
- }
-
- return mcov;
- }
- }))
+ LateBoundDefault.fromTargetConfiguration(
+ BuildConfiguration.class,
+ mcov,
+ (rule, attributes, configuration) ->
+ configuration.isCodeCoverageEnabled() ? mcov : null)))
.cfg(AppleCrosstoolTransition.APPLE_CROSSTOOL_TRANSITION)
.build();
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcAspect.java b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcAspect.java
index 016ec5c091..87c24ab678 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcAspect.java
@@ -37,18 +37,15 @@ import com.google.devtools.build.lib.analysis.actions.CustomCommandLine.VectorAr
import com.google.devtools.build.lib.analysis.actions.ParamFileInfo;
import com.google.devtools.build.lib.analysis.actions.ParameterFileWriteAction;
import com.google.devtools.build.lib.analysis.actions.SpawnAction;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget.Mode;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.packages.AspectDefinition;
import com.google.devtools.build.lib.packages.AspectParameters;
-import com.google.devtools.build.lib.packages.Attribute.LateBoundLabel;
-import com.google.devtools.build.lib.packages.AttributeMap;
+import com.google.devtools.build.lib.packages.Attribute.LateBoundDefault;
import com.google.devtools.build.lib.packages.BuildType;
import com.google.devtools.build.lib.packages.NativeAspectClass;
-import com.google.devtools.build.lib.packages.Rule;
import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException;
import com.google.devtools.build.lib.rules.apple.AppleConfiguration;
import com.google.devtools.build.lib.rules.apple.AppleToolchain;
@@ -105,13 +102,11 @@ public class J2ObjcAspect extends NativeAspectClass implements ConfiguredAspectF
protected static final ImmutableList<String> J2OBJC_PLUGIN_PARAMS =
ImmutableList.of("file_dir_mapping", "generate_class_mappings");
- private static final LateBoundLabel<BuildConfiguration> DEAD_CODE_REPORT =
- new LateBoundLabel<BuildConfiguration>(J2ObjcConfiguration.class) {
- @Override
- public Label resolve(Rule rule, AttributeMap attributes, BuildConfiguration configuration) {
- return configuration.getFragment(J2ObjcConfiguration.class).deadCodeReport().orNull();
- }
- };
+ private static final LateBoundDefault<?, Label> DEAD_CODE_REPORT =
+ LateBoundDefault.fromTargetConfiguration(
+ J2ObjcConfiguration.class,
+ null,
+ (rule, attributes, j2objcConfig) -> j2objcConfig.deadCodeReport().orNull());
/** Adds additional attribute aspects and attributes to the given AspectDefinition.Builder. */
protected AspectDefinition.Builder addAdditionalAttributes(AspectDefinition.Builder builder) {
@@ -182,14 +177,12 @@ public class J2ObjcAspect extends NativeAspectClass implements ConfiguredAspectF
.value(
Label.parseAbsoluteUnchecked(
toolsRepository + "//third_party/java/j2objc:jre_emul.jar")))
+ .add(attr(":dead_code_report", LABEL).cfg(HOST).value(DEAD_CODE_REPORT))
.add(
- attr(":dead_code_report", LABEL)
- .cfg(HOST)
- .value(DEAD_CODE_REPORT))
- .add(attr("$jre_lib", LABEL)
- .value(
- Label.parseAbsoluteUnchecked(
- toolsRepository + "//third_party/java/j2objc:jre_core_lib")))
+ attr("$jre_lib", LABEL)
+ .value(
+ Label.parseAbsoluteUnchecked(
+ toolsRepository + "//third_party/java/j2objc:jre_core_lib")))
.add(
attr("$protobuf_lib", LABEL)
.value(
@@ -210,7 +203,7 @@ public class J2ObjcAspect extends NativeAspectClass implements ConfiguredAspectF
.allowedRuleClasses("xcode_config")
.checkConstraints()
.direct_compile_time_input()
- .value(new AppleToolchain.XcodeConfigLabel(toolsRepository)))
+ .value(AppleToolchain.getXcodeConfigLabel(toolsRepository)))
.add(
attr("$zipper", LABEL)
.cfg(HOST)
@@ -224,8 +217,12 @@ public class J2ObjcAspect extends NativeAspectClass implements ConfiguredAspectF
toolsRepository + "//tools/j2objc:j2objc_proto_blacklist"))))
.add(attr(":j2objc_cc_toolchain", LABEL).value(ObjcRuleClasses.APPLE_TOOLCHAIN))
.add(
+ // Objc builds do not use a lipo context collector, but must specify the attribute as
+ // a late-bound attribute to match with the similar attribute on the cc rules.
+ // TODO(b/28084560): Allow :lipo_context_collector not to be set instead of having a
+ // null instance.
attr(":lipo_context_collector", LABEL)
- .value(ObjcRuleClasses.NULL_LIPO_CONTEXT_COLLECTOR)
+ .value(LateBoundDefault.alwaysNull())
.skipPrereqValidatorCheck())
.build();
}
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 2fee1f098f..56c7ae505b 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
@@ -41,11 +41,10 @@ import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.packages.Attribute;
-import com.google.devtools.build.lib.packages.Attribute.LateBoundLabel;
+import com.google.devtools.build.lib.packages.Attribute.LateBoundDefault;
import com.google.devtools.build.lib.packages.AttributeMap;
import com.google.devtools.build.lib.packages.BuildType;
import com.google.devtools.build.lib.packages.ImplicitOutputsFunction.SafeImplicitOutputsFunction;
-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;
import com.google.devtools.build.lib.packages.RuleClass.Builder.RuleClassType;
@@ -160,30 +159,13 @@ public class ObjcRuleClasses {
/**
* Late-bound attribute giving the CcToolchain for CROSSTOOL_LABEL.
*
- * TODO(cpeyser): Use AppleCcToolchain instead of CcToolchain once released.
+ * <p>TODO(cpeyser): Use AppleCcToolchain instead of CcToolchain once released.
*/
- public static final LateBoundLabel<BuildConfiguration> APPLE_TOOLCHAIN =
- new LateBoundLabel<BuildConfiguration>(CROSSTOOL_LABEL, CppConfiguration.class) {
- @Override
- public Label resolve(
- Rule rule, AttributeMap attributes, BuildConfiguration configuration) {
- return configuration.getFragment(CppConfiguration.class).getCcToolchainRuleLabel();
- }
- };
-
- /**
- * A null value for the lipo context collector. Objc builds do not use a lipo context collector.
- */
- // TODO(b/28084560): Allow :lipo_context_collector not to be set instead of having a null
- // instance.
- public static final LateBoundLabel<BuildConfiguration> NULL_LIPO_CONTEXT_COLLECTOR =
- new LateBoundLabel<BuildConfiguration>() {
- @Override
- public Label resolve(
- Rule rule, AttributeMap attributes, BuildConfiguration configuration) {
- return null;
- }
- };
+ public static final LateBoundDefault<?, Label> APPLE_TOOLCHAIN =
+ LateBoundDefault.fromTargetConfiguration(
+ CppConfiguration.class,
+ Label.parseAbsoluteUnchecked(CROSSTOOL_LABEL),
+ (rule, attributes, cppConfig) -> cppConfig.getCcToolchainRuleLabel());
/**
* Creates a new spawn action builder with apple environment variables set that are typically
@@ -543,8 +525,12 @@ public class ObjcRuleClasses {
attr(CcToolchain.CC_TOOLCHAIN_TYPE_ATTRIBUTE_NAME, LABEL)
.value(CppRuleClasses.ccToolchainTypeAttribute(env)))
.add(
+ // Objc builds do not use a lipo context collector, but must specify the attribute as
+ // a late-bound attribute to match with the similar attribute on the cc rules.
+ // TODO(b/28084560): Allow :lipo_context_collector not to be set instead of having a
+ // null instance.
attr(":lipo_context_collector", LABEL)
- .value(NULL_LIPO_CONTEXT_COLLECTOR)
+ .value(LateBoundDefault.alwaysNull())
.skipPrereqValidatorCheck())
.build();
}
@@ -677,7 +663,7 @@ public class ObjcRuleClasses {
.direct_compile_time_input()
.allowedRuleClasses(ALLOWED_CC_DEPS_RULE_CLASSES)
.mandatoryProviders(ObjcProvider.SKYLARK_CONSTRUCTOR.id())
- .allowedFileTypes())
+ .allowedFileTypes())
/* <!-- #BLAZE_RULE($objc_compiling_rule).ATTRIBUTE(runtime_deps) -->
The list of framework targets that are late loaded at runtime. They are included in the
app bundle but not linked against at build time.
@@ -721,9 +707,7 @@ public class ObjcRuleClasses {
If specified, Bazel will not generate a module map for this target, but will pass the
provided module map to the compiler.
<!-- #END_BLAZE_RULE.ATTRIBUTE -->*/
- .add(
- attr("module_map", LABEL)
- .allowedFileTypes(FileType.of(".modulemap")))
+ .add(attr("module_map", LABEL).allowedFileTypes(FileType.of(".modulemap")))
/* Provides the label for header_scanner tool that is used to scan inclusions for ObjC
sources and provide a list of required headers via a .header_list file.
@@ -735,33 +719,21 @@ public class ObjcRuleClasses {
attr(HEADER_SCANNER_ATTRIBUTE, LABEL)
.cfg(HOST)
.value(
- new LateBoundLabel<BuildConfiguration>(
+ LateBoundDefault.fromTargetConfiguration(
+ ObjcConfiguration.class,
env.getToolsLabel("//tools/objc:header_scanner"),
- ObjcConfiguration.class) {
- @Override
- public Label resolve(
- Rule rule, AttributeMap attributes, BuildConfiguration configuration) {
- return configuration
- .getFragment(ObjcConfiguration.class)
- .getObjcHeaderScannerTool();
- }
- }))
+ (rule, attributes, objcConfig) -> objcConfig.getObjcHeaderScannerTool())))
.add(
attr(APPLE_SDK_ATTRIBUTE, LABEL)
.value(
- new LateBoundLabel<BuildConfiguration>(ObjcConfiguration.class) {
- @Override
- public Label resolve(
- Rule rule, AttributeMap attributes, BuildConfiguration configuration) {
- ObjcConfiguration objcConfiguration =
- configuration.getFragment(ObjcConfiguration.class);
+ LateBoundDefault.fromTargetConfiguration(
+ ObjcConfiguration.class,
+ null,
// Apple SDKs are currently only used by ObjC header thinning feature
- if (objcConfiguration.useExperimentalHeaderThinning()) {
- return objcConfiguration.getAppleSdk();
- }
- return null;
- }
- }))
+ (rule, attributes, objcConfig) ->
+ objcConfig.useExperimentalHeaderThinning()
+ ? objcConfig.getAppleSdk()
+ : null)))
.build();
}
@Override
@@ -1191,15 +1163,10 @@ public class ObjcRuleClasses {
.singleArtifact()
.cfg(HOST)
.value(
- new LateBoundLabel<BuildConfiguration>(ObjcConfiguration.class) {
- @Override
- public Label resolve(
- Rule rule, AttributeMap attributes, BuildConfiguration configuration) {
- return configuration
- .getFragment(ObjcConfiguration.class)
- .getExtraEntitlements();
- }
- })
+ LateBoundDefault.fromTargetConfiguration(
+ ObjcConfiguration.class,
+ null,
+ (rule, attributes, objcConfig) -> objcConfig.getExtraEntitlements()))
.allowedFileTypes(ENTITLEMENTS_TYPE))
.add(
attr(DEBUG_ENTITLEMENTS_ATTR, LABEL)
@@ -1222,22 +1189,20 @@ public class ObjcRuleClasses {
.singleArtifact()
.allowedFileTypes(FileType.of(".mobileprovision"))
.value(
- new LateBoundLabel<BuildConfiguration>(ObjcConfiguration.class) {
- @Override
- public Label resolve(
- Rule rule, AttributeMap attributes, BuildConfiguration configuration) {
- AppleConfiguration appleConfiguration =
- configuration.getFragment(AppleConfiguration.class);
- if (appleConfiguration.getMultiArchPlatform(PlatformType.IOS)
- != ApplePlatform.IOS_DEVICE) {
- return null;
- }
- if (rule.isAttributeValueExplicitlySpecified(PROVISIONING_PROFILE_ATTR)) {
- return null;
- }
- return appleConfiguration.getDefaultProvisioningProfileLabel();
- }
- }))
+ LateBoundDefault.fromTargetConfiguration(
+ AppleConfiguration.class,
+ null,
+ (rule, attributes, appleConfig) -> {
+ if (appleConfig.getMultiArchPlatform(PlatformType.IOS)
+ != ApplePlatform.IOS_DEVICE) {
+ return null;
+ }
+ if (attributes.isAttributeValueExplicitlySpecified(
+ PROVISIONING_PROFILE_ATTR)) {
+ return null;
+ }
+ return appleConfig.getDefaultProvisioningProfileLabel();
+ })))
/* <!-- #BLAZE_RULE($objc_release_bundling_rule).ATTRIBUTE(app_icon) -->
The name of the application icon.
@@ -1507,23 +1472,20 @@ public class ObjcRuleClasses {
.singleArtifact()
.allowedFileTypes(FileType.of(".mobileprovision"))
.value(
- new LateBoundLabel<BuildConfiguration>(ObjcConfiguration.class) {
- @Override
- public Label resolve(
- Rule rule, AttributeMap attributes, BuildConfiguration configuration) {
- AppleConfiguration appleConfiguration =
- configuration.getFragment(AppleConfiguration.class);
- if (appleConfiguration.getMultiArchPlatform(PlatformType.IOS)
- != ApplePlatform.IOS_DEVICE) {
- return null;
- }
- if (rule.isAttributeValueExplicitlySpecified(
- WATCH_EXT_PROVISIONING_PROFILE_ATTR)) {
- return null;
- }
- return appleConfiguration.getDefaultProvisioningProfileLabel();
- }
- }))
+ LateBoundDefault.fromTargetConfiguration(
+ AppleConfiguration.class,
+ null,
+ (rule, attributes, appleConfig) -> {
+ if (appleConfig.getMultiArchPlatform(PlatformType.IOS)
+ != ApplePlatform.IOS_DEVICE) {
+ return null;
+ }
+ if (attributes.isAttributeValueExplicitlySpecified(
+ WATCH_EXT_PROVISIONING_PROFILE_ATTR)) {
+ return null;
+ }
+ return appleConfig.getDefaultProvisioningProfileLabel();
+ })))
/* <!-- #BLAZE_RULE($watch_extension_bundle_rule).ATTRIBUTE(ext_resources) -->
Files to include in the final watch extension bundle.
@@ -1696,23 +1658,20 @@ public class ObjcRuleClasses {
.singleArtifact()
.allowedFileTypes(FileType.of(".mobileprovision"))
.value(
- new LateBoundLabel<BuildConfiguration>(ObjcConfiguration.class) {
- @Override
- public Label resolve(
- Rule rule, AttributeMap attributes, BuildConfiguration configuration) {
- AppleConfiguration appleConfiguration =
- configuration.getFragment(AppleConfiguration.class);
- if (appleConfiguration.getMultiArchPlatform(PlatformType.IOS)
- != ApplePlatform.IOS_DEVICE) {
- return null;
- }
- if (rule.isAttributeValueExplicitlySpecified(
- WATCH_APP_PROVISIONING_PROFILE_ATTR)) {
- return null;
- }
- return appleConfiguration.getDefaultProvisioningProfileLabel();
- }
- }))
+ LateBoundDefault.fromTargetConfiguration(
+ AppleConfiguration.class,
+ null,
+ (rule, attributes, appleConfig) -> {
+ if (appleConfig.getMultiArchPlatform(PlatformType.IOS)
+ != ApplePlatform.IOS_DEVICE) {
+ return null;
+ }
+ if (attributes.isAttributeValueExplicitlySpecified(
+ WATCH_APP_PROVISIONING_PROFILE_ATTR)) {
+ return null;
+ }
+ return appleConfig.getDefaultProvisioningProfileLabel();
+ })))
/* <!-- #BLAZE_RULE($objc_resources_rule).ATTRIBUTE(app_storyboards) -->
Files which are .storyboard resources for the watch application, possibly
localizable.
diff --git a/src/main/java/com/google/devtools/build/lib/rules/proto/BazelProtoLibraryRule.java b/src/main/java/com/google/devtools/build/lib/rules/proto/BazelProtoLibraryRule.java
index 168f82f415..e7891c4eb2 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/proto/BazelProtoLibraryRule.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/proto/BazelProtoLibraryRule.java
@@ -22,11 +22,8 @@ import static com.google.devtools.build.lib.packages.BuildType.LABEL_LIST;
import com.google.devtools.build.lib.analysis.BaseRuleClasses;
import com.google.devtools.build.lib.analysis.RuleDefinition;
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;
-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;
import com.google.devtools.build.lib.util.FileType;
@@ -36,15 +33,16 @@ import com.google.devtools.build.lib.util.FileType;
*/
public final class BazelProtoLibraryRule implements RuleDefinition {
- private static final Attribute.LateBoundLabel<BuildConfiguration> PROTO_COMPILER =
- new Attribute.LateBoundLabel<BuildConfiguration>(
- "@com_google_protobuf//:protoc", ProtoConfiguration.class) {
- @Override
- public Label resolve(Rule rule, AttributeMap attributes, BuildConfiguration configuration) {
- Label label = configuration.getFragment(ProtoConfiguration.class).protoCompiler();
- return label != null ? label : getDefault();
- }
- };
+ private static final Label DEFAULT_PROTO_COMPILER =
+ Label.parseAbsoluteUnchecked("@com_google_protobuf//:protoc");
+ private static final Attribute.LateBoundDefault<?, Label> PROTO_COMPILER =
+ Attribute.LateBoundDefault.fromTargetConfiguration(
+ ProtoConfiguration.class,
+ DEFAULT_PROTO_COMPILER,
+ (rule, attributes, protoConfig) ->
+ protoConfig.protoCompiler() != null
+ ? protoConfig.protoCompiler()
+ : DEFAULT_PROTO_COMPILER);
@Override
public RuleClass build(Builder builder, final RuleDefinitionEnvironment env) {