blob: 0b3c2cde4e718887aeace54b78fdf345032f52f6 [file] [log] [blame]
commit 676d9d220a8a71f207701fc8568078028235aea6
Author: Jan Schรคr <jan@monogon.tech>
Date: Wed Apr 30 09:30:04 2025 +0000
Add stampsrcs attribute
This change adds the stampsrcs attribute, which allows providing a list
of files containing variable definitions, which are used in addition to
the stable and volatile status files and have the same format.
See https://github.com/bazel-contrib/rules_go/issues/3507
diff --git a/go/private/actions/archive.bzl b/go/private/actions/archive.bzl
index 06212139..e89cedd6 100644
--- a/go/private/actions/archive.bzl
+++ b/go/private/actions/archive.bzl
@@ -177,6 +177,7 @@ def emit_archive(go, source = None, _recompile_suffix = "", recompile_internal_d
_cover = source.cover,
_embedsrcs = tuple(source.embedsrcs),
_x_defs = tuple(source.x_defs.items()),
+ _stampsrcs = tuple(source.stampsrcs),
_gc_goopts = tuple(source.gc_goopts),
_cgo = source.cgo,
_cdeps = tuple(source.cdeps),
@@ -198,8 +199,10 @@ def emit_archive(go, source = None, _recompile_suffix = "", recompile_internal_d
_cgo_deps = cgo_deps,
)
x_defs = dict(source.x_defs)
+ stampsrcs = source.stampsrcs
for a in direct:
x_defs.update(a.x_defs)
+ stampsrcs = stampsrcs + a.stampsrcs
# Ensure that the _cgo_export.h of the current target comes first when cgo_exports is iterated
# by prepending it and specifying the order explicitly. This is required as the CcInfo attached
@@ -213,6 +216,7 @@ def emit_archive(go, source = None, _recompile_suffix = "", recompile_internal_d
libs = depset(direct = [out_lib], transitive = [a.libs for a in direct]),
transitive = depset([data], transitive = [a.transitive for a in direct]),
x_defs = x_defs,
+ stampsrcs = stampsrcs,
cgo_deps = depset(transitive = [cgo_deps] + [a.cgo_deps for a in direct]),
cgo_exports = cgo_exports,
runfiles = runfiles,
diff --git a/go/private/actions/link.bzl b/go/private/actions/link.bzl
index 18dd1f94..3b236f06 100644
--- a/go/private/actions/link.bzl
+++ b/go/private/actions/link.bzl
@@ -161,6 +161,7 @@ def emit_link(
stamp_inputs.append(info_file)
if stamp_x_defs_volatile:
stamp_inputs.append(version_file)
+ stamp_inputs = stamp_inputs + archive.stampsrcs
if stamp_inputs:
builder_args.add_all(stamp_inputs, before_each = "-stamp")
diff --git a/go/private/context.bzl b/go/private/context.bzl
index f5cd735d..42c5cf13 100644
--- a/go/private/context.bzl
+++ b/go/private/context.bzl
@@ -202,6 +202,7 @@ def _merge_embed(source, embed):
source["cover"] = depset(transitive = [source["cover"], s.cover])
source["deps"] = source["deps"] + s.deps
source["x_defs"].update(s.x_defs)
+ source["stampsrcs"] = source["stampsrcs"] + s.stampsrcs
source["gc_goopts"] = source["gc_goopts"] + s.gc_goopts
source["runfiles"] = source["runfiles"].merge(s.runfiles)
@@ -319,6 +320,7 @@ def new_go_info(
"embedsrcs": embedsrcs,
"cover": depset(attr_srcs) if coverage_instrumented else depset(),
"x_defs": {},
+ "stampsrcs": [],
"deps": deps,
"gc_goopts": _expand_opts(go, "gc_goopts", getattr(attr, "gc_goopts", [])),
"runfiles": _collect_runfiles(go, getattr(attr, "data", []), deps),
@@ -344,6 +346,8 @@ def new_go_info(
k = "{}.{}".format(importmap, k)
x_defs[k] = v
go_info["x_defs"] = x_defs
+ for t in getattr(attr, "stampsrcs", []):
+ go_info["stampsrcs"] = go_info["stampsrcs"] + t[DefaultInfo].files.to_list()
if not go_info["cgo"]:
for k in ("cdeps", "cppopts", "copts", "cxxopts", "clinkopts"):
if getattr(attr, k, None):
diff --git a/go/private/rules/binary.bzl b/go/private/rules/binary.bzl
index f3f2f07c..eac3a978 100644
--- a/go/private/rules/binary.bzl
+++ b/go/private/rules/binary.bzl
@@ -302,6 +302,12 @@ def _go_binary_kwargs(go_cc_aspects = []):
See [Defines and stamping] for examples of how to use these.
""",
),
+ "stampsrcs": attr.label_list(
+ allow_files = True,
+ doc = """Additional files containing variables which can be referenced in `x_defs`.
+ The format of these files should be the same as the workspace status.
+ """,
+ ),
"basename": attr.string(
doc = """The basename of this binary. The binary
basename may also be platform-dependent: on Windows, we add an .exe extension.
diff --git a/go/private/rules/library.bzl b/go/private/rules/library.bzl
index 8aa020d6..fe944d3a 100644
--- a/go/private/rules/library.bzl
+++ b/go/private/rules/library.bzl
@@ -147,6 +147,12 @@ go_library = rule(
Map of defines to add to the go link command. See [Defines and stamping] for examples of how to use these.
""",
),
+ "stampsrcs": attr.label_list(
+ allow_files = True,
+ doc = """Additional files containing variables which can be referenced in `x_defs`.
+ The format of these files should be the same as the workspace status.
+ """,
+ ),
"cgo": attr.bool(
doc = """
If `True`, the package may contain [cgo] code, and `srcs` may contain C, C++, Objective-C, and Objective-C++ files
diff --git a/go/private/rules/test.bzl b/go/private/rules/test.bzl
index 4859c53e..da46ead9 100644
--- a/go/private/rules/test.bzl
+++ b/go/private/rules/test.bzl
@@ -93,6 +93,7 @@ def _go_test_impl(ctx):
embedsrcs = [struct(files = internal_go_info.embedsrcs)],
deps = internal_archive.direct + [internal_archive],
x_defs = ctx.attr.x_defs,
+ stampsrcs = ctx.attr.stampsrcs,
),
name = internal_go_info.name + "_test",
importpath = internal_go_info.importpath + "_test",
@@ -326,6 +327,12 @@ _go_test_kwargs = {
See [Defines and stamping] for examples of how to use these.
""",
),
+ "stampsrcs": attr.label_list(
+ allow_files = True,
+ doc = """Additional files containing variables which can be referenced in `x_defs`.
+ The format of these files should be the same as the workspace status.
+ """,
+ ),
"linkmode": attr.string(
default = "auto",
values = ["auto"] + LINKMODES,
@@ -661,6 +668,7 @@ def _recompile_external_deps(go, external_go_info, internal_archive, library_lab
attrs = structs.to_dict(internal_go_info)
attrs["deps"] = internal_deps
attrs["x_defs"] = x_defs
+ attrs["stampsrcs"] = internal_go_info.stampsrcs + internal_archive.stampsrcs
internal_go_info = GoInfo(**attrs)
internal_archive = go.archive(go, internal_go_info, _recompile_suffix = ".recompileinternal", recompile_internal_deps = need_recompile_deps)
@@ -698,6 +706,7 @@ def _recompile_external_deps(go, external_go_info, internal_archive, library_lab
cover = arc_data._cover,
embedsrcs = as_list(arc_data._embedsrcs),
x_defs = dict(arc_data._x_defs),
+ stampsrcs = as_list(arc_data._stampsrcs),
deps = deps,
gc_goopts = as_list(arc_data._gc_goopts),
runfiles = arc_data.runfiles,
@@ -722,6 +731,7 @@ def _recompile_external_deps(go, external_go_info, internal_archive, library_lab
libs = depset(direct = [arc_data.file], transitive = [a.libs for a in deps]),
transitive = depset(direct = [arc_data], transitive = [a.transitive for a in deps]),
x_defs = go_info.x_defs,
+ stampsrcs = go_info.stampsrcs,
cgo_deps = depset(transitive = [arc_data._cgo_deps] + [a.cgo_deps for a in deps]),
cgo_exports = depset(transitive = [a.cgo_exports for a in deps]),
runfiles = go_info.runfiles,