diff options
25 files changed, 285 insertions, 59 deletions
diff --git a/compile.sh b/compile.sh index dc414b18b6..c72a8026d1 100755 --- a/compile.sh +++ b/compile.sh @@ -81,7 +81,11 @@ source scripts/bootstrap/bootstrap.sh new_step 'Building Bazel with Bazel' display "." log "Building output/bazel" +# We set host and target platform directly since the defaults in @bazel_tools +# have not yet been generated. bazel_build "src:bazel${EXE_EXT}" \ + --experimental_host_platform=//tools/platforms:host_platform \ + --experimental_platforms=//tools/platforms:target_platform \ || fail "Could not build Bazel" bazel_bin_path="$(get_bazel_bin_path)/src/bazel${EXE_EXT}" [ -e "$bazel_bin_path" ] \ 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..e2bf25b98b 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 @@ -60,7 +60,7 @@ public class PlatformOptions extends FragmentOptions { @Option( name = "extra_toolchains", converter = LabelListConverter.class, - defaultValue = "", + defaultValue = "@bazel_tools//tools/cpp:dummy_cc_toolchain", 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 bc47c69d57..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 { @@ -49,6 +50,7 @@ public class PlatformSemantics { }; /** Implementation for the :execution_platform attribute. */ + @Nullable public static final Attribute.LateBoundLabel<BuildConfiguration> EXECUTION_PLATFORM = new Attribute.LateBoundLabel<BuildConfiguration>(PlatformConfiguration.class) { @Override 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/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCppRuleClasses.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCppRuleClasses.java index 99abec3c14..8d494c8720 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCppRuleClasses.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCppRuleClasses.java @@ -57,6 +57,7 @@ import com.google.devtools.build.lib.packages.TriState; import com.google.devtools.build.lib.rules.cpp.CcToolchain; import com.google.devtools.build.lib.rules.cpp.CppConfiguration; import com.google.devtools.build.lib.rules.cpp.CppFileTypes; +import com.google.devtools.build.lib.rules.cpp.CppHelper; import com.google.devtools.build.lib.rules.cpp.CppRuleClasses; import com.google.devtools.build.lib.rules.cpp.CppRuleClasses.LipoTransition; import com.google.devtools.build.lib.util.FileTypeSet; @@ -139,6 +140,7 @@ public class BazelCppRuleClasses { attr(CcToolchain.CC_TOOLCHAIN_DEFAULT_ATTRIBUTE_NAME, LABEL) .value(CppRuleClasses.ccToolchainAttribute(env))) .setPreferredDependencyPredicate(Predicates.<String>or(CPP_SOURCE, C_SOURCE, CPP_HEADER)) + .addRequiredToolchains(CppHelper.getCcToolchainType(env.getToolsRepository())) .build(); } diff --git a/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java b/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java index dcf609261e..daa2e8ec1b 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java +++ b/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java @@ -28,6 +28,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; import com.google.common.collect.Ordering; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.cmdline.LabelSyntaxException; @@ -997,6 +998,11 @@ public class RuleClass { return this; } + public Builder addRequiredToolchains(Label... toolchainLabels) { + Iterables.addAll(this.requiredToolchains, Lists.newArrayList(toolchainLabels)); + return this; + } + /** * Returns an Attribute.Builder object which contains a replica of the * same attribute in the parent rule if exists. diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java index 1100576151..87f43cc057 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java @@ -87,6 +87,11 @@ public class CppHelper { private static final ImmutableList<String> LINKOPTS_PREREQUISITE_LABEL_KINDS = ImmutableList.of("deps", "srcs"); + /** Returns label used to select resolved cc_toolchain instances based on platform. */ + public static Label getCcToolchainType(String toolsRepository) { + return Label.parseAbsoluteUnchecked(toolsRepository + "//tools/cpp:toolchain_type"); + } + private CppHelper() { // prevents construction } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyFunctionEnvironmentForTesting.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyFunctionEnvironmentForTesting.java index 7df8afddd5..0acb49c1c6 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyFunctionEnvironmentForTesting.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyFunctionEnvironmentForTesting.java @@ -14,7 +14,9 @@ package com.google.devtools.build.lib.skyframe; +import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; import com.google.devtools.build.lib.events.ExtendedEventHandler; import com.google.devtools.build.lib.util.ResourceUsage; import com.google.devtools.build.skyframe.AbstractSkyFunctionEnvironment; @@ -33,21 +35,27 @@ public class SkyFunctionEnvironmentForTesting extends AbstractSkyFunctionEnviron private final BuildDriver buildDriver; private final ExtendedEventHandler eventHandler; + private final SkyframeExecutor skyframeExecutor; /** Creates a SkyFunctionEnvironmentForTesting that uses a BuildDriver to evaluate skykeys. */ public SkyFunctionEnvironmentForTesting( - BuildDriver buildDriver, ExtendedEventHandler eventHandler) { + BuildDriver buildDriver, + ExtendedEventHandler eventHandler, + SkyframeExecutor skyframeExecutor) { this.buildDriver = buildDriver; this.eventHandler = eventHandler; + this.skyframeExecutor = skyframeExecutor; } @Override protected Map<SkyKey, ValueOrUntypedException> getValueOrUntypedExceptions( Iterable<? extends SkyKey> depKeys) throws InterruptedException { ImmutableMap.Builder<SkyKey, ValueOrUntypedException> resultMap = ImmutableMap.builder(); + Iterable<SkyKey> keysToEvaluate = ImmutableList.copyOf(depKeys); EvaluationResult<SkyValue> evaluationResult = + skyframeExecutor.evaluateSkyKeys(eventHandler, keysToEvaluate, true); buildDriver.evaluate(depKeys, true, ResourceUsage.getAvailableProcessors(), eventHandler); - for (SkyKey depKey : depKeys) { + for (SkyKey depKey : ImmutableSet.copyOf(depKeys)) { resultMap.put(depKey, ValueOrExceptionUtils.ofValue(evaluationResult.get(depKey))); } return resultMap.build(); 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 f592d39268..9c952acb78 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 @@ -837,7 +837,7 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory { Set<Label> requiredToolchains, BuildConfiguration config, ExtendedEventHandler eventHandler) throws ToolchainContextException, InterruptedException { SkyFunctionEnvironmentForTesting env = - new SkyFunctionEnvironmentForTesting(buildDriver, eventHandler); + new SkyFunctionEnvironmentForTesting(buildDriver, eventHandler, this); return ToolchainUtil.createToolchainContext(env, "", requiredToolchains, config); } @@ -1534,7 +1534,7 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory { * Evaluates the given sky keys, blocks, and returns their evaluation results. Enables/disables * "keep going" on evaluation errors as specified. */ - private EvaluationResult<SkyValue> evaluateSkyKeys( + EvaluationResult<SkyValue> evaluateSkyKeys( final ExtendedEventHandler eventHandler, final Iterable<SkyKey> skyKeys, final boolean keepGoing) { 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..b938e5fe93 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/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 index dd0b5463dd..f2d89fbbe4 100644 --- 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 @@ -11,7 +11,6 @@ // 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; @@ -20,9 +19,10 @@ import java.io.IOException; public class MockPlatformSupport { /** Adds mocks for basic host and target platform. */ - public static void setup(MockToolsConfig mockToolsConfig) throws IOException { + public static void setup(MockToolsConfig mockToolsConfig, String platformsPath) + throws IOException { mockToolsConfig.create( - "buildenv/platforms/BUILD", + platformsPath + "/BUILD", "package(default_visibility=['//visibility:public'])", "platform(", " name = 'target_platform',", 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()); diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/RegisteredToolchainsFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/RegisteredToolchainsFunctionTest.java index 86bbf073f6..1c0f5697f1 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/RegisteredToolchainsFunctionTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/RegisteredToolchainsFunctionTest.java @@ -57,9 +57,10 @@ public class RegisteredToolchainsFunctionTest extends ToolchainTestCase { assertThatEvaluationResult(result).hasEntryThat(toolchainsKey).isNotNull(); RegisteredToolchainsValue value = result.get(toolchainsKey); - assertThat(value.registeredToolchains()).hasSize(2); + // We have two registered toolchains, and one default for c++ + assertThat(value.registeredToolchains()).hasSize(3); - DeclaredToolchainInfo registeredToolchain1 = value.registeredToolchains().get(0); + DeclaredToolchainInfo registeredToolchain1 = value.registeredToolchains().get(1); assertThat(registeredToolchain1).isNotNull(); assertThat(registeredToolchain1.toolchainType()).isEqualTo(testToolchainType); @@ -68,7 +69,7 @@ public class RegisteredToolchainsFunctionTest extends ToolchainTestCase { assertThat(registeredToolchain1.toolchainLabel()) .isEqualTo(makeLabel("//toolchain:test_toolchain_1")); - DeclaredToolchainInfo registeredToolchain2 = value.registeredToolchains().get(1); + DeclaredToolchainInfo registeredToolchain2 = value.registeredToolchains().get(2); assertThat(registeredToolchain2).isNotNull(); assertThat(registeredToolchain2.toolchainType()).isEqualTo(testToolchainType); @@ -137,7 +138,7 @@ public class RegisteredToolchainsFunctionTest extends ToolchainTestCase { requestToolchainsFromSkyframe(toolchainsKey); assertThatEvaluationResult(result).hasNoError(); assertToolchainLabels(result.get(toolchainsKey)) - .containsExactly(makeLabel("//toolchain:test_toolchain_1")); + .contains(makeLabel("//toolchain:test_toolchain_1")); // Re-write the WORKSPACE. rewriteWorkspace("register_toolchains('//toolchain:toolchain_2')"); @@ -146,7 +147,7 @@ public class RegisteredToolchainsFunctionTest extends ToolchainTestCase { result = requestToolchainsFromSkyframe(toolchainsKey); assertThatEvaluationResult(result).hasNoError(); assertToolchainLabels(result.get(toolchainsKey)) - .containsExactly(makeLabel("//toolchain:test_toolchain_2")); + .contains(makeLabel("//toolchain:test_toolchain_2")); } @Test diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/RuleContextTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/RuleContextTest.java index 5ba165b4ed..1eeec40c78 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/RuleContextTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/RuleContextTest.java @@ -18,7 +18,6 @@ import static com.google.common.truth.Truth.assertThat; import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.cmdline.Label; -import com.google.devtools.build.lib.packages.util.MockPlatformSupport; import com.google.devtools.build.lib.rules.platform.ToolchainTestCase; import org.junit.Test; import org.junit.runner.RunWith; @@ -30,7 +29,6 @@ public class RuleContextTest extends ToolchainTestCase { @Test public void testMockRuleContextHasToolchains() throws Exception { - MockPlatformSupport.setup(mockToolsConfig); mockToolsConfig.create("x/BUILD", "mock_toolchain_rule(name='x')"); useConfiguration( "--experimental_host_platform=//constraint:linux_plat", diff --git a/src/test/java/com/google/devtools/build/lib/testutil/TestRuleClassProvider.java b/src/test/java/com/google/devtools/build/lib/testutil/TestRuleClassProvider.java index e69cb7ec0a..9391aa7b4a 100644 --- a/src/test/java/com/google/devtools/build/lib/testutil/TestRuleClassProvider.java +++ b/src/test/java/com/google/devtools/build/lib/testutil/TestRuleClassProvider.java @@ -27,7 +27,6 @@ import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.MakeVariableInfo; import com.google.devtools.build.lib.analysis.PlatformConfiguration; -import com.google.devtools.build.lib.analysis.PlatformSemantics; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetFactory; import com.google.devtools.build.lib.analysis.RuleContext; @@ -151,7 +150,7 @@ public class TestRuleClassProvider { public static class MockToolchainRule implements RuleDefinition { @Override public RuleClass build(RuleClass.Builder builder, RuleDefinitionEnvironment env) { - return PlatformSemantics.platformAttributes(builder) + return builder .requiresConfigurationFragments(PlatformConfiguration.class) .addRequiredToolchains( ImmutableList.of(Label.parseAbsoluteUnchecked("//toolchain:test_toolchain"))) diff --git a/src/test/shell/integration/discard_graph_edges_test.sh b/src/test/shell/integration/discard_graph_edges_test.sh index 3259566ece..aeedbeba90 100755 --- a/src/test/shell/integration/discard_graph_edges_test.sh +++ b/src/test/shell/integration/discard_graph_edges_test.sh @@ -193,7 +193,7 @@ function test_packages_cleared() { || fail "env extension count $env_count too low: did you move/rename the class?" local ct_count="$(extract_histogram_count "$histo_file" \ 'RuleConfiguredTarget$')" - [[ "ct_count" -ge 18 ]] \ + [[ "ct_count" -ge 40 ]] \ || fail "RuleConfiguredTarget count $ct_count too low: did you move/rename the class?" local histo_file="$(prepare_histogram "$BUILD_FLAGS")" package_count="$(extract_histogram_count "$histo_file" \ diff --git a/tools/BUILD b/tools/BUILD index 61e9abc1a2..0432b126cb 100644 --- a/tools/BUILD +++ b/tools/BUILD @@ -51,7 +51,7 @@ filegroup( "//tools/jdk:package-srcs", "//tools/jdk:srcs", "//tools/launcher:srcs", - "//tools/platforms:package-srcs", + "//tools/platforms:srcs", "//tools/objc:srcs", "//tools/python:srcs", "//tools/test:srcs", diff --git a/tools/cpp/BUILD b/tools/cpp/BUILD index 1a4dc674ea..eb75333e75 100644 --- a/tools/cpp/BUILD +++ b/tools/cpp/BUILD @@ -204,3 +204,18 @@ filegroup( name = "link_dynamic_library", srcs = ["link_dynamic_library.sh"], ) + +toolchain_type(name = "toolchain_type") + +# A dummy toolchain is necessary to satisfy toolchain resolution until platforms +# are used in c++ by default. +# TODO(b/64754003): Remove once platforms are used in c++ by default. +toolchain( + name = "dummy_cc_toolchain", + toolchain = "dummy_cc_toolchain_impl", + toolchain_type = ":toolchain_type", +) + +load(":dummy_toolchain.bzl", "dummy_toolchain") + +dummy_toolchain(name = "dummy_cc_toolchain_impl") diff --git a/tools/cpp/BUILD.static b/tools/cpp/BUILD.static index 9ae4950d80..aaadc5bad8 100644 --- a/tools/cpp/BUILD.static +++ b/tools/cpp/BUILD.static @@ -115,3 +115,18 @@ filegroup( name = "link_dynamic_library", srcs = ["link_dynamic_library.sh"], ) + +toolchain_type(name = "toolchain_type") + +# A dummy toolchain is necessary to satisfy toolchain resolution until platforms +# are used in c++ by default. +# TODO(b/64754003): Remove once platforms are used in c++ by default. +toolchain( + name = "dummy_cc_toolchain", + toolchain = "dummy_cc_toolchain_impl", + toolchain_type = ":toolchain_type", +) + +load(":dummy_toolchain.bzl", "dummy_toolchain") + +dummy_toolchain(name = "dummy_cc_toolchain_impl") diff --git a/tools/cpp/BUILD.tpl b/tools/cpp/BUILD.tpl index 5ea5368c62..170fe3f91d 100644 --- a/tools/cpp/BUILD.tpl +++ b/tools/cpp/BUILD.tpl @@ -75,3 +75,18 @@ cc_toolchain( strip_files = ":empty", supports_param_files = 1, ) + +toolchain_type(name = "toolchain_type") + +# A dummy toolchain is necessary to satisfy toolchain resolution until platforms +# are used in c++ by default. +# TODO(b/64754003): Remove once platforms are used in c++ by default. +toolchain( + name = "dummy_cc_toolchain", + toolchain = "dummy_cc_toolchain_impl", + toolchain_type = ":toolchain_type", +) + +load(":dummy_toolchain.bzl", "dummy_toolchain") + +dummy_toolchain(name = "dummy_cc_toolchain_impl") diff --git a/tools/cpp/cc_configure.bzl b/tools/cpp/cc_configure.bzl index 70e2fd0ff1..9d6d29fc82 100644 --- a/tools/cpp/cc_configure.bzl +++ b/tools/cpp/cc_configure.bzl @@ -20,6 +20,8 @@ load("@bazel_tools//tools/cpp:unix_cc_configure.bzl", "configure_unix_toolchain" load("@bazel_tools//tools/cpp:lib_cc_configure.bzl", "get_cpu_value") def _impl(repository_ctx): + repository_ctx.symlink( + Label("@bazel_tools//tools/cpp:dummy_toolchain.bzl"), "dummy_toolchain.bzl") cpu_value = get_cpu_value(repository_ctx) if cpu_value == "freebsd": # This is defaulting to the static crosstool, we should eventually diff --git a/tools/cpp/dummy_toolchain.bzl b/tools/cpp/dummy_toolchain.bzl new file mode 100644 index 0000000000..c787f7315d --- /dev/null +++ b/tools/cpp/dummy_toolchain.bzl @@ -0,0 +1,23 @@ +# pylint: disable=g-bad-file-header +# 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. + +"""Skylark rule that stubs a toolchain.""" +def _dummy_toolchain_impl(ctx): + ctx = ctx # unused argument + toolchain = platform_common.ToolchainInfo() + return [toolchain] + +dummy_toolchain = rule(_dummy_toolchain_impl, attrs = {}) + diff --git a/tools/platforms/BUILD b/tools/platforms/BUILD index 4e788aea2c..1b74f106eb 100644 --- a/tools/platforms/BUILD +++ b/tools/platforms/BUILD @@ -13,3 +13,95 @@ filegroup( name = "srcs", srcs = glob(["**"]), ) + +# These match values in //src/main/java/com/google/build/lib/util:CPU.java +constraint_setting(name = "cpu") + +constraint_value( + name = "x86_32", + constraint_setting = ":cpu", +) + +constraint_value( + name = "x86_64", + constraint_setting = ":cpu", +) + +constraint_value( + name = "ppc", + constraint_setting = ":cpu", +) + +constraint_value( + name = "arm", + constraint_setting = ":cpu", +) + +constraint_value( + name = "s390x", + constraint_setting = ":cpu", +) + +# These match values in //src/main/java/com/google/build/lib/util:OS.java +constraint_setting(name = "os") + +constraint_value( + name = "osx", + constraint_setting = ":os", +) + +constraint_value( + name = "freebsd", + constraint_setting = ":os", +) + +constraint_value( + name = "linux", + constraint_setting = ":os", +) + +constraint_value( + name = "windows", + constraint_setting = ":os", +) + +# A default platform with nothing defined. +platform(name = "default_platform") + +# A default platform referring to the host system. This only exists for +# internal build configurations, and so shouldn't be accessed by other packages. +platform( + name = "host_platform", + cpu_constraints = [ + ":x86_32", + ":x86_64", + ":ppc", + ":arm", + ":s390x", + ], + host_platform = True, + os_constraints = [ + ":osx", + ":freebsd", + ":linux", + ":windows", + ], +) + +platform( + name = "target_platform", + cpu_constraints = [ + ":x86_32", + ":x86_64", + ":ppc", + ":arm", + ":s390x", + ], + os_constraints = [ + ":osx", + ":freebsd", + ":linux", + ":windows", + ], + target_platform = True, +) |