Skip to content

bazel: enforce graft visibility with gazelle defaults#5304

Merged
ARR4N merged 2 commits intomasterfrom
arr4n/bazel-graft-visibility
Apr 27, 2026
Merged

bazel: enforce graft visibility with gazelle defaults#5304
ARR4N merged 2 commits intomasterfrom
arr4n/bazel-graft-visibility

Conversation

@ARR4N
Copy link
Copy Markdown
Contributor

@ARR4N ARR4N commented Apr 21, 2026

Why this should be merged

Enforces sub-directory visibility through the build system instead of relying on the CI linter.

How this works

graft/{coreth,subnet-evm}/BUILD.bazel define external_consumers targets and include Gazelle directives to set default_visibility to said target as well as the respective __subpackages__ (i.e. sub-directories). The root BUILD.bazel file is updated to use a gazelle binary that understands the directives.

How this was tested

CI still builds despite the removal of the //visibility:public attributes across all other files, meaning that dependent targets are still allowed. No negative test performed as inspection is sufficient and this is a non-critical change.

Need to be documented in RELEASES.md?

No

@maru-ava maru-ava force-pushed the arr4n/bazel-graft-visibility branch from 12e4e16 to 78d4c5b Compare April 21, 2026 15:51
@ARR4N ARR4N marked this pull request as ready for review April 21, 2026 15:52
@ARR4N ARR4N requested review from a team as code owners April 21, 2026 15:52
@ARR4N ARR4N enabled auto-merge April 21, 2026 15:53
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR shifts graft/coreth and graft/subnet-evm Bazel visibility enforcement from “public everywhere + CI linting” to Bazel-native package visibility defaults, backed by Gazelle directives and a Gazelle binary extended with the visibility language.

Changes:

  • Introduces external_consumers package_groups in graft/coreth and graft/subnet-evm and sets Gazelle default_visibility accordingly.
  • Replaces many per-target visibility = ["//visibility:public"] settings with package(default_visibility = [...]) scoped to graft subpackages + allowed external consumers.
  • Updates the repo root gazelle / gazelle_test to use a custom gazelle_binary that includes the visibility language extension.

Reviewed changes

Copilot reviewed 172 out of 172 changed files in this pull request and generated no comments.

Show a summary per file
File Description
BUILD.bazel Configure a custom gazelle_binary with the visibility language and use it for gazelle + gazelle_test.
graft/subnet-evm/BUILD.bazel Add Gazelle default_visibility, set package default visibility, and define external_consumers package group.
graft/coreth/BUILD.bazel Add Gazelle default_visibility, set package default visibility, and define external_consumers package group.
graft/subnet-evm/warp/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/subnet-evm/warp/messages/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/subnet-evm/warp/warptest/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/subnet-evm/tests/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/subnet-evm/tests/utils/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/subnet-evm/tests/warp/BUILD.bazel Set package default visibility (test target inherits package visibility).
graft/subnet-evm/tests/load/BUILD.bazel Set package default visibility (test target inherits package visibility).
graft/subnet-evm/tests/antithesis/BUILD.bazel Set package default visibility and remove per-target public visibility for binaries.
graft/subnet-evm/tests/antithesis/gencomposeconfig/BUILD.bazel Set package default visibility and remove per-target public visibility for binaries.
graft/subnet-evm/stateupgrade/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/subnet-evm/precompile/registry/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/subnet-evm/precompile/precompiletest/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/subnet-evm/precompile/precompileconfig/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/subnet-evm/precompile/modules/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/subnet-evm/precompile/contract/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/subnet-evm/precompile/allowlist/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/subnet-evm/precompile/allowlist/allowlisttest/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/subnet-evm/precompile/allowlist/allowlisttest/bindings/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/subnet-evm/precompile/contracts/warp/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/subnet-evm/precompile/contracts/warp/warpbindings/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/subnet-evm/precompile/contracts/warp/warptest/bindings/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/subnet-evm/precompile/contracts/utilstest/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/subnet-evm/precompile/contracts/txallowlist/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/subnet-evm/precompile/contracts/rewardmanager/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/subnet-evm/precompile/contracts/rewardmanager/rewardmanagertest/bindings/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/subnet-evm/precompile/contracts/nativeminter/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/subnet-evm/precompile/contracts/nativeminter/nativemintertest/bindings/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/subnet-evm/precompile/contracts/feemanager/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/subnet-evm/precompile/contracts/feemanager/feemanagertest/bindings/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/subnet-evm/precompile/contracts/deployerallowlist/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/subnet-evm/precompile/contracts/acp224feemanager/acp224feemanagertest/bindings/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/subnet-evm/plugin/BUILD.bazel Set package default visibility and remove per-target public visibility for binary.
graft/subnet-evm/plugin/runner/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/subnet-evm/plugin/evm/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/subnet-evm/plugin/evm/client/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/subnet-evm/plugin/evm/config/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/subnet-evm/plugin/evm/customheader/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/subnet-evm/plugin/evm/customtypes/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/subnet-evm/plugin/evm/extension/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/subnet-evm/plugin/evm/log/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/subnet-evm/plugin/evm/blockgascost/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/subnet-evm/plugin/evm/vmerrors/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/subnet-evm/plugin/evm/upgrade/legacy/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/subnet-evm/plugin/evm/upgrade/subnetevm/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/subnet-evm/plugin/evm/tempextrastest/BUILD.bazel Set package default visibility (test target inherits package visibility).
graft/subnet-evm/params/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/subnet-evm/params/extras/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/subnet-evm/params/extras/extrastest/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/subnet-evm/params/paramstest/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/subnet-evm/node/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/subnet-evm/network/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/subnet-evm/network/peertest/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/subnet-evm/miner/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/subnet-evm/eth/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/subnet-evm/eth/ethconfig/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/subnet-evm/eth/filters/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/subnet-evm/eth/gasprice/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/subnet-evm/eth/gasestimator/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/subnet-evm/eth/tracers/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/subnet-evm/ethclient/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/subnet-evm/ethclient/simulated/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/subnet-evm/ethclient/subnetevmclient/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/subnet-evm/examples/sign-uptime-message/BUILD.bazel Set package default visibility and remove per-target public visibility for binary.
graft/subnet-evm/interfaces/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/subnet-evm/accounts/abi/bind/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/subnet-evm/accounts/abi/bind/backends/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/subnet-evm/accounts/abi/bind/precompilebind/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/subnet-evm/accounts/abi/bind/precompilebind/templatetest/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/subnet-evm/cmd/precompilegen/BUILD.bazel Set package default visibility and remove per-target public visibility for binary.
graft/subnet-evm/cmd/simulator/config/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/subnet-evm/cmd/simulator/key/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/subnet-evm/cmd/simulator/load/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/subnet-evm/cmd/simulator/metrics/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/subnet-evm/cmd/simulator/txs/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/subnet-evm/cmd/simulator/main/BUILD.bazel Set package default visibility and remove per-target public visibility for binary.
graft/coreth/warp/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/coreth/warp/warptest/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/coreth/tests/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/coreth/tests/utils/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/coreth/tests/warp/BUILD.bazel Set package default visibility (test target inherits package visibility).
graft/coreth/precompile/registry/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/coreth/precompile/precompiletest/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/coreth/precompile/precompileconfig/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/coreth/precompile/modules/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/coreth/precompile/contracts/warp/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/coreth/precompile/contracts/warp/warpbindings/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/coreth/precompile/contract/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/coreth/plugin/BUILD.bazel Set package default visibility and remove per-target public visibility for binary.
graft/coreth/plugin/factory/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/coreth/plugin/evm/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/coreth/plugin/evm/vmtest/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/coreth/plugin/evm/vmerrors/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/coreth/plugin/evm/atomic/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/coreth/plugin/evm/atomic/atomictest/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/coreth/plugin/evm/atomic/state/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/coreth/plugin/evm/atomic/sync/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/coreth/plugin/evm/atomic/txpool/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/coreth/plugin/evm/atomic/vm/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/coreth/plugin/evm/upgrade/ap0/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/coreth/plugin/evm/upgrade/ap1/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/coreth/plugin/evm/upgrade/ap3/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/coreth/plugin/evm/upgrade/ap4/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/coreth/plugin/evm/upgrade/ap5/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/coreth/plugin/evm/upgrade/cortina/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/coreth/plugin/evm/upgrade/etna/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/coreth/plugin/evm/tempextrastest/BUILD.bazel Set package default visibility (test target inherits package visibility).
graft/coreth/plugin/evm/log/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/coreth/plugin/evm/extension/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/coreth/plugin/evm/customtypes/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/coreth/plugin/evm/customheader/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/coreth/plugin/evm/config/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/coreth/plugin/evm/client/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/coreth/accounts/abi/bind/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/coreth/accounts/abi/bind/backends/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/coreth/interfaces/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/coreth/ethclient/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/coreth/ethclient/corethclient/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/coreth/ethclient/simulated/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/coreth/eth/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/coreth/eth/ethconfig/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/coreth/eth/filters/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/coreth/eth/gasprice/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/coreth/eth/gasestimator/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/coreth/eth/tracers/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/coreth/core/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/coreth/core/coretest/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/coreth/core/extstate/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/coreth/core/txpool/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/coreth/core/txpool/blobpool/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/coreth/core/txpool/legacypool/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/coreth/core/vm/runtime/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/coreth/consensus/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/coreth/consensus/dummy/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/coreth/node/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/coreth/network/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/coreth/miner/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/coreth/nativeasset/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/coreth/params/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/coreth/params/extras/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/coreth/params/extras/extrastest/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/coreth/params/paramstest/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/coreth/cmd/simulator/config/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/coreth/cmd/simulator/key/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/coreth/cmd/simulator/load/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/coreth/cmd/simulator/metrics/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/coreth/cmd/simulator/txs/BUILD.bazel Set package default visibility and remove per-target public visibility.
graft/coreth/cmd/simulator/main/BUILD.bazel Set package default visibility and remove per-target public visibility for binary.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Copy link
Copy Markdown
Contributor

@JonathanOppenheimer JonathanOppenheimer left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I validated that all of these, besides the top level `BUILD.bazel' files just move the visibility (the top level ones define the binary).

(my understanding, correct me if I'm wrong)

This prevents other Bazel targets from depending on the graft Bazel targets (which is what we want). While this doesn't directly enforce Go imports, because we enforce the bazel metadata to be correct in CI, this effectively prevents importing graft packages where they shouldn't be imported.

Is there any interest in removing / refining TestImportViolations (the prior solution) in favor of the bazel solution?

Currently the test enforces

  • graft/coreth cannot be imported from vms/evm, except vms/evm/emulate
  • graft/subnet-evm can only be imported from graft/subnet-evm or vms/evm/emulate
  • graft/evm cannot import graft/coreth or graft/subnet-evm

@ARR4N
Copy link
Copy Markdown
Contributor Author

ARR4N commented Apr 27, 2026

(my understanding, correct me if I'm wrong)

This prevents other Bazel targets from depending on the graft Bazel targets (which is what we want). While this doesn't directly enforce Go imports, because we enforce the bazel metadata to be correct in CI, this effectively prevents importing graft packages where they shouldn't be imported.

Correct.

Is there any interest in removing / refining TestImportViolations (the prior solution) in favor of the bazel solution?

💯

The original was a stop-gap because we didn't have a build system in place.

Currently the test enforces

  • graft/coreth cannot be imported from vms/evm, except vms/evm/emulate

Done but in the positive; i.e. can only be imported by those targets explicitly included in //graft/coreth:external_consumers.

  • graft/subnet-evm can only be imported from graft/subnet-evm or vms/evm/emulate

Done exactly like this.

  • graft/evm cannot import graft/coreth or graft/subnet-evm

Done, but from the perspective of coreth and subnet-evm limiting their own visibility, not graft/evm limiting what it can import.

Change-Id: I0676d5c1afa3a0fceefb503ae01fe7c35ea9ac74
Change-Id: I19d514e2a1bca3f5c90c3ed0e31ea743efab10e3
@maru-ava maru-ava force-pushed the arr4n/bazel-graft-visibility branch from b3ca3e3 to e2af4f1 Compare April 27, 2026 13:59
@maru-ava
Copy link
Copy Markdown
Contributor

Updated to sign the initial commit.

@ARR4N ARR4N added this pull request to the merge queue Apr 27, 2026
Merged via the queue into master with commit 4f91bee Apr 27, 2026
60 checks passed
@ARR4N ARR4N deleted the arr4n/bazel-graft-visibility branch April 27, 2026 14:37
@github-project-automation github-project-automation Bot moved this to Done 🎉 in avalanchego Apr 27, 2026
@JonathanOppenheimer
Copy link
Copy Markdown
Contributor

I delete the old test here: #5313

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Done 🎉

Development

Successfully merging this pull request may close these issues.

4 participants