diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 167f9d0..121a8d0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -34,6 +34,8 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: bazelisk test //:all_integration_tests + - name: Run with extra exec platforms + run: bazelisk run //:buildifier --extra_execution_platforms="//:non_host_platform,@platforms//host" '--' -help example_simple: strategy: diff --git a/BUILD b/BUILD index a498a8f..fcda4a6 100644 --- a/BUILD +++ b/BUILD @@ -58,6 +58,15 @@ alias( # MARK: - Integration Test +# A platform used for tests that must not match the host platform +platform( + name = "non_host_platform", + constraint_values = [ + "@platforms//os:linux", + "@platforms//cpu:riscv64", + ], +) + filegroup( name = "local_repository_files", srcs = [ diff --git a/MODULE.bazel b/MODULE.bazel index eb955b5..adc4c59 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -4,6 +4,7 @@ module( compatibility_level = 1, ) +bazel_dep(name = "bazel_features", version = "1.45.0") bazel_dep(name = "bazel_skylib", version = "1.3.0") bazel_dep(name = "platforms", version = "0.0.11") bazel_dep(name = "rules_shell", version = "0.6.1") diff --git a/buildifier/buildifier_binary.bzl b/buildifier/buildifier_binary.bzl index 6bd8640..8213df8 100644 --- a/buildifier/buildifier_binary.bzl +++ b/buildifier/buildifier_binary.bzl @@ -2,6 +2,7 @@ Simple rule for running buildifier from the toolchain config """ +load("@bazel_features//:features.bzl", "bazel_features") load("@platforms//host:constraints.bzl", "HOST_CONSTRAINTS") def _buildifier_binary(ctx): @@ -22,8 +23,11 @@ def _buildifier_binary(ctx): buildifier_binary = rule( implementation = _buildifier_binary, - attrs = {}, - exec_compatible_with = HOST_CONSTRAINTS, - toolchains = ["@buildifier_prebuilt//buildifier:toolchain"], + exec_compatible_with = [] if bazel_features.toolchains.has_default_test_toolchain_type else HOST_CONSTRAINTS, + toolchains = [ + "@buildifier_prebuilt//buildifier:toolchain", + ] + ([ + "@bazel_tools//tools/test:default_test_toolchain_type", + ] if bazel_features.toolchains.has_default_test_toolchain_type else []), executable = True, ) diff --git a/buildifier/factory.bzl b/buildifier/factory.bzl index 40978bc..d8d8bc3 100644 --- a/buildifier/factory.bzl +++ b/buildifier/factory.bzl @@ -142,7 +142,10 @@ def buildifier_impl_factory(ctx, *, test_rule): fail("Cannot use 'no_sandbox' without a 'workspace'") workspace = ctx.file.workspace.path - toolchain = ctx.toolchains["@buildifier_prebuilt//buildifier:toolchain"] + if test_rule: + toolchain = ctx.exec_groups["test"].toolchains["@buildifier_prebuilt//buildifier:toolchain"] + else: + toolchain = ctx.toolchains["@buildifier_prebuilt//buildifier:toolchain"] buildifier = toolchain._tool runner = toolchain._runner diff --git a/buildozer/buildozer_binary.bzl b/buildozer/buildozer_binary.bzl index d6e72bc..25c56e6 100644 --- a/buildozer/buildozer_binary.bzl +++ b/buildozer/buildozer_binary.bzl @@ -2,6 +2,7 @@ Simple rule for running buildozer from the toolchain config """ +load("@bazel_features//:features.bzl", "bazel_features") load("@platforms//host:constraints.bzl", "HOST_CONSTRAINTS") def _buildozer_binary(ctx): @@ -22,8 +23,11 @@ def _buildozer_binary(ctx): buildozer_binary = rule( implementation = _buildozer_binary, - attrs = {}, - exec_compatible_with = HOST_CONSTRAINTS, - toolchains = ["@buildifier_prebuilt//buildozer:toolchain"], + exec_compatible_with = [] if bazel_features.toolchains.has_default_test_toolchain_type else HOST_CONSTRAINTS, + toolchains = [ + "@buildifier_prebuilt//buildozer:toolchain", + ] + ([ + "@bazel_tools//tools/test:default_test_toolchain_type", + ] if bazel_features.toolchains.has_default_test_toolchain_type else []), executable = True, ) diff --git a/deps.bzl b/deps.bzl index c9718ed..334e14e 100644 --- a/deps.bzl +++ b/deps.bzl @@ -23,3 +23,11 @@ def buildifier_prebuilt_deps(): strip_prefix = "rules_shell-0.6.1", url = "https://github.com/bazelbuild/rules_shell/releases/download/v0.6.1/rules_shell-v0.6.1.tar.gz", ) + + maybe( + http_archive, + name = "bazel_features", + sha256 = "adfdb3cffab3a99a63363d844d559a81965d2b61a6062dd51a3d2478d416768f", + strip_prefix = "bazel_features-1.45.0", + url = "https://github.com/bazel-contrib/bazel_features/releases/download/v1.45.0/bazel_features-v1.45.0.tar.gz", + ) diff --git a/examples/simple/WORKSPACE b/examples/simple/WORKSPACE index 844ee8f..f7a4cf9 100644 --- a/examples/simple/WORKSPACE +++ b/examples/simple/WORKSPACE @@ -9,6 +9,10 @@ load("@buildifier_prebuilt//:deps.bzl", "buildifier_prebuilt_deps") buildifier_prebuilt_deps() +load("@bazel_features//:deps.bzl", "bazel_features_deps") + +bazel_features_deps() + load("@bazel_skylib//:workspace.bzl", "bazel_skylib_workspace") bazel_skylib_workspace() diff --git a/examples/specify_assets/WORKSPACE b/examples/specify_assets/WORKSPACE index 7917008..03ddbb6 100644 --- a/examples/specify_assets/WORKSPACE +++ b/examples/specify_assets/WORKSPACE @@ -9,6 +9,10 @@ load("@buildifier_prebuilt//:deps.bzl", "buildifier_prebuilt_deps") buildifier_prebuilt_deps() +load("@bazel_features//:deps.bzl", "bazel_features_deps") + +bazel_features_deps() + load("@bazel_skylib//:workspace.bzl", "bazel_skylib_workspace") bazel_skylib_workspace() diff --git a/rules.bzl b/rules.bzl index 281d10c..a058da4 100644 --- a/rules.bzl +++ b/rules.bzl @@ -2,6 +2,7 @@ Rules to use the prebuilt buildifier / buildozer binaries """ +load("@bazel_features//:features.bzl", "bazel_features") load("@platforms//host:constraints.bzl", "HOST_CONSTRAINTS") load("//buildifier:buildifier_binary.bzl", _buildifier_binary = "buildifier_binary") load( @@ -20,8 +21,12 @@ def _buildifier_impl(ctx): buildifier = rule( implementation = _buildifier_impl, attrs = buildifier_attr_factory(test_rule = False), - exec_compatible_with = HOST_CONSTRAINTS, - toolchains = ["@buildifier_prebuilt//buildifier:toolchain"], + exec_compatible_with = [] if bazel_features.toolchains.has_default_test_toolchain_type else HOST_CONSTRAINTS, + toolchains = [ + "@buildifier_prebuilt//buildifier:toolchain", + ] + ([ + "@bazel_tools//tools/test:default_test_toolchain_type", + ] if bazel_features.toolchains.has_default_test_toolchain_type else []), executable = True, ) @@ -32,7 +37,15 @@ _buildifier_test = rule( implementation = _buildifier_test_impl, attrs = buildifier_attr_factory(test_rule = True), exec_compatible_with = HOST_CONSTRAINTS, - toolchains = ["@buildifier_prebuilt//buildifier:toolchain"], + exec_groups = { + "test": exec_group( + toolchains = [ + "@buildifier_prebuilt//buildifier:toolchain", + ] + ([ + "@bazel_tools//tools/test:default_test_toolchain_type", + ] if bazel_features.toolchains.has_default_test_toolchain_type else []), + ), + }, test = True, )