Add registration of execution platforms Part of #4442. Change-Id: I6debbf7cfdf560d2113e736176702c2cd889c0d2 PiperOrigin-RevId: 182763864
diff --git a/src/main/java/com/google/devtools/build/lib/packages/Package.java b/src/main/java/com/google/devtools/build/lib/packages/Package.java index c37ffa3..b07d02a 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/Package.java +++ b/src/main/java/com/google/devtools/build/lib/packages/Package.java
@@ -203,6 +203,7 @@ private ImmutableList<Event> events; private ImmutableList<Postable> posts; + private ImmutableList<Label> registeredExecutionPlatformLabels; private ImmutableList<Label> registeredToolchainLabels; /** @@ -339,6 +340,8 @@ this.features = ImmutableSortedSet.copyOf(builder.features); this.events = ImmutableList.copyOf(builder.events); this.posts = ImmutableList.copyOf(builder.posts); + this.registeredExecutionPlatformLabels = + ImmutableList.copyOf(builder.registeredExecutionPlatformLabels); this.registeredToolchainLabels = ImmutableList.copyOf(builder.registeredToolchainLabels); } @@ -656,6 +659,10 @@ return defaultRestrictedTo; } + public ImmutableList<Label> getRegisteredExecutionPlatformLabels() { + return registeredExecutionPlatformLabels; + } + public ImmutableList<Label> getRegisteredToolchainLabels() { return registeredToolchainLabels; } @@ -775,6 +782,7 @@ protected Map<Label, Path> subincludes = null; protected ImmutableList<Label> skylarkFileDependencies = ImmutableList.of(); + protected List<Label> registeredExecutionPlatformLabels = new ArrayList<>(); protected List<Label> registeredToolchainLabels = new ArrayList<>(); /** @@ -1298,6 +1306,10 @@ addRuleUnchecked(rule); } + public void addRegisteredExecutionPlatformLabels(List<Label> platforms) { + this.registeredExecutionPlatformLabels.addAll(platforms); + } + void addRegisteredToolchainLabels(List<Label> toolchains) { this.registeredToolchainLabels.addAll(toolchains); }
diff --git a/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactory.java b/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactory.java index 1982200..9e1326b 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactory.java +++ b/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactory.java
@@ -274,6 +274,7 @@ if (aPackage.containsErrors()) { builder.setContainsErrors(); } + builder.addRegisteredExecutionPlatformLabels(aPackage.getRegisteredExecutionPlatformLabels()); builder.addRegisteredToolchainLabels(aPackage.getRegisteredToolchainLabels()); for (Rule rule : aPackage.getTargets(Rule.class)) { try { @@ -388,6 +389,57 @@ } @SkylarkSignature( + name = "register_execution_platforms", + objectType = Object.class, + returnType = NoneType.class, + doc = "Registers a platform so that it is available to execute actions.", + extraPositionals = + @Param( + name = "platform_labels", + type = SkylarkList.class, + generic1 = String.class, + doc = "The labels of the platforms to register." + ), + useAst = true, + useEnvironment = true + ) + private static final BuiltinFunction.Factory newRegisterExecutionPlatformsFunction = + new BuiltinFunction.Factory("register_execution_platforms") { + public BuiltinFunction create(final RuleFactory ruleFactory) { + return new BuiltinFunction( + "register_execution_platforms", + FunctionSignature.POSITIONALS, + BuiltinFunction.USE_AST_ENV) { + public Object invoke( + SkylarkList<String> platformLabels, FuncallExpression ast, Environment env) + throws EvalException, InterruptedException { + + // Collect the platform labels. + List<Label> platforms = new ArrayList<>(); + for (String rawLabel : platformLabels.getContents(String.class, "platform_labels")) { + try { + platforms.add(Label.parseAbsolute(rawLabel)); + } catch (LabelSyntaxException e) { + throw new EvalException( + ast.getLocation(), + String.format( + "In register_execution_platforms: unable to parse platform label %s: %s", + rawLabel, e.getMessage()), + e); + } + } + + // Add to the package definition for later. + Package.Builder builder = PackageFactory.getContext(env, ast).pkgBuilder; + builder.addRegisteredExecutionPlatformLabels(platforms); + + return NONE; + } + }; + } + }; + + @SkylarkSignature( name = "register_toolchains", objectType = Object.class, returnType = NoneType.class, @@ -484,6 +536,8 @@ boolean allowOverride, RuleFactory ruleFactory) { Map<String, BaseFunction> map = new HashMap<>(); map.put("bind", newBindFunction(ruleFactory)); + map.put( + "register_execution_platforms", newRegisterExecutionPlatformsFunction.apply(ruleFactory)); map.put("register_toolchains", newRegisterToolchainsFunction.apply(ruleFactory)); for (String ruleClass : ruleFactory.getRuleClassNames()) { if (!map.containsKey(ruleClass)) {