blob: cac7a722777d73bea427b60b836afcb6ebf2cf36 [file] [log] [blame]
commit f5e96331ea1f74fe956f0ef62a5e1ce4b81d8bc4
Author: Jan Schรคr <jan@monogon.tech>
Date: Wed Jul 2 13:41:44 2025 +0000
Request stdlib cache dir in gopackagesdriver
The stdlib_json_file contains paths of compiled cgo files, which are in
the stdlib cache_dir. The gopackagesdriver reads those files, but this
dependency was not explicitly declared previously.
Usually, it works despite the missing dependency. But when you have a
Bazel cache configured, and then run `bazel clean` and run the
gopackagesdriver again, Bazel will not restore the cache_dir from the
Bazel cache. The gopackagesdriver then fails with an error like this:
error: unable to load JSON files: unable to resolve imports: open
[...]/bin/external/rules_go+/stdlib_/gocache/a4/a4f91e8314b27a4bce0e8fbc01bb9736cb9ed10da747af722c5a4f2fcb1213a3-d:
no such file or directory
This change adds a new output group containing the stdlib cache_dir,
and requests this from the gopackagesdriver, fixing the problem.
Upstream PR: https://github.com/bazel-contrib/rules_go/pull/4391
diff --git a/go/tools/gopackagesdriver/aspect.bzl b/go/tools/gopackagesdriver/aspect.bzl
index c6013d76..dbe56633 100644
--- a/go/tools/gopackagesdriver/aspect.bzl
+++ b/go/tools/gopackagesdriver/aspect.bzl
@@ -65,6 +65,7 @@ def make_pkg_json(ctx, name, pkg_info):
def _go_pkg_info_aspect_impl(target, ctx):
# Fetch the stdlib JSON file from the inner most target
stdlib_json_file = None
+ stdlib_cache_dir = None
transitive_json_files = []
transitive_export_files = []
@@ -87,6 +88,7 @@ def _go_pkg_info_aspect_impl(target, ctx):
# Fetch the stdlib json from the first dependency
if not stdlib_json_file:
stdlib_json_file = pkg_info.stdlib_json_file
+ stdlib_cache_dir = pkg_info.stdlib_cache_dir
pkg_json_files = []
compiled_go_files = []
@@ -113,9 +115,11 @@ def _go_pkg_info_aspect_impl(target, ctx):
# current go_ node.
if not stdlib_json_file:
stdlib_json_file = ctx.attr._go_stdlib[GoStdLib]._list_json
+ stdlib_cache_dir = ctx.attr._go_stdlib[GoStdLib].cache_dir
pkg_info = GoPkgInfo(
stdlib_json_file = stdlib_json_file,
+ stdlib_cache_dir = stdlib_cache_dir,
pkg_json_files = depset(
direct = pkg_json_files,
transitive = transitive_json_files,
@@ -137,6 +141,7 @@ def _go_pkg_info_aspect_impl(target, ctx):
go_pkg_driver_srcs = pkg_info.compiled_go_files,
go_pkg_driver_export_file = pkg_info.export_files,
go_pkg_driver_stdlib_json_file = depset([pkg_info.stdlib_json_file] if pkg_info.stdlib_json_file else []),
+ go_pkg_driver_stdlib_cache_dir = pkg_info.stdlib_cache_dir or depset([]),
),
]
diff --git a/go/tools/gopackagesdriver/bazel_json_builder.go b/go/tools/gopackagesdriver/bazel_json_builder.go
index 76386332..bb50f7a0 100644
--- a/go/tools/gopackagesdriver/bazel_json_builder.go
+++ b/go/tools/gopackagesdriver/bazel_json_builder.go
@@ -159,7 +159,7 @@ func NewBazelJSONBuilder(bazel *Bazel, includeTests bool) (*BazelJSONBuilder, er
}
func (b *BazelJSONBuilder) outputGroupsForMode(mode packages.LoadMode) string {
- og := "go_pkg_driver_json_file,go_pkg_driver_stdlib_json_file,go_pkg_driver_srcs"
+ og := "go_pkg_driver_json_file,go_pkg_driver_stdlib_json_file,go_pkg_driver_stdlib_cache_dir,go_pkg_driver_srcs"
if mode&packages.NeedExportsFile != 0 {
og += ",go_pkg_driver_export_file"
}