Introduce remotable attribute to repository_rule
repository_rule gets a new attribute remotable=(True|False). Targets
of repository_rule get a new magic (always there) attribute
exec_properties.
The new attributes are guarded behind --experimental_repo_remote_exec.
This change is in preparation for adding remote execution capabilities
to repository_context.execute().
RELNOTES: None
PiperOrigin-RevId: 281275185
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 451c3bd..d13b0f8 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
@@ -23,6 +23,7 @@
import static com.google.devtools.build.lib.packages.Type.BOOLEAN;
import static com.google.devtools.build.lib.packages.Type.INTEGER;
import static com.google.devtools.build.lib.packages.Type.STRING;
+import static com.google.devtools.build.lib.packages.Type.STRING_DICT;
import static com.google.devtools.build.lib.packages.Type.STRING_LIST;
import com.google.common.annotations.VisibleForTesting;
@@ -45,6 +46,7 @@
import com.google.devtools.build.lib.packages.RuleClass.Builder.RuleClassType;
import com.google.devtools.build.lib.packages.TestSize;
import com.google.devtools.build.lib.packages.Type;
+import com.google.devtools.build.lib.packages.Type.ConversionException;
import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
import com.google.devtools.build.lib.util.FileTypeSet;
@@ -336,6 +338,12 @@
return builder.add(attr("name", STRING).nonconfigurable("Rule name"));
}
+ public static RuleClass.Builder execPropertiesAttribute(RuleClass.Builder builder)
+ throws ConversionException {
+ return builder.add(
+ attr(RuleClass.EXEC_PROPERTIES, STRING_DICT).defaultValue(ImmutableMap.of()));
+ }
+
/**
* Ancestor of every rule.
*
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryFunction.java
index 101e929..1464272 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryFunction.java
@@ -147,6 +147,12 @@
timeoutScaling,
markerData);
+ if (starlarkSemantics.experimentalRepoRemoteExec()) {
+ // If a rule is declared remotable then invalidate it if remote execution gets
+ // enabled or disabled.
+ PrecomputedValue.REMOTE_EXECUTION_ENABLED.get(env);
+ }
+
// Since restarting a repository function can be really expensive, we first ensure that
// all label-arguments can be resolved to paths.
try {
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryModule.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryModule.java
index b81a2b0..2cac6b7 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryModule.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryModule.java
@@ -49,6 +49,7 @@
import com.google.devtools.build.lib.syntax.Sequence;
import com.google.devtools.build.lib.syntax.SkylarkUtils;
import com.google.devtools.build.lib.syntax.Starlark;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics;
import com.google.devtools.build.lib.syntax.StarlarkThread;
import java.util.Map;
@@ -65,16 +66,22 @@
Boolean local,
Sequence<?> environ, // <String> expected
Boolean configure,
+ Boolean remotable,
String doc,
FuncallExpression ast,
StarlarkThread funcallThread)
throws EvalException {
SkylarkUtils.checkLoadingOrWorkspacePhase(funcallThread, "repository_rule", ast.getLocation());
+ StarlarkSemantics semantics = funcallThread.getSemantics();
// We'll set the name later, pass the empty string for now.
RuleClass.Builder builder = new RuleClass.Builder("", RuleClassType.WORKSPACE, true);
builder.addOrOverrideAttribute(attr("$local", BOOLEAN).defaultValue(local).build());
builder.addOrOverrideAttribute(attr("$configure", BOOLEAN).defaultValue(configure).build());
+ if (semantics.experimentalRepoRemoteExec()) {
+ builder.addOrOverrideAttribute(attr("$remotable", BOOLEAN).defaultValue(remotable).build());
+ BaseRuleClasses.execPropertiesAttribute(builder);
+ }
builder.addOrOverrideAttribute(
attr("$environ", STRING_LIST).defaultValue(environ).build());
BaseRuleClasses.nameAttribute(builder);
diff --git a/src/main/java/com/google/devtools/build/lib/packages/StarlarkSemanticsOptions.java b/src/main/java/com/google/devtools/build/lib/packages/StarlarkSemanticsOptions.java
index f75c9dc..01911bc 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/StarlarkSemanticsOptions.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/StarlarkSemanticsOptions.java
@@ -182,6 +182,17 @@
public boolean experimentalCcSharedLibrary;
@Option(
+ name = "experimental_repo_remote_exec",
+ defaultValue = "false",
+ documentationCategory = OptionDocumentationCategory.STARLARK_SEMANTICS,
+ effectTags = {OptionEffectTag.BUILD_FILE_SEMANTICS, OptionEffectTag.LOADING_AND_ANALYSIS},
+ metadataTags = {
+ OptionMetadataTag.EXPERIMENTAL,
+ },
+ help = "If set to true, repository_rule gains some remote execution capabilities.")
+ public boolean experimentalRepoRemoteExec;
+
+ @Option(
name = "incompatible_bzl_disallow_load_after_statement",
defaultValue = "true",
documentationCategory = OptionDocumentationCategory.STARLARK_SEMANTICS,
@@ -609,6 +620,7 @@
.experimentalStarlarkConfigTransitions(experimentalStarlarkConfigTransitions)
.experimentalStarlarkUnusedInputsList(experimentalStarlarkUnusedInputsList)
.experimentalCcSharedLibrary(experimentalCcSharedLibrary)
+ .experimentalRepoRemoteExec(experimentalRepoRemoteExec)
.incompatibleBzlDisallowLoadAfterStatement(incompatibleBzlDisallowLoadAfterStatement)
.incompatibleDepsetUnion(incompatibleDepsetUnion)
.incompatibleDisableTargetProviderFields(incompatibleDisableTargetProviderFields)
diff --git a/src/main/java/com/google/devtools/build/lib/remote/options/RemoteOptions.java b/src/main/java/com/google/devtools/build/lib/remote/options/RemoteOptions.java
index 4c98e86..8857122 100644
--- a/src/main/java/com/google/devtools/build/lib/remote/options/RemoteOptions.java
+++ b/src/main/java/com/google/devtools/build/lib/remote/options/RemoteOptions.java
@@ -365,7 +365,11 @@
public int maxOutboundMessageSize = 1024 * 1024;
public boolean isRemoteEnabled() {
- return !Strings.isNullOrEmpty(remoteCache) || !Strings.isNullOrEmpty(remoteExecutor);
+ return !Strings.isNullOrEmpty(remoteCache) || isRemoteExecutionEnabled();
+ }
+
+ public boolean isRemoteExecutionEnabled() {
+ return !Strings.isNullOrEmpty(remoteExecutor);
}
/**
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PrecomputedValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/PrecomputedValue.java
index 622842d..87d70d3 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/PrecomputedValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/PrecomputedValue.java
@@ -113,6 +113,9 @@
public static final Precomputed<Map<String, String>> REMOTE_DEFAULT_PLATFORM_PROPERTIES =
new Precomputed<>(Key.create("remote_default_platform_properties"));
+ public static final Precomputed<Boolean> REMOTE_EXECUTION_ENABLED =
+ new Precomputed<>(Key.create("remote_execution_enabled"));
+
private final Object value;
@AutoCodec.Instantiator
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
index b3f3d1d..439c01c 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
@@ -1473,6 +1473,10 @@
PrecomputedValue.REMOTE_OUTPUTS_MODE.set(injectable(), remoteOutputsMode);
}
+ private void setRemoteExecutionEnabled(boolean enabled) {
+ PrecomputedValue.REMOTE_EXECUTION_ENABLED.set(injectable(), enabled);
+ }
+
/** Called each time there is a new top-level host configuration. */
protected void updateTopLevelHostConfiguration(BuildConfiguration topLevelHostConfiguration) {}
@@ -2672,6 +2676,7 @@
} catch (UserExecException e) {
throw new AbruptExitException(e.getMessage(), ExitCode.COMMAND_LINE_ERROR, e);
}
+ setRemoteExecutionEnabled(remoteOptions != null && remoteOptions.isRemoteExecutionEnabled());
syncPackageLoading(
packageCacheOptions,
pathPackageLocator,
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/repository/RepositoryModuleApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/repository/RepositoryModuleApi.java
index 07bba7e..e20e651 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/repository/RepositoryModuleApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/repository/RepositoryModuleApi.java
@@ -23,6 +23,7 @@
import com.google.devtools.build.lib.syntax.EvalException;
import com.google.devtools.build.lib.syntax.FuncallExpression;
import com.google.devtools.build.lib.syntax.Sequence;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics.FlagIdentifier;
import com.google.devtools.build.lib.syntax.StarlarkThread;
/**
@@ -88,6 +89,15 @@
named = true,
positional = false),
@Param(
+ name = "remotable",
+ type = Boolean.class,
+ defaultValue = "False",
+ doc = "Compatible with remote execution",
+ named = true,
+ positional = false,
+ enableOnlyWithFlag = FlagIdentifier.EXPERIMENTAL_REPO_REMOTE_EXEC,
+ valueWhenDisabled = "False"),
+ @Param(
name = "doc",
type = String.class,
defaultValue = "''",
@@ -105,6 +115,7 @@
Boolean local,
Sequence<?> environ, // <String> expected
Boolean configure,
+ Boolean remotable,
String doc,
FuncallExpression ast,
StarlarkThread thread)
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/StarlarkSemantics.java b/src/main/java/com/google/devtools/build/lib/syntax/StarlarkSemantics.java
index 8ffd56d..133c397 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/StarlarkSemantics.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/StarlarkSemantics.java
@@ -60,6 +60,7 @@
EXPERIMENTAL_STARLARK_UNUSED_INPUTS_LIST(
StarlarkSemantics::experimentalStarlarkUnusedInputsList),
EXPERIMENTAL_CC_SHARED_LIBRARY(StarlarkSemantics::experimentalCcSharedLibrary),
+ EXPERIMENTAL_REPO_REMOTE_EXEC(StarlarkSemantics::experimentalRepoRemoteExec),
INCOMPATIBLE_DISABLE_DEPSET_INPUTS(StarlarkSemantics::incompatibleDisableDepsetItems),
INCOMPATIBLE_NO_OUTPUT_ATTR_DEFAULT(StarlarkSemantics::incompatibleNoOutputAttrDefault),
INCOMPATIBLE_NO_RULE_OUTPUTS_PARAM(StarlarkSemantics::incompatibleNoRuleOutputsParam),
@@ -150,6 +151,8 @@
public abstract boolean experimentalCcSharedLibrary();
+ public abstract boolean experimentalRepoRemoteExec();
+
public abstract boolean incompatibleBzlDisallowLoadAfterStatement();
public abstract boolean incompatibleDepsetUnion();
@@ -251,6 +254,7 @@
.experimentalStarlarkConfigTransitions(true)
.experimentalStarlarkUnusedInputsList(true)
.experimentalCcSharedLibrary(false)
+ .experimentalRepoRemoteExec(false)
.incompatibleBzlDisallowLoadAfterStatement(true)
.incompatibleDepsetUnion(true)
.incompatibleDisableTargetProviderFields(false)
@@ -310,6 +314,8 @@
public abstract Builder experimentalCcSharedLibrary(boolean value);
+ public abstract Builder experimentalRepoRemoteExec(boolean value);
+
public abstract Builder incompatibleBzlDisallowLoadAfterStatement(boolean value);
public abstract Builder incompatibleDepsetUnion(boolean value);
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/repository/FakeRepositoryModule.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/repository/FakeRepositoryModule.java
index 435abfe..4486139 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/repository/FakeRepositoryModule.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/repository/FakeRepositoryModule.java
@@ -56,6 +56,7 @@
Boolean local,
Sequence<?> environ, // <String> expected
Boolean configure,
+ Boolean remotable,
String doc,
FuncallExpression ast,
StarlarkThread thread)
diff --git a/src/test/java/com/google/devtools/build/lib/packages/SkylarkSemanticsConsistencyTest.java b/src/test/java/com/google/devtools/build/lib/packages/SkylarkSemanticsConsistencyTest.java
index 8dc3743..e2e1f51 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/SkylarkSemanticsConsistencyTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/SkylarkSemanticsConsistencyTest.java
@@ -133,6 +133,7 @@
"--experimental_starlark_unused_inputs_list=" + rand.nextBoolean(),
"--incompatible_allow_tags_propagation=" + rand.nextBoolean(),
"--experimental_cc_shared_library=" + rand.nextBoolean(),
+ "--experimental_repo_remote_exec=" + rand.nextBoolean(),
"--incompatible_bzl_disallow_load_after_statement=" + rand.nextBoolean(),
"--incompatible_depset_for_libraries_to_link_getter=" + rand.nextBoolean(),
"--incompatible_depset_union=" + rand.nextBoolean(),
@@ -182,6 +183,7 @@
.experimentalStarlarkUnusedInputsList(rand.nextBoolean())
.experimentalAllowTagsPropagation(rand.nextBoolean())
.experimentalCcSharedLibrary(rand.nextBoolean())
+ .experimentalRepoRemoteExec(rand.nextBoolean())
.incompatibleBzlDisallowLoadAfterStatement(rand.nextBoolean())
.incompatibleDepsetForLibrariesToLinkGetter(rand.nextBoolean())
.incompatibleDepsetUnion(rand.nextBoolean())