buildifier: decouple runner scripts from binaries (#1398)
This change aims at making `buildtools/buildifier` more modular and
easier to consume by enabling use of prebuilt binaries without pulling
in unnecessary dependencies - while strengthening upstream as the
authoritative home for runner script templates.
Today, `buildifier/BUILD.bazel` exposes two different sets of rules:
- exports for runner script templates (`runner.bash.template`,
`runner.bat.template`) as well as `README.md`,
- `go` build & `sh` test rules which require external repos (`rules_go`,
`rules_shell`) even for consumers who don't need to build the
`buildifier` binary.
It is worth noticing there are two distinct community efforts on runner
scripts, the present/upstream `bazelbuild/buildtools` and the derived
`keith/buildifier-prebuilt` (Bazel Central Registry module).
These drift apart over time, leading to unsynchronized contents
(`factory.bzl`, `runner.bash.template`) and efforts, e.g. on Windows
support:
- https://github.com/bazelbuild/buildtools/pull/1230
- https://github.com/keith/buildifier-prebuilt/pull/89 (open for a year)
Intended benefits of this change:
- decoupling: by moving `go_binary` and `sh_test` targets into
`buildifier/cmd`, the top-level `buildifier/BUILD.bazel` no longer
requires `rules_go` nor `rules_shell`,
- flexibility: users can either build binaries from source (via
`//buildifier/cmd`) or configure rules to use prebuilt binaries (e.g.
via `multitool`) while still consuming the same upstream runner script
templates,
- backward compatibility: aliases keep `//buildifier:buildifier*`
working by delegating to `//buildifier/cmd:buildifier*`.
diff --git a/.bazelci/presubmit.yml b/.bazelci/presubmit.yml
index d92f478..77bd379 100644
--- a/.bazelci/presubmit.yml
+++ b/.bazelci/presubmit.yml
@@ -23,4 +23,4 @@
- "//:tests"
- "-//warn/docs:docs_test"
- "-//build:build_test"
- - "-//buildifier:buildifier_integration_test"
+ - "-//buildifier/cmd:buildifier_integration_test"
diff --git a/BUILD.bazel b/BUILD.bazel
index bc2fc5a..80bb532 100644
--- a/BUILD.bazel
+++ b/BUILD.bazel
@@ -23,7 +23,7 @@
"//api_proto:api.gen.pb.go_checkshtest",
"//build:build_test",
"//build_proto:build.gen.pb.go_checkshtest",
- "//buildifier:buildifier_integration_test",
+ "//buildifier/cmd:buildifier_integration_test",
"//deps_proto:deps.gen.pb.go_checkshtest",
"//edit:edit_test",
"//extra_actions_base_proto:extra_actions_base.gen.pb.go_checkshtest",
diff --git a/buildifier/BUILD.bazel b/buildifier/BUILD.bazel
index 5bf6338..3a282f2 100644
--- a/buildifier/BUILD.bazel
+++ b/buildifier/BUILD.bazel
@@ -1,123 +1,19 @@
-load("@io_bazel_rules_go//go:def.bzl", "go_binary", "go_library")
-load("@rules_shell//shell:sh_test.bzl", "sh_test")
-
-go_binary(
- name = "buildifier",
- embed = [":buildifier_lib"],
+# Keep earlier public labels working by pointing to the new `cmd` subpackage
+[alias(
+ name = name,
+ actual = "//buildifier/cmd:{}".format(name),
visibility = ["//visibility:public"],
-)
-
-go_binary(
- name = "buildifier-darwin-amd64",
- out = "buildifier-darwin_amd64",
- embed = [":buildifier_lib"],
- goarch = "amd64",
- goos = "darwin",
- pure = "on",
- visibility = ["//visibility:public"],
-)
-
-go_binary(
- name = "buildifier-linux-amd64",
- out = "buildifier-linux_amd64",
- embed = [":buildifier_lib"],
- goarch = "amd64",
- goos = "linux",
- pure = "on",
- visibility = ["//visibility:public"],
-)
-
-go_binary(
- name = "buildifier-windows-amd64",
- out = "buildifier-windows_amd64.exe",
- embed = [":buildifier_lib"],
- goarch = "amd64",
- goos = "windows",
- pure = "on",
- visibility = ["//visibility:public"],
-)
-
-go_binary(
- name = "buildifier-darwin-arm64",
- out = "buildifier-darwin_arm64",
- embed = [":buildifier_lib"],
- goarch = "arm64",
- goos = "darwin",
- pure = "on",
- visibility = ["//visibility:public"],
-)
-
-go_binary(
- name = "buildifier-linux-arm64",
- out = "buildifier-linux_arm64",
- embed = [":buildifier_lib"],
- goarch = "arm64",
- goos = "linux",
- pure = "on",
- visibility = ["//visibility:public"],
-)
-
-go_binary(
- name = "buildifier-windows-arm64",
- out = "buildifier-windows_arm64.exe",
- embed = [":buildifier_lib"],
- goarch = "arm64",
- goos = "windows",
- pure = "on",
- visibility = ["//visibility:public"],
-)
-
-go_binary(
- name = "buildifier-linux-riscv64",
- out = "buildifier-linux_riscv64",
- embed = [":buildifier_lib"],
- goarch = "riscv64",
- goos = "linux",
- pure = "on",
- visibility = ["//visibility:public"],
-)
-
-go_binary(
- name = "buildifier-linux-s390x",
- out = "buildifier-linux_s390x",
- embed = [":buildifier_lib"],
- goarch = "s390x",
- goos = "linux",
- pure = "on",
- visibility = ["//visibility:public"],
-)
-
-# Test that the buildifier binary works
-sh_test(
- name = "buildifier_integration_test",
- size = "small",
- srcs = ["integration_test.sh"],
- args = [
- "$(location :buildifier)",
- ],
- data = [
- ":buildifier",
- ],
- deps = ["@bazel_tools//tools/bash/runfiles"],
-)
-
-go_library(
- name = "buildifier_lib",
- srcs = ["buildifier.go"],
- importpath = "github.com/bazelbuild/buildtools/buildifier",
- visibility = ["//visibility:private"],
- x_defs = {
- "main.buildVersion": "{STABLE_buildVersion}",
- "main.buildScmRevision": "{STABLE_buildScmRevision}",
- },
- deps = [
- "//build",
- "//buildifier/config",
- "//buildifier/utils",
- "//differ",
- "//wspace",
- ],
-)
+) for name in (
+ "buildifier",
+ "buildifier-darwin-amd64",
+ "buildifier-darwin-arm64",
+ "buildifier-linux-amd64",
+ "buildifier-linux-arm64",
+ "buildifier-linux-riscv64",
+ "buildifier-linux-s390x",
+ "buildifier-windows-amd64",
+ "buildifier-windows-arm64",
+)]
exports_files(
[
diff --git a/buildifier/cmd/BUILD.bazel b/buildifier/cmd/BUILD.bazel
new file mode 100644
index 0000000..6b303e2
--- /dev/null
+++ b/buildifier/cmd/BUILD.bazel
@@ -0,0 +1,120 @@
+load("@io_bazel_rules_go//go:def.bzl", "go_binary", "go_library")
+load("@rules_shell//shell:sh_test.bzl", "sh_test")
+
+go_binary(
+ name = "buildifier",
+ embed = [":buildifier_lib"],
+ visibility = ["//visibility:public"],
+)
+
+go_binary(
+ name = "buildifier-darwin-amd64",
+ out = "buildifier-darwin_amd64",
+ embed = [":buildifier_lib"],
+ goarch = "amd64",
+ goos = "darwin",
+ pure = "on",
+ visibility = ["//visibility:public"],
+)
+
+go_binary(
+ name = "buildifier-linux-amd64",
+ out = "buildifier-linux_amd64",
+ embed = [":buildifier_lib"],
+ goarch = "amd64",
+ goos = "linux",
+ pure = "on",
+ visibility = ["//visibility:public"],
+)
+
+go_binary(
+ name = "buildifier-windows-amd64",
+ out = "buildifier-windows_amd64.exe",
+ embed = [":buildifier_lib"],
+ goarch = "amd64",
+ goos = "windows",
+ pure = "on",
+ visibility = ["//visibility:public"],
+)
+
+go_binary(
+ name = "buildifier-darwin-arm64",
+ out = "buildifier-darwin_arm64",
+ embed = [":buildifier_lib"],
+ goarch = "arm64",
+ goos = "darwin",
+ pure = "on",
+ visibility = ["//visibility:public"],
+)
+
+go_binary(
+ name = "buildifier-linux-arm64",
+ out = "buildifier-linux_arm64",
+ embed = [":buildifier_lib"],
+ goarch = "arm64",
+ goos = "linux",
+ pure = "on",
+ visibility = ["//visibility:public"],
+)
+
+go_binary(
+ name = "buildifier-windows-arm64",
+ out = "buildifier-windows_arm64.exe",
+ embed = [":buildifier_lib"],
+ goarch = "arm64",
+ goos = "windows",
+ pure = "on",
+ visibility = ["//visibility:public"],
+)
+
+go_binary(
+ name = "buildifier-linux-riscv64",
+ out = "buildifier-linux_riscv64",
+ embed = [":buildifier_lib"],
+ goarch = "riscv64",
+ goos = "linux",
+ pure = "on",
+ visibility = ["//visibility:public"],
+)
+
+go_binary(
+ name = "buildifier-linux-s390x",
+ out = "buildifier-linux_s390x",
+ embed = [":buildifier_lib"],
+ goarch = "s390x",
+ goos = "linux",
+ pure = "on",
+ visibility = ["//visibility:public"],
+)
+
+# Test that the buildifier binary works
+sh_test(
+ name = "buildifier_integration_test",
+ size = "small",
+ srcs = ["integration_test.sh"],
+ args = [
+ "$(location :buildifier)",
+ ],
+ data = [
+ ":buildifier",
+ ],
+ deps = ["@bazel_tools//tools/bash/runfiles"],
+)
+
+go_library(
+ name = "buildifier_lib",
+ srcs = ["buildifier.go"],
+ importpath = "github.com/bazelbuild/buildtools/buildifier",
+ visibility = ["//visibility:private"],
+ x_defs = {
+ "main.buildVersion": "{STABLE_buildVersion}",
+ "main.buildScmRevision": "{STABLE_buildScmRevision}",
+ },
+ deps = [
+ "//build",
+ "//buildifier/config",
+ "//buildifier/utils",
+ "//differ",
+ "//wspace",
+ ],
+)
diff --git a/buildifier/buildifier.go b/buildifier/cmd/buildifier.go
similarity index 100%
rename from buildifier/buildifier.go
rename to buildifier/cmd/buildifier.go
diff --git a/buildifier/integration_test.sh b/buildifier/cmd/integration_test.sh
similarity index 100%
rename from buildifier/integration_test.sh
rename to buildifier/cmd/integration_test.sh
diff --git a/buildifier/config/BUILD.bazel b/buildifier/config/BUILD.bazel
index 070d756..9254f83 100644
--- a/buildifier/config/BUILD.bazel
+++ b/buildifier/config/BUILD.bazel
@@ -7,7 +7,7 @@
"validation.go",
],
importpath = "github.com/bazelbuild/buildtools/buildifier/config",
- visibility = ["//buildifier:__pkg__"],
+ visibility = ["//buildifier/cmd:__pkg__"],
deps = [
"//tables",
"//warn",