aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar John Cater <jcater@google.com>2017-06-07 12:06:10 -0400
committerGravatar John Cater <jcater@google.com>2017-06-08 10:52:05 -0400
commit0425b2d6a50637c2e7dab054e18e1de953382de6 (patch)
tree17e44b766c0780f6866fe4c3147447acfcbfe555 /src
parente34439cb73cb61b3e22741b0acc4e05568338f0c (diff)
Add new configuration fragment for platforms, with host and target
options. Change-Id: If623f2416f8bff7c74ddf99d5c957a075de6494f PiperOrigin-RevId: 158275892
Diffstat (limited to 'src')
-rw-r--r--src/main/java/com/google/devtools/build/lib/BUILD1
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/PlatformConfiguration.java57
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/PlatformConfigurationLoader.java52
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/PlatformOptions.java56
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/PlatformSemantics.java88
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java6
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleClassFunctions.java10
-rw-r--r--src/test/java/com/google/devtools/build/lib/BUILD1
-rw-r--r--src/test/java/com/google/devtools/build/lib/analysis/mock/BazelAnalysisMock.java4
9 files changed, 269 insertions, 6 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/BUILD b/src/main/java/com/google/devtools/build/lib/BUILD
index 610486e186..2864670239 100644
--- a/src/main/java/com/google/devtools/build/lib/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/BUILD
@@ -602,6 +602,7 @@ java_library(
":vfs",
"//src/main/java/com/google/devtools/build/lib/actions",
"//src/main/java/com/google/devtools/build/lib/analysis/platform",
+ "//src/main/java/com/google/devtools/build/lib/analysis/platform:utils",
"//src/main/java/com/google/devtools/build/lib/buildeventstream/proto:build_event_stream_java_proto",
"//src/main/java/com/google/devtools/build/lib/causes",
"//src/main/java/com/google/devtools/build/lib/cmdline",
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/PlatformConfiguration.java b/src/main/java/com/google/devtools/build/lib/analysis/PlatformConfiguration.java
new file mode 100644
index 0000000000..1b86f7b8e9
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/analysis/PlatformConfiguration.java
@@ -0,0 +1,57 @@
+// Copyright 2017 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.devtools.build.lib.analysis;
+
+import com.google.common.collect.ImmutableList;
+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;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+import java.util.List;
+
+/** A configuration fragment describing the current platform configuration. */
+@ThreadSafety.Immutable
+@SkylarkModule(
+ name = "platform",
+ doc = "The platform configuration.",
+ category = SkylarkModuleCategory.CONFIGURATION_FRAGMENT
+)
+public class PlatformConfiguration extends BuildConfiguration.Fragment {
+
+ private final Label executionPlatform;
+ private final ImmutableList<Label> targetPlatforms;
+
+ public PlatformConfiguration(Label executionPlatform, List<Label> targetPlatforms) {
+
+ this.executionPlatform = executionPlatform;
+ this.targetPlatforms = ImmutableList.copyOf(targetPlatforms);
+ }
+
+ @SkylarkCallable(
+ name = "execution_platform",
+ structField = true,
+ doc = "The current execution platform"
+ )
+ public Label getExecutionPlatform() {
+ return executionPlatform;
+ }
+
+ @SkylarkCallable(name = "platforms", structField = true, doc = "The current target platforms")
+ public ImmutableList<Label> getTargetPlatforms() {
+ return targetPlatforms;
+ }
+}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/PlatformConfigurationLoader.java b/src/main/java/com/google/devtools/build/lib/analysis/PlatformConfigurationLoader.java
new file mode 100644
index 0000000000..85cc1748aa
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/analysis/PlatformConfigurationLoader.java
@@ -0,0 +1,52 @@
+// Copyright 2017 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.devtools.build.lib.analysis;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildOptions;
+import com.google.devtools.build.lib.analysis.config.ConfigurationEnvironment;
+import com.google.devtools.build.lib.analysis.config.ConfigurationFragmentFactory;
+import com.google.devtools.build.lib.analysis.config.FragmentOptions;
+import com.google.devtools.build.lib.analysis.config.InvalidConfigurationException;
+import com.google.devtools.build.lib.cmdline.Label;
+
+/** A loader that creates {@link PlatformConfiguration} instances based on command-line options. */
+public class PlatformConfigurationLoader implements ConfigurationFragmentFactory {
+ @Override
+ public ImmutableSet<Class<? extends FragmentOptions>> requiredOptions() {
+ return ImmutableSet.<Class<? extends FragmentOptions>>of(PlatformOptions.class);
+ }
+
+ @Override
+ public PlatformConfiguration create(ConfigurationEnvironment env, BuildOptions buildOptions)
+ throws InvalidConfigurationException, InterruptedException {
+ PlatformOptions platformOptions = buildOptions.get(PlatformOptions.class);
+ return create(platformOptions);
+ }
+
+ @Override
+ public Class<? extends BuildConfiguration.Fragment> creates() {
+ return PlatformConfiguration.class;
+ }
+
+ private PlatformConfiguration create(PlatformOptions options)
+ throws InvalidConfigurationException {
+ // TODO(katre): This will change with remote execution.
+ Label executionPlatform = options.hostPlatform;
+
+ return new PlatformConfiguration(executionPlatform, options.platforms);
+ }
+}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/PlatformOptions.java b/src/main/java/com/google/devtools/build/lib/analysis/PlatformOptions.java
new file mode 100644
index 0000000000..b9c81756c3
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/analysis/PlatformOptions.java
@@ -0,0 +1,56 @@
+// Copyright 2017 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.devtools.build.lib.analysis;
+
+import com.google.common.collect.ImmutableList;
+import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.FragmentOptions;
+import com.google.devtools.build.lib.cmdline.Label;
+import com.google.devtools.common.options.Option;
+import com.google.devtools.common.options.OptionsParser;
+import java.util.List;
+
+/** Command-line options for platform-related configuration. */
+public class PlatformOptions extends FragmentOptions {
+
+ @Option(
+ name = "experimental_host_platform",
+ converter = BuildConfiguration.LabelConverter.class,
+ // TODO(katre): Use @bazel_tools//platforms:host_platform when available.
+ defaultValue = "@bazel_tools//platforms:default_platform",
+ optionUsageRestrictions = OptionsParser.OptionUsageRestrictions.HIDDEN,
+ help = "Declare the platform the build is started from"
+ )
+ public Label hostPlatform;
+
+ // TODO(katre): Add execution platforms.
+
+ @Option(
+ name = "experimental_platforms",
+ converter = BuildConfiguration.LabelListConverter.class,
+ // TODO(katre): Use @bazel_tools//platforms:target_platform when available.
+ defaultValue = "@bazel_tools//platforms:default_platform",
+ optionUsageRestrictions = OptionsParser.OptionUsageRestrictions.HIDDEN,
+ help = "Declare the platforms targeted by the current build"
+ )
+ public List<Label> platforms;
+
+ @Override
+ public PlatformOptions getHost(boolean fallback) {
+ PlatformOptions host = (PlatformOptions) getDefault();
+ host.platforms = ImmutableList.of(this.hostPlatform);
+ return host;
+ }
+}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/PlatformSemantics.java b/src/main/java/com/google/devtools/build/lib/analysis/PlatformSemantics.java
new file mode 100644
index 0000000000..7da9d4cafa
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/analysis/PlatformSemantics.java
@@ -0,0 +1,88 @@
+// Copyright 2017 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.devtools.build.lib.analysis;
+
+import static com.google.devtools.build.lib.packages.Attribute.attr;
+import static com.google.devtools.build.lib.packages.BuildType.LABEL;
+import static com.google.devtools.build.lib.packages.BuildType.LABEL_LIST;
+
+import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.platform.PlatformInfo;
+import com.google.devtools.build.lib.analysis.platform.PlatformProviderUtils;
+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 java.util.List;
+
+/** Helper class to manage rules' use of platforms. */
+public class PlatformSemantics {
+
+ public static final String TARGET_PLATFORMS_ATTR = ":target_platforms";
+ public static final String EXECUTION_PLATFORM_ATTR = ":execution_platform";
+
+ public Iterable<PlatformInfo> getTargetPlatforms(RuleContext ruleContext) {
+ Iterable<PlatformInfo> platform =
+ PlatformProviderUtils.platforms(
+ ruleContext.getPrerequisites(
+ TARGET_PLATFORMS_ATTR, RuleConfiguredTarget.Mode.DONT_CHECK));
+ return platform;
+ }
+
+ public PlatformInfo getExecutionPlatform(RuleContext ruleContext) {
+ PlatformInfo platform =
+ PlatformProviderUtils.platform(
+ ruleContext.getPrerequisite(
+ EXECUTION_PLATFORM_ATTR, RuleConfiguredTarget.Mode.DONT_CHECK));
+ return platform;
+ }
+
+ /** Implementation for the :target_platform attribute. */
+ public static final Attribute.LateBoundLabelList<BuildConfiguration> TARGET_PLATFORM =
+ new Attribute.LateBoundLabelList<BuildConfiguration>(PlatformConfiguration.class) {
+ @Override
+ public List<Label> resolve(
+ Rule rule, AttributeMap attributes, BuildConfiguration configuration) {
+ if (rule.getRuleClassObject().getRequiredToolchains().isEmpty()) {
+ return null;
+ }
+ return configuration.getFragment(PlatformConfiguration.class).getTargetPlatforms();
+ }
+ };
+ /** Implementation for the :execution_platform attribute. */
+ public static final Attribute.LateBoundLabel<BuildConfiguration> EXECUTION_PLATFORM =
+ new Attribute.LateBoundLabel<BuildConfiguration>(PlatformConfiguration.class) {
+ @Override
+ public Label resolve(Rule rule, AttributeMap attributes, BuildConfiguration configuration) {
+ if (rule.getRuleClassObject().getRequiredToolchains().isEmpty()) {
+ return null;
+ }
+ return configuration.getFragment(PlatformConfiguration.class).getExecutionPlatform();
+ }
+ };
+
+ public static RuleClass.Builder platformAttributes(RuleClass.Builder builder) {
+ return builder
+ .add(
+ attr(TARGET_PLATFORMS_ATTR, LABEL_LIST)
+ .value(TARGET_PLATFORM)
+ .nonconfigurable("Used in toolchain resolution"))
+ .add(
+ attr(EXECUTION_PLATFORM_ATTR, LABEL)
+ .value(EXECUTION_PLATFORM)
+ .nonconfigurable("Used in toolchain resolution"));
+ }
+}
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java
index 20a072e544..530a677674 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java
@@ -23,6 +23,8 @@ import com.google.devtools.build.lib.analysis.BaseRuleClasses;
import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider;
import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider.Builder;
import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider.RuleSet;
+import com.google.devtools.build.lib.analysis.PlatformConfigurationLoader;
+import com.google.devtools.build.lib.analysis.PlatformOptions;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
import com.google.devtools.build.lib.analysis.constraints.EnvironmentRule;
import com.google.devtools.build.lib.bazel.rules.BazelToolchainType.BazelToolchainTypeRule;
@@ -162,7 +164,6 @@ import com.google.devtools.build.lib.rules.repository.WorkspaceBaseRule;
import com.google.devtools.build.lib.rules.test.SkylarkTestingModule;
import com.google.devtools.build.lib.rules.test.TestSuiteRule;
import com.google.devtools.build.lib.util.ResourceFileLoader;
-
import java.io.IOException;
/** A rule class provider implementing the rules Bazel knows. */
@@ -242,6 +243,9 @@ public class BazelRuleClassProvider {
new RuleSet() {
@Override
public void init(Builder builder) {
+ builder.addConfigurationOptions(PlatformOptions.class);
+ builder.addConfigurationFragment(new PlatformConfigurationLoader());
+
builder.addRuleDefinition(new ConstraintSettingRule());
builder.addRuleDefinition(new ConstraintValueRule());
builder.addRuleDefinition(new PlatformRule());
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 f11b74ac80..004b215346 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
@@ -39,6 +39,7 @@ import com.google.devtools.build.lib.analysis.ActionsProvider;
import com.google.devtools.build.lib.analysis.BaseRuleClasses;
import com.google.devtools.build.lib.analysis.DefaultProvider;
import com.google.devtools.build.lib.analysis.OutputGroupProvider;
+import com.google.devtools.build.lib.analysis.PlatformSemantics;
import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
@@ -125,10 +126,11 @@ public class SkylarkRuleClassFunctions {
/** Parent rule class for non-executable non-test Skylark rules. */
public static final RuleClass baseRule =
BaseRuleClasses.commonCoreAndSkylarkAttributes(
- BaseRuleClasses.nameAttribute(
- new RuleClass.Builder("$base_rule", RuleClassType.ABSTRACT, true))
- .add(attr("expect_failure", STRING)))
- .build();
+ PlatformSemantics.platformAttributes(
+ BaseRuleClasses.nameAttribute(
+ new RuleClass.Builder("$base_rule", RuleClassType.ABSTRACT, true))
+ .add(attr("expect_failure", STRING))))
+ .build();
/** Parent rule class for executable non-test Skylark rules. */
public static final RuleClass binaryBaseRule =
diff --git a/src/test/java/com/google/devtools/build/lib/BUILD b/src/test/java/com/google/devtools/build/lib/BUILD
index d25a712dc0..24e0835694 100644
--- a/src/test/java/com/google/devtools/build/lib/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/BUILD
@@ -367,6 +367,7 @@ java_library(
"//src/main/java/com/google/devtools/build/lib/rules/cpp",
"//src/main/java/com/google/devtools/build/lib/rules/genquery",
"//src/main/java/com/google/devtools/build/lib/rules/objc",
+ "//src/main/java/com/google/devtools/build/lib/rules/platform",
"//src/main/java/com/google/devtools/build/skyframe",
"//src/main/java/com/google/devtools/build/skyframe:skyframe-objects",
"//src/main/java/com/google/devtools/common/options",
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/mock/BazelAnalysisMock.java b/src/test/java/com/google/devtools/build/lib/analysis/mock/BazelAnalysisMock.java
index adb4c35814..60794b2b0b 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/mock/BazelAnalysisMock.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/mock/BazelAnalysisMock.java
@@ -19,6 +19,7 @@ import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Iterables;
import com.google.devtools.build.lib.analysis.ConfigurationCollectionFactory;
import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider;
+import com.google.devtools.build.lib.analysis.PlatformConfigurationLoader;
import com.google.devtools.build.lib.analysis.config.ConfigurationFactory;
import com.google.devtools.build.lib.analysis.config.ConfigurationFragmentFactory;
import com.google.devtools.build.lib.analysis.util.AnalysisMock;
@@ -270,7 +271,8 @@ public final class BazelAnalysisMock extends AnalysisMock {
new J2ObjcConfiguration.Loader(),
new ProtoConfiguration.Loader(),
new ConfigFeatureFlagConfiguration.Loader(),
- new AndroidConfiguration.Loader());
+ new AndroidConfiguration.Loader(),
+ new PlatformConfigurationLoader());
}
@Override