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())