aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar cpeyser <cpeyser@google.com>2017-08-30 18:44:20 +0200
committerGravatar Vladimir Moskva <vladmos@google.com>2017-08-31 13:36:14 +0200
commit2b983bdf508e010a3d4ee9dbaf446b7666749799 (patch)
tree6029afbc0bf8114044958d1d900c617e8b8a428f /src
parentf12402b2627f8eeb70ee24f457efe007206f9b42 (diff)
Rollforward of c++ toolchain-relevant BUILD file and Bazel mocking changes. That is, a c++ toolchain is added, but a Bazel dependency on that toolchain is not.
PiperOrigin-RevId: 167006332
Diffstat (limited to 'src')
-rw-r--r--src/create_embedded_tools.py4
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/BaseRuleClasses.java77
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/PlatformOptions.java6
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/PlatformSemantics.java10
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/ToolchainContext.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleClassFunctions.java8
-rw-r--r--src/test/java/com/google/devtools/build/lib/analysis/BuildViewTest.java4
-rw-r--r--src/test/java/com/google/devtools/build/lib/packages/util/BazelMockCcSupport.java27
-rw-r--r--src/test/java/com/google/devtools/build/lib/packages/util/MockPlatformSupport.java36
-rw-r--r--src/test/java/com/google/devtools/build/lib/rules/cpp/CcCommonTest.java1
10 files changed, 128 insertions, 47 deletions
diff --git a/src/create_embedded_tools.py b/src/create_embedded_tools.py
index 699edd09f5..668db213fe 100644
--- a/src/create_embedded_tools.py
+++ b/src/create_embedded_tools.py
@@ -29,8 +29,8 @@ from src.create_embedded_tools_lib import is_executable
output_paths = [
('*tools/jdk/BUILD*', lambda x: 'tools/jdk/BUILD'),
- ('*tools/platforms/platforms.BUILD', lambda x: 'platforms/BUILD'),
- ('*tools/platforms/*', lambda x: 'platforms/' + os.path.basename(x)),
+ ('*tools/platforms/platforms.BUILD', lambda x: 'tools/platforms/BUILD'),
+ ('*tools/platforms/*', lambda x: 'tools/platforms/' + os.path.basename(x)),
('*JavaBuilder*_deploy.jar', lambda x: 'tools/jdk/' + os.path.basename(x)),
('*JacocoCoverage*_deploy.jar',
lambda x: 'tools/jdk/JacocoCoverage_deploy.jar'),
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 817f4d163e..f52d66f209 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
@@ -182,41 +182,60 @@ public class BaseRuleClasses {
* Share common attributes across both base and Skylark base rules.
*/
public static RuleClass.Builder commonCoreAndSkylarkAttributes(RuleClass.Builder builder) {
- return builder
+ return PlatformSemantics.platformAttributes(builder)
// The visibility attribute is special: it is a nodep label, and loading the
// necessary package groups is handled by {@link LabelVisitor#visitTargetVisibility}.
// Package groups always have the null configuration so that they are not duplicated
// needlessly.
- .add(attr("visibility", NODEP_LABEL_LIST).orderIndependent().cfg(HOST)
- .nonconfigurable("special attribute integrated more deeply into Bazel's core logic"))
- .add(attr("deprecation", STRING).value(deprecationDefault)
- .nonconfigurable("Used in core loading phase logic with no access to configs"))
- .add(attr("tags", STRING_LIST).orderIndependent().taggable()
- .nonconfigurable("low-level attribute, used in TargetUtils without configurations"))
- .add(attr("generator_name", STRING).undocumented("internal")
- .nonconfigurable("static structure of a rule"))
- .add(attr("generator_function", STRING).undocumented("internal")
- .nonconfigurable("static structure of a rule"))
- .add(attr("generator_location", STRING).undocumented("internal")
- .nonconfigurable("static structure of a rule"))
- .add(attr("testonly", BOOLEAN).value(testonlyDefault)
- .nonconfigurable("policy decision: rules testability should be consistent"))
+ .add(
+ attr("visibility", NODEP_LABEL_LIST)
+ .orderIndependent()
+ .cfg(HOST)
+ .nonconfigurable(
+ "special attribute integrated more deeply into Bazel's core logic"))
+ .add(
+ attr("deprecation", STRING)
+ .value(deprecationDefault)
+ .nonconfigurable("Used in core loading phase logic with no access to configs"))
+ .add(
+ attr("tags", STRING_LIST)
+ .orderIndependent()
+ .taggable()
+ .nonconfigurable("low-level attribute, used in TargetUtils without configurations"))
+ .add(
+ attr("generator_name", STRING)
+ .undocumented("internal")
+ .nonconfigurable("static structure of a rule"))
+ .add(
+ attr("generator_function", STRING)
+ .undocumented("internal")
+ .nonconfigurable("static structure of a rule"))
+ .add(
+ attr("generator_location", STRING)
+ .undocumented("internal")
+ .nonconfigurable("static structure of a rule"))
+ .add(
+ attr("testonly", BOOLEAN)
+ .value(testonlyDefault)
+ .nonconfigurable("policy decision: rules testability should be consistent"))
.add(attr("features", STRING_LIST).orderIndependent())
.add(attr(":action_listener", LABEL_LIST).cfg(HOST).value(ACTION_LISTENER))
- .add(attr(RuleClass.COMPATIBLE_ENVIRONMENT_ATTR, LABEL_LIST)
- .allowedRuleClasses(EnvironmentRule.RULE_NAME)
- .cfg(Attribute.ConfigurationTransition.HOST)
- .allowedFileTypes(FileTypeSet.NO_FILE)
- .dontCheckConstraints()
- .nonconfigurable("special logic for constraints and select: see ConstraintSemantics")
- )
- .add(attr(RuleClass.RESTRICTED_ENVIRONMENT_ATTR, LABEL_LIST)
- .allowedRuleClasses(EnvironmentRule.RULE_NAME)
- .cfg(Attribute.ConfigurationTransition.HOST)
- .allowedFileTypes(FileTypeSet.NO_FILE)
- .dontCheckConstraints()
- .nonconfigurable("special logic for constraints and select: see ConstraintSemantics")
- );
+ .add(
+ attr(RuleClass.COMPATIBLE_ENVIRONMENT_ATTR, LABEL_LIST)
+ .allowedRuleClasses(EnvironmentRule.RULE_NAME)
+ .cfg(Attribute.ConfigurationTransition.HOST)
+ .allowedFileTypes(FileTypeSet.NO_FILE)
+ .dontCheckConstraints()
+ .nonconfigurable(
+ "special logic for constraints and select: see ConstraintSemantics"))
+ .add(
+ attr(RuleClass.RESTRICTED_ENVIRONMENT_ATTR, LABEL_LIST)
+ .allowedRuleClasses(EnvironmentRule.RULE_NAME)
+ .cfg(Attribute.ConfigurationTransition.HOST)
+ .allowedFileTypes(FileTypeSet.NO_FILE)
+ .dontCheckConstraints()
+ .nonconfigurable(
+ "special logic for constraints and select: see ConstraintSemantics"));
}
public static RuleClass.Builder nameAttribute(RuleClass.Builder builder) {
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
index 3376e9609d..3a84352105 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/PlatformOptions.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/PlatformOptions.java
@@ -36,7 +36,7 @@ public class PlatformOptions extends FragmentOptions {
@Option(
name = "experimental_host_platform",
converter = BuildConfiguration.LabelConverter.class,
- defaultValue = "@bazel_tools//platforms:host_platform",
+ defaultValue = "@bazel_tools//tools/platforms:host_platform",
documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
effectTags = {OptionEffectTag.UNKNOWN},
metadataTags = {OptionMetadataTag.HIDDEN},
@@ -49,7 +49,7 @@ public class PlatformOptions extends FragmentOptions {
@Option(
name = "experimental_platforms",
converter = BuildConfiguration.LabelListConverter.class,
- defaultValue = "@bazel_tools//platforms:target_platform",
+ defaultValue = "@bazel_tools//tools/platforms:target_platform",
documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
effectTags = {OptionEffectTag.UNKNOWN},
metadataTags = {OptionMetadataTag.HIDDEN},
@@ -98,6 +98,8 @@ public class PlatformOptions extends FragmentOptions {
public PlatformOptions getHost(boolean fallback) {
PlatformOptions host = (PlatformOptions) getDefault();
host.platforms = ImmutableList.of(this.hostPlatform);
+ host.hostPlatform = this.hostPlatform;
+ host.extraToolchains = this.extraToolchains;
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
index d93c5a6dea..45c967e551 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/PlatformSemantics.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/PlatformSemantics.java
@@ -26,6 +26,7 @@ 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;
+import javax.annotation.Nullable;
/** Helper class to manage rules' use of platforms. */
public class PlatformSemantics {
@@ -40,19 +41,22 @@ public class PlatformSemantics {
@Override
public List<Label> resolve(
Rule rule, AttributeMap attributes, BuildConfiguration configuration) {
- if (rule.getRuleClassObject().getRequiredToolchains().isEmpty()) {
- return null;
+ // rule may be null for tests
+ if (rule == null || rule.getRuleClassObject().getRequiredToolchains().isEmpty()) {
+ return ImmutableList.of();
}
return configuration.getFragment(PlatformConfiguration.class).getTargetPlatforms();
}
};
/** Implementation for the :execution_platform attribute. */
+ @Nullable
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()) {
+ // rule may be null for tests
+ if (rule == null || rule.getRuleClassObject().getRequiredToolchains().isEmpty()) {
return null;
}
return configuration.getFragment(PlatformConfiguration.class).getExecutionPlatform();
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ToolchainContext.java b/src/main/java/com/google/devtools/build/lib/analysis/ToolchainContext.java
index 9cbdd475ac..16a29fd5df 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ToolchainContext.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ToolchainContext.java
@@ -142,6 +142,8 @@ public class ToolchainContext {
prerequisiteMap
.keys()
.stream()
+ // Keys in prerequisiteMap can be null, see {@link DependencyResolver#dependentNodeMap}.
+ .filter(attribute -> attribute != null)
.filter(attribute -> attribute.getName().equals(PlatformSemantics.TOOLCHAINS_ATTR))
.findFirst();
Preconditions.checkState(
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleClassFunctions.java b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleClassFunctions.java
index 3e850d966d..6c8487364d 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleClassFunctions.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleClassFunctions.java
@@ -39,7 +39,6 @@ import com.google.devtools.build.lib.analysis.ActionsProvider;
import com.google.devtools.build.lib.analysis.BaseRuleClasses;
import com.google.devtools.build.lib.analysis.DefaultInfo;
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.analysis.skylark.SkylarkAttr.Descriptor;
import com.google.devtools.build.lib.analysis.test.TestConfiguration;
@@ -129,10 +128,9 @@ public class SkylarkRuleClassFunctions {
/** Parent rule class for non-executable non-test Skylark rules. */
public static final RuleClass baseRule =
BaseRuleClasses.commonCoreAndSkylarkAttributes(
- PlatformSemantics.platformAttributes(
- BaseRuleClasses.nameAttribute(
- new RuleClass.Builder("$base_rule", RuleClassType.ABSTRACT, true))
- .add(attr("expect_failure", STRING))))
+ 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. */
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/BuildViewTest.java b/src/test/java/com/google/devtools/build/lib/analysis/BuildViewTest.java
index 183c8c05f7..83bcdad904 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/BuildViewTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/BuildViewTest.java
@@ -1238,8 +1238,8 @@ public class BuildViewTest extends BuildViewTestBase {
useConfiguration("--experimental_dynamic_configs=on");
AnalysisResult res = update("//foo:x");
ConfiguredTarget topLevelTarget = Iterables.getOnlyElement(res.getTargetsToBuild());
- assertThat(topLevelTarget.getConfiguration().getAllFragments().keySet()).containsExactly(
- ruleClassProvider.getUniversalFragment());
+ assertThat(topLevelTarget.getConfiguration().getAllFragments().keySet())
+ .containsExactly(ruleClassProvider.getUniversalFragment(), PlatformConfiguration.class);
}
@Test
diff --git a/src/test/java/com/google/devtools/build/lib/packages/util/BazelMockCcSupport.java b/src/test/java/com/google/devtools/build/lib/packages/util/BazelMockCcSupport.java
index 0defa523b1..862b213eab 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/util/BazelMockCcSupport.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/util/BazelMockCcSupport.java
@@ -77,7 +77,6 @@ public final class BazelMockCcSupport extends MockCcSupport {
config.create(
"/bazel_tools_workspace/tools/cpp/BUILD",
"package(default_visibility=['//visibility:public'])",
- "toolchain_type(name = 'toolchain_type')",
"cc_library(name = 'stl')",
"cc_library(name = 'malloc')",
"cc_toolchain_suite(",
@@ -123,7 +122,7 @@ public final class BazelMockCcSupport extends MockCcSupport {
" linker_files = ':empty',",
" module_map = 'crosstool.cppmap', supports_header_parsing = 1,",
" objcopy_files = ':empty', static_runtime_libs = [':empty'], strip_files = ':empty',",
- ")",
+ ")",
"cc_toolchain(name = 'cc-compiler-armeabi-v7a', all_files = ':empty', ",
" compiler_files = ':empty',",
" cpu = 'local', dwp_files = ':empty', dynamic_runtime_libs = [':empty'], ",
@@ -145,8 +144,27 @@ public final class BazelMockCcSupport extends MockCcSupport {
"filegroup(",
" name = 'link_dynamic_library',",
" srcs = ['link_dynamic_library.sh'],",
- ")");
-
+ ")",
+ "toolchain_type(name = 'toolchain_type')",
+ "toolchain(",
+ " name = 'toolchain_cc-compiler-piii',",
+ " toolchain_type = ':toolchain_type',",
+ " toolchain = '//third_party/crosstool/mock:cc-compiler-piii',",
+ " target_compatible_with = [':mock_value'],",
+ ")",
+ "toolchain(",
+ " name = 'dummy_cc_toolchain',",
+ " toolchain_type = ':toolchain_type',",
+ " toolchain = ':dummy_cc_toolchain_impl',",
+ ")",
+ "load(':dummy_toolchain.bzl', 'dummy_toolchain')",
+ "dummy_toolchain(name = 'dummy_cc_toolchain_impl')");
+ config.create(
+ "/bazel_tools_workspace/tools/cpp/dummy_toolchain.bzl",
+ "def _dummy_toolchain_impl(ctx):",
+ " toolchain = platform_common.ToolchainInfo()",
+ " return [toolchain]",
+ "dummy_toolchain = rule(_dummy_toolchain_impl, attrs = {})");
config.create(
"/bazel_tools_workspace/tools/cpp/CROSSTOOL",
readCrosstoolFile());
@@ -156,6 +174,7 @@ public final class BazelMockCcSupport extends MockCcSupport {
config.create("tools/cpp/link_dynamic_library.sh", "");
}
MockObjcSupport.setup(config);
+ MockPlatformSupport.setup(config, "/bazel_tools_workspace/tools/platforms");
}
@Override
diff --git a/src/test/java/com/google/devtools/build/lib/packages/util/MockPlatformSupport.java b/src/test/java/com/google/devtools/build/lib/packages/util/MockPlatformSupport.java
new file mode 100644
index 0000000000..f2d89fbbe4
--- /dev/null
+++ b/src/test/java/com/google/devtools/build/lib/packages/util/MockPlatformSupport.java
@@ -0,0 +1,36 @@
+// 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.packages.util;
+
+import java.io.IOException;
+
+/** Mocking support for platforms and toolchains. */
+public class MockPlatformSupport {
+
+ /** Adds mocks for basic host and target platform. */
+ public static void setup(MockToolsConfig mockToolsConfig, String platformsPath)
+ throws IOException {
+ mockToolsConfig.create(
+ platformsPath + "/BUILD",
+ "package(default_visibility=['//visibility:public'])",
+ "platform(",
+ " name = 'target_platform',",
+ " target_platform = True,",
+ ")",
+ "platform(",
+ " name = 'host_platform',",
+ " host_platform = True,",
+ ")");
+ }
+}
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcCommonTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcCommonTest.java
index 2547d354f3..2ff18b4379 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcCommonTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcCommonTest.java
@@ -977,6 +977,7 @@ public class CcCommonTest extends BuildViewTestCase {
BazelRuleClassProvider.BAZEL_SETUP.init(builder);
CoreRules.INSTANCE.init(builder);
BazelRuleClassProvider.CORE_WORKSPACE_RULES.init(builder);
+ BazelRuleClassProvider.PLATFORM_RULES.init(builder);
BazelRuleClassProvider.GENERIC_RULES.init(builder);
BazelRuleClassProvider.CPP_RULES.init(builder);
builder.addRuleDefinition(new OnlyCppToolchainTypeRule());