aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar John Cater <jcater@google.com>2017-05-17 16:14:02 +0200
committerGravatar Dmitry Lomov <dslomov@google.com>2017-05-19 15:07:35 +0200
commit137760bf6283473fa116041aeef4ef8bb52b9c2e (patch)
treef62f7c5578b2637dbdf00a4b4825c9032683b2e4
parent1e54a595b1abd96be76ca2b5d0a7e840ead172a3 (diff)
Adds ToolchainConstructor interface and implementations.
ToolchainConstructor is used to create instances of ToolchainInfo, for toolchain-aware rule sets. Part of #2219. Change-Id: Iae4e519b156910cc28704b3ca5b11e57dd561107 PiperOrigin-RevId: 156303854
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/platform/ToolchainInfo.java10
-rw-r--r--src/main/java/com/google/devtools/build/lib/packages/ClassObjectConstructor.java1
-rw-r--r--src/main/java/com/google/devtools/build/lib/packages/SkylarkClassObjectConstructor.java9
-rw-r--r--src/main/java/com/google/devtools/build/lib/packages/ToolchainConstructor.java26
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/platform/NativeToolchainConstructor.java37
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/platform/PlatformCommon.java64
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/platform/SkylarkToolchainConstructor.java84
-rw-r--r--src/test/java/com/google/devtools/build/lib/analysis/platform/BUILD1
-rw-r--r--src/test/java/com/google/devtools/build/lib/analysis/platform/PlatformProvidersTest.java14
-rw-r--r--src/test/java/com/google/devtools/build/lib/rules/platform/BUILD1
-rw-r--r--src/test/java/com/google/devtools/build/lib/rules/platform/PlatformCommonTest.java36
-rwxr-xr-xsrc/test/shell/bazel/toolchain_test.sh3
12 files changed, 212 insertions, 74 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/platform/ToolchainInfo.java b/src/main/java/com/google/devtools/build/lib/analysis/platform/ToolchainInfo.java
index 1e5e45f462..7c7d216ffb 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/platform/ToolchainInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/platform/ToolchainInfo.java
@@ -50,15 +50,18 @@ public class ToolchainInfo extends SkylarkClassObject {
public static final SkylarkProviderIdentifier SKYLARK_IDENTIFIER =
SkylarkProviderIdentifier.forKey(SKYLARK_CONSTRUCTOR.getKey());
+ private final ClassObjectConstructor.Key toolchainConstructorKey;
private final ImmutableList<ConstraintValueInfo> execConstraints;
private final ImmutableList<ConstraintValueInfo> targetConstraints;
public ToolchainInfo(
+ ClassObjectConstructor.Key toolchainConstructorKey,
Iterable<ConstraintValueInfo> execConstraints,
Iterable<ConstraintValueInfo> targetConstraints,
Map<String, Object> toolchainData,
Location loc) {
this(
+ toolchainConstructorKey,
ImmutableList.copyOf(execConstraints),
ImmutableList.copyOf(targetConstraints),
toolchainData,
@@ -66,6 +69,7 @@ public class ToolchainInfo extends SkylarkClassObject {
}
public ToolchainInfo(
+ ClassObjectConstructor.Key toolchainConstructorKey,
ImmutableList<ConstraintValueInfo> execConstraints,
ImmutableList<ConstraintValueInfo> targetConstraints,
Map<String, Object> toolchainData,
@@ -73,16 +77,22 @@ public class ToolchainInfo extends SkylarkClassObject {
super(
SKYLARK_CONSTRUCTOR,
ImmutableMap.<String, Object>builder()
+ .put("toolchain_type", toolchainConstructorKey)
.put("exec_compatible_with", execConstraints)
.put("target_compatible_with", targetConstraints)
.putAll(toolchainData)
.build(),
loc);
+ this.toolchainConstructorKey = toolchainConstructorKey;
this.execConstraints = execConstraints;
this.targetConstraints = targetConstraints;
}
+ public ClassObjectConstructor.Key toolchainConstructorKey() {
+ return toolchainConstructorKey;
+ }
+
@SkylarkCallable(
name = "exec_compatible_with",
doc = "The constraints on the execution platforms this toolchain supports.",
diff --git a/src/main/java/com/google/devtools/build/lib/packages/ClassObjectConstructor.java b/src/main/java/com/google/devtools/build/lib/packages/ClassObjectConstructor.java
index 8275e6a69d..9bce718d38 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/ClassObjectConstructor.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/ClassObjectConstructor.java
@@ -68,7 +68,6 @@ public abstract class ClassObjectConstructor extends BaseFunction {
super(name, signature, location);
}
-
/**
* Has this {@link ClassObjectConstructor} been exported?
* All native constructors are always exported. Skylark constructors are exported
diff --git a/src/main/java/com/google/devtools/build/lib/packages/SkylarkClassObjectConstructor.java b/src/main/java/com/google/devtools/build/lib/packages/SkylarkClassObjectConstructor.java
index 9a6605de5f..f49d118ce7 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/SkylarkClassObjectConstructor.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/SkylarkClassObjectConstructor.java
@@ -25,13 +25,12 @@ import java.util.Objects;
import javax.annotation.Nullable;
/**
- * Declared provider defined in Skylark.
+ * Declared provider defined in Skylark.
*
- * This is a result of calling {@code provider()} function from Skylark
- * ({@link com.google.devtools.build.lib.rules.SkylarkRuleClassFunctions#provider}).
+ * <p>This is a result of calling {@code provider()} function from Skylark ({@link
+ * com.google.devtools.build.lib.rules.SkylarkRuleClassFunctions#provider}).
*/
-public final class SkylarkClassObjectConstructor
- extends ClassObjectConstructor
+public class SkylarkClassObjectConstructor extends ClassObjectConstructor
implements SkylarkExportable {
private static final FunctionSignature.WithValues<Object, SkylarkType> SIGNATURE =
diff --git a/src/main/java/com/google/devtools/build/lib/packages/ToolchainConstructor.java b/src/main/java/com/google/devtools/build/lib/packages/ToolchainConstructor.java
new file mode 100644
index 0000000000..fe21f43ed0
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/packages/ToolchainConstructor.java
@@ -0,0 +1,26 @@
+// 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;
+
+import com.google.devtools.build.lib.packages.ClassObjectConstructor.Key;
+
+/**
+ * Constructor that can be used to generate toolchains. The key returned by {@link #getKey()} is a
+ * serializable representation of the constructor and serves to identify toolchains of the same
+ * type.
+ */
+public interface ToolchainConstructor {
+
+ Key getKey();
+}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/platform/NativeToolchainConstructor.java b/src/main/java/com/google/devtools/build/lib/rules/platform/NativeToolchainConstructor.java
new file mode 100644
index 0000000000..6d62b25a48
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/rules/platform/NativeToolchainConstructor.java
@@ -0,0 +1,37 @@
+// 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.rules.platform;
+
+import com.google.devtools.build.lib.packages.NativeClassObjectConstructor;
+import com.google.devtools.build.lib.packages.ToolchainConstructor;
+import com.google.devtools.build.lib.syntax.Environment;
+import com.google.devtools.build.lib.syntax.EvalException;
+import com.google.devtools.build.lib.syntax.FuncallExpression;
+import javax.annotation.Nullable;
+
+/** Native value that can be used to create toolchains. */
+public class NativeToolchainConstructor extends NativeClassObjectConstructor
+ implements ToolchainConstructor {
+
+ protected NativeToolchainConstructor(String name) {
+ super(name);
+ }
+
+ // TODO(katre): Implement this.
+ @Override
+ protected Object call(Object[] args, @Nullable FuncallExpression ast, @Nullable Environment env)
+ throws EvalException, InterruptedException {
+ throw new IllegalStateException("Native toolchains not yet implemented.");
+ }
+}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/platform/PlatformCommon.java b/src/main/java/com/google/devtools/build/lib/rules/platform/PlatformCommon.java
index 09d31c15e5..5a4a25924c 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/platform/PlatformCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/platform/PlatformCommon.java
@@ -14,24 +14,20 @@
package com.google.devtools.build.lib.rules.platform;
-import com.google.common.collect.ImmutableMap;
-import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
import com.google.devtools.build.lib.analysis.platform.ConstraintSettingInfo;
import com.google.devtools.build.lib.analysis.platform.ConstraintValueInfo;
import com.google.devtools.build.lib.analysis.platform.PlatformInfo;
import com.google.devtools.build.lib.analysis.platform.ToolchainInfo;
import com.google.devtools.build.lib.events.Location;
import com.google.devtools.build.lib.packages.ClassObjectConstructor;
+import com.google.devtools.build.lib.packages.ToolchainConstructor;
import com.google.devtools.build.lib.skylarkinterface.Param;
import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
import com.google.devtools.build.lib.skylarkinterface.SkylarkSignature;
import com.google.devtools.build.lib.syntax.BuiltinFunction;
import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.SkylarkDict;
-import com.google.devtools.build.lib.syntax.SkylarkList;
import com.google.devtools.build.lib.syntax.SkylarkSignatureProcessor;
-import com.google.devtools.build.lib.syntax.Type.ConversionException;
/** Skylark namespace used to interact with Blaze's platform APIs. */
@SkylarkModule(
@@ -77,62 +73,22 @@ public class PlatformCommon {
}
@SkylarkSignature(
- name = "toolchain",
- doc =
- "<i>(Experimental)</i> "
- + "Returns a toolchain provider that can be configured to provide rule implementations "
- + "access to needed configuration.",
+ name = "toolchain_type",
+ doc = "",
+ documented = false,
objectType = PlatformCommon.class,
- returnType = ToolchainInfo.class,
+ returnType = ToolchainConstructor.class,
parameters = {
@Param(name = "self", type = PlatformCommon.class, doc = "the platform_rules instance"),
- @Param(
- name = "exec_compatible_with",
- type = SkylarkList.class,
- generic1 = TransitiveInfoCollection.class,
- defaultValue = "[]",
- named = true,
- positional = false,
- doc = "Constraints the platform must fulfill to execute this toolchain."
- ),
- @Param(
- name = "target_compatible_with",
- type = SkylarkList.class,
- generic1 = TransitiveInfoCollection.class,
- defaultValue = "[]",
- named = true,
- positional = false,
- doc = "Constraints fulfilled by the target platform for this toolchain."
- ),
},
- extraKeywords =
- @Param(
- name = "toolchainData",
- doc = "Extra information stored for the consumer of the toolchain."
- ),
useLocation = true
)
- private static final BuiltinFunction createToolchain =
- new BuiltinFunction("toolchain") {
+ private static final BuiltinFunction createToolchainType =
+ new BuiltinFunction("toolchain_type") {
@SuppressWarnings("unchecked")
- public ToolchainInfo invoke(
- PlatformCommon self,
- SkylarkList<TransitiveInfoCollection> execCompatibleWith,
- SkylarkList<TransitiveInfoCollection> targetCompatibleWith,
- SkylarkDict<String, Object> skylarkToolchainData,
- Location loc)
- throws ConversionException, EvalException {
-
- Iterable<ConstraintValueInfo> execConstraints =
- ConstraintValue.constraintValues(execCompatibleWith);
- Iterable<ConstraintValueInfo> targetConstraints =
- ConstraintValue.constraintValues(targetCompatibleWith);
- ImmutableMap<String, Object> toolchainData =
- ImmutableMap.copyOf(
- SkylarkDict.castSkylarkDictOrNoneToDict(
- skylarkToolchainData, String.class, Object.class, "toolchainData"));
-
- return new ToolchainInfo(execConstraints, targetConstraints, toolchainData, loc);
+ public ToolchainConstructor invoke(PlatformCommon self, Location loc)
+ throws EvalException {
+ return new SkylarkToolchainConstructor(loc);
}
};
diff --git a/src/main/java/com/google/devtools/build/lib/rules/platform/SkylarkToolchainConstructor.java b/src/main/java/com/google/devtools/build/lib/rules/platform/SkylarkToolchainConstructor.java
new file mode 100644
index 0000000000..73063493eb
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/rules/platform/SkylarkToolchainConstructor.java
@@ -0,0 +1,84 @@
+// 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.rules.platform;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
+import com.google.devtools.build.lib.analysis.platform.ConstraintValueInfo;
+import com.google.devtools.build.lib.analysis.platform.ToolchainInfo;
+import com.google.devtools.build.lib.events.Location;
+import com.google.devtools.build.lib.packages.SkylarkClassObjectConstructor;
+import com.google.devtools.build.lib.packages.ToolchainConstructor;
+import com.google.devtools.build.lib.syntax.Environment;
+import com.google.devtools.build.lib.syntax.EvalException;
+import com.google.devtools.build.lib.syntax.FuncallExpression;
+import com.google.devtools.build.lib.syntax.SkylarkDict;
+import com.google.devtools.build.lib.syntax.SkylarkList;
+import java.util.Map;
+import java.util.Set;
+import javax.annotation.Nullable;
+
+/** Skylark value that can be used to create toolchains. */
+public class SkylarkToolchainConstructor extends SkylarkClassObjectConstructor
+ implements ToolchainConstructor {
+
+ private static final String EXEC_COMPATIBLE_WITH = "exec_compatible_with";
+ private static final String TARGET_COMPATIBLE_WITH = "target_compatible_with";
+
+ public SkylarkToolchainConstructor(Location location) {
+ super(
+ "<no name>", // name is set on export.
+ location);
+ }
+
+ @Override
+ @Nullable
+ protected Object call(Object[] args, @Nullable FuncallExpression ast, @Nullable Environment env)
+ throws EvalException, InterruptedException {
+
+ // Decode arguments.
+ @SuppressWarnings("unchecked")
+ SkylarkDict<String, Object> receivedArguments = (SkylarkDict<String, Object>) args[0];
+ @SuppressWarnings("unchecked")
+ Iterable<ConstraintValueInfo> execConstraints =
+ ConstraintValue.constraintValues(
+ (SkylarkList<TransitiveInfoCollection>) receivedArguments.get(EXEC_COMPATIBLE_WITH));
+ @SuppressWarnings("unchecked")
+ Iterable<ConstraintValueInfo> targetConstraints =
+ ConstraintValue.constraintValues(
+ (SkylarkList<TransitiveInfoCollection>) receivedArguments.get(TARGET_COMPATIBLE_WITH));
+ Map<String, Object> toolchainData =
+ collectData(
+ receivedArguments, ImmutableSet.of(EXEC_COMPATIBLE_WITH, TARGET_COMPATIBLE_WITH));
+ Location loc = ast != null ? ast.getLocation() : Location.BUILTIN;
+
+ return new ToolchainInfo(getKey(), execConstraints, targetConstraints, toolchainData, loc);
+ }
+
+ private Map<String, Object> collectData(
+ SkylarkDict<String, Object> receivedArguments, Set<String> ignoredKeys) {
+
+ ImmutableMap.Builder<String, Object> builder = new ImmutableMap.Builder<>();
+ for (Map.Entry<String, Object> entry : receivedArguments.entrySet()) {
+ String key = entry.getKey();
+ Object value = entry.getValue();
+ if (!ignoredKeys.contains(key)) {
+ builder.put(key, value);
+ }
+ }
+
+ return builder.build();
+ }
+}
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/platform/BUILD b/src/test/java/com/google/devtools/build/lib/analysis/platform/BUILD
index 5993fc5516..1e752eeab8 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/platform/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/analysis/platform/BUILD
@@ -11,6 +11,7 @@ java_test(
deps = [
"//src/main/java/com/google/devtools/build/lib:events",
"//src/main/java/com/google/devtools/build/lib:os_util",
+ "//src/main/java/com/google/devtools/build/lib:packages-internal",
"//src/main/java/com/google/devtools/build/lib:syntax",
"//src/main/java/com/google/devtools/build/lib:util",
"//src/main/java/com/google/devtools/build/lib/analysis/platform",
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/platform/PlatformProvidersTest.java b/src/test/java/com/google/devtools/build/lib/analysis/platform/PlatformProvidersTest.java
index 235532c2d8..35f60cd662 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/platform/PlatformProvidersTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/platform/PlatformProvidersTest.java
@@ -19,6 +19,7 @@ import com.google.common.collect.ImmutableMap;
import com.google.common.testing.EqualsTester;
import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
import com.google.devtools.build.lib.events.Location;
+import com.google.devtools.build.lib.packages.ClassObjectConstructor;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
@@ -108,6 +109,7 @@ public class PlatformProvidersTest extends BuildViewTestCase {
@Test
public void toolchainInfo_equalsTester() throws Exception {
+ ClassObjectConstructor.Key key = new ClassObjectConstructor.Key() {};
ConstraintSettingInfo setting1 = ConstraintSettingInfo.create(makeLabel("//constraint:basic"));
ConstraintSettingInfo setting2 = ConstraintSettingInfo.create(makeLabel("//constraint:other"));
@@ -122,11 +124,21 @@ public class PlatformProvidersTest extends BuildViewTestCase {
.addEqualityGroup(
// Base case.
new ToolchainInfo(
+ key,
ImmutableList.of(value1, value2),
ImmutableList.of(value1, value3),
ImmutableMap.<String, Object>of("foo", "val1", "bar", "val2"),
Location.BUILTIN),
new ToolchainInfo(
+ key,
+ ImmutableList.of(value1, value2),
+ ImmutableList.of(value1, value3),
+ ImmutableMap.<String, Object>of("foo", "val1", "bar", "val2"),
+ Location.BUILTIN))
+ .addEqualityGroup(
+ // Different type.
+ new ToolchainInfo(
+ new ClassObjectConstructor.Key() {},
ImmutableList.of(value1, value2),
ImmutableList.of(value1, value3),
ImmutableMap.<String, Object>of("foo", "val1", "bar", "val2"),
@@ -134,6 +146,7 @@ public class PlatformProvidersTest extends BuildViewTestCase {
.addEqualityGroup(
// Different target constraints.
new ToolchainInfo(
+ key,
ImmutableList.of(value1, value2),
ImmutableList.of(value1, value2),
ImmutableMap.<String, Object>of("foo", "val1", "bar", "val2"),
@@ -141,6 +154,7 @@ public class PlatformProvidersTest extends BuildViewTestCase {
.addEqualityGroup(
// Different data.
new ToolchainInfo(
+ key,
ImmutableList.of(value1, value2),
ImmutableList.of(value1, value3),
ImmutableMap.<String, Object>of("foo", "val1", "bar", "val3"),
diff --git a/src/test/java/com/google/devtools/build/lib/rules/platform/BUILD b/src/test/java/com/google/devtools/build/lib/rules/platform/BUILD
index daf896eea9..981b5b15f2 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/platform/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/rules/platform/BUILD
@@ -11,6 +11,7 @@ java_test(
deps = [
"//src/main/java/com/google/devtools/build/lib:build-base",
"//src/main/java/com/google/devtools/build/lib:os_util",
+ "//src/main/java/com/google/devtools/build/lib:packages-internal",
"//src/main/java/com/google/devtools/build/lib:syntax",
"//src/main/java/com/google/devtools/build/lib:util",
"//src/main/java/com/google/devtools/build/lib/analysis/platform",
diff --git a/src/test/java/com/google/devtools/build/lib/rules/platform/PlatformCommonTest.java b/src/test/java/com/google/devtools/build/lib/rules/platform/PlatformCommonTest.java
index f3cd8255b1..dc04069f97 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/platform/PlatformCommonTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/platform/PlatformCommonTest.java
@@ -17,11 +17,11 @@ package com.google.devtools.build.lib.rules.platform;
import static com.google.common.truth.Truth.assertThat;
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
-import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
import com.google.devtools.build.lib.analysis.platform.ConstraintSettingInfo;
import com.google.devtools.build.lib.analysis.platform.ConstraintValueInfo;
+import com.google.devtools.build.lib.analysis.platform.ToolchainInfo;
+import com.google.devtools.build.lib.packages.SkylarkClassObjectConstructor;
import com.google.devtools.build.lib.skylark.util.SkylarkTestCase;
-import java.util.List;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
@@ -31,20 +31,21 @@ import org.junit.runners.JUnit4;
public class PlatformCommonTest extends SkylarkTestCase {
@Test
- public void testCreateToolchain() throws Exception {
+ public void testCreateToolchainType() throws Exception {
scratch.file(
- "test/toolchain.bzl",
+ "test/toolchain_type.bzl",
+ "test_toolchain_type = platform_common.toolchain_type()",
"def _impl(ctx):",
- " return platform_common.toolchain(",
+ " toolchain = test_toolchain_type(",
" exec_compatible_with = ctx.attr.exec_compatible_with,",
" target_compatible_with = ctx.attr.target_compatible_with,",
" extra_label = ctx.attr.extra_label,",
" extra_str = ctx.attr.extra_str,",
" )",
+ " return [toolchain]",
"test_toolchain = rule(",
" implementation = _impl,",
" attrs = {",
- " 'runs': attr.label_list(allow_files=True),",
" 'exec_compatible_with': attr.label_list(",
" providers = [platform_common.ConstraintValueInfo]),",
" 'target_compatible_with': attr.label_list(",
@@ -55,7 +56,7 @@ public class PlatformCommonTest extends SkylarkTestCase {
")");
scratch.file(
"test/BUILD",
- "load(':toolchain.bzl', 'test_toolchain')",
+ "load(':toolchain_type.bzl', 'test_toolchain')",
"constraint_setting(name = 'os')",
"constraint_value(name = 'linux',",
" constraint_setting = ':os')",
@@ -73,20 +74,29 @@ public class PlatformCommonTest extends SkylarkTestCase {
" extra_label = ':dep_rule',",
" extra_str = 'bar',",
")");
- TransitiveInfoCollection toolchainProvider = getConfiguredTarget("//test:linux_toolchain");
- assertThat(toolchainProvider).isNotNull();
- assertThat((List<?>) toolchainProvider.get("exec_compatible_with"))
+ ConfiguredTarget configuredTarget = getConfiguredTarget("//test:linux_toolchain");
+ ToolchainInfo toolchainInfo =
+ (ToolchainInfo) configuredTarget.get(ToolchainInfo.SKYLARK_IDENTIFIER);
+ assertThat(toolchainInfo).isNotNull();
+
+ assertThat(toolchainInfo.toolchainConstructorKey()).isNotNull();
+ assertThat(toolchainInfo.toolchainConstructorKey())
+ .isEqualTo(
+ new SkylarkClassObjectConstructor.SkylarkKey(
+ makeLabel("//test:toolchain_type.bzl"), "test_toolchain_type"));
+
+ assertThat(toolchainInfo.execConstraints())
.containsExactly(
ConstraintValueInfo.create(
ConstraintSettingInfo.create(makeLabel("//test:os")), makeLabel("//test:linux")));
- assertThat((List<?>) toolchainProvider.get("target_compatible_with"))
+ assertThat(toolchainInfo.targetConstraints())
.containsExactly(
ConstraintValueInfo.create(
ConstraintSettingInfo.create(makeLabel("//test:os")), makeLabel("//test:mac")));
- assertThat(((ConfiguredTarget) toolchainProvider.get("extra_label")).getLabel())
+ assertThat(((ConfiguredTarget) toolchainInfo.getValue("extra_label")).getLabel())
.isEqualTo(makeLabel("//test:dep_rule"));
- assertThat(toolchainProvider.get("extra_str")).isEqualTo("bar");
+ assertThat(toolchainInfo.getValue("extra_str")).isEqualTo("bar");
}
}
diff --git a/src/test/shell/bazel/toolchain_test.sh b/src/test/shell/bazel/toolchain_test.sh
index 389c12ba23..51c3482aef 100755
--- a/src/test/shell/bazel/toolchain_test.sh
+++ b/src/test/shell/bazel/toolchain_test.sh
@@ -62,8 +62,9 @@ function test_toolchain_rule() {
mkdir -p toolchain
cat >> toolchain/toolchain.bzl <<EOF
+test_toolchain_type = platform_common.toolchain_type()
def _test_toolchain_impl(ctx):
- toolchain = platform_common.toolchain(
+ toolchain = test_toolchain_type(
exec_compatible_with = ctx.attr.exec_compatible_with,
target_compatible_with = ctx.attr.target_compatible_with,
extra_label = ctx.attr.extra_label,