diff options
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, |