diff --git a/docs/run_binary.md b/docs/run_binary.md index ff84bff41..f7fc0360d 100644 --- a/docs/run_binary.md +++ b/docs/run_binary.md @@ -11,7 +11,7 @@ This fork of bazel-skylib's run_binary adds directory output support and better
 run_binary(name, tool, srcs, args, env, outs, out_dirs, mnemonic, progress_message,
-           execution_requirements, output_dir, kwargs)
+           execution_requirements, stamp, output_dir, kwargs)
 
Runs a binary as a build action. @@ -34,6 +34,7 @@ This rule does not require Bash (unlike `native.genrule`). | mnemonic | A one-word description of the action, for example, CppCompile or GoLink. | "RunBinary" | | progress_message | Progress message to show to the user during the build, for example, "Compiling foo.cc to create foo.o". The message may contain %{label}, %{input}, or %{output} patterns, which are substituted with label string, first input, or output's path, respectively. Prefer to use patterns instead of static strings, because the former are more efficient. | None | | execution_requirements | Information for scheduling the action.

For example,

 execution_requirements = {     "no-cache": "1", }, 


See https://docs.bazel.build/versions/main/be/common-definitions.html#common.tags for useful keys. | None | +| stamp | Whether to include build status files as inputs to the tool. Possible values:

- stamp = 1: Always include build status files as inputs to the tool, even in [--nostamp](https://docs.bazel.build/versions/main/user-manual.html#flag--stamp) builds. This setting should be avoided, since it is non-deterministic. It potentially causes remote cache misses for the target and any downstream actions that depend on the result. - stamp = 0: Never include build status files as inputs to the tool. This gives good build result caching. - stamp = -1: Inclusion of build status files as inputs is controlled by the [--[no]stamp](https://docs.bazel.build/versions/main/user-manual.html#flag--stamp) flag. Stamped targets are not rebuilt unless their dependencies change.

When stamping is enabled, an additional two environment variables will be set for the action: - BAZEL_STABLE_STATUS_FILE - BAZEL_VOLATILE_STATUS_FILE

These files can be read and parsed by the action, for example to pass some values to a linker. | -1 | | output_dir | If set to True then an output directory named the same as the target name is added to out_dirs.

Deprecated. For backward compatability with @aspect_bazel_lib 1.x. Use out_dirs instead. | False | | kwargs | Additional arguments | none | diff --git a/lib/private/run_binary.bzl b/lib/private/run_binary.bzl index b7632c9ef..6744397c6 100644 --- a/lib/private/run_binary.bzl +++ b/lib/private/run_binary.bzl @@ -16,6 +16,7 @@ load("@bazel_skylib//lib:dicts.bzl", "dicts") load("//lib/private:expand_make_vars.bzl", "expand_locations", "expand_variables") +load("//lib:stamping.bzl", "STAMP_ATTRS", "maybe_stamp") def _impl(ctx): tool_as_list = [ctx.attr.tool] @@ -57,9 +58,17 @@ Possible fixes: for k, v in ctx.attr.env.items(): envs[k] = " ".join([expand_variables(ctx, e, outs = outputs, attribute_name = "env") for e in expand_locations(ctx, v, ctx.attr.srcs).split(" ")]) + stamp = maybe_stamp(ctx) + if stamp: + inputs = ctx.files.srcs + [stamp.volatile_status_file, stamp.stable_status_file] + envs["BAZEL_STABLE_STATUS_FILE"] = stamp.stable_status_file.path + envs["BAZEL_VOLATILE_STATUS_FILE"] = stamp.volatile_status_file.path + else: + inputs = ctx.files.srcs + ctx.actions.run( outputs = outputs, - inputs = ctx.files.srcs, + inputs = inputs, tools = tool_inputs, executable = ctx.executable.tool, arguments = [args], @@ -77,7 +86,7 @@ Possible fixes: _run_binary = rule( implementation = _impl, - attrs = { + attrs = dict({ "tool": attr.label( executable = True, allow_files = True, @@ -94,7 +103,7 @@ _run_binary = rule( "mnemonic": attr.string(), "progress_message": attr.string(), "execution_requirements": attr.string_dict(), - }, + }, **STAMP_ATTRS), ) def run_binary( @@ -108,6 +117,7 @@ def run_binary( mnemonic = "RunBinary", progress_message = None, execution_requirements = None, + stamp = -1, # TODO: remove output_dir in 2.x release output_dir = False, **kwargs): @@ -175,6 +185,25 @@ def run_binary( Deprecated. For backward compatability with @aspect_bazel_lib 1.x. Use out_dirs instead. + stamp: Whether to include build status files as inputs to the tool. Possible values: + + - `stamp = 1`: Always include build status files as inputs to the tool, even in + [--nostamp](https://docs.bazel.build/versions/main/user-manual.html#flag--stamp) builds. + This setting should be avoided, since it is non-deterministic. + It potentially causes remote cache misses for the target and + any downstream actions that depend on the result. + - `stamp = 0`: Never include build status files as inputs to the tool. + This gives good build result caching. + - `stamp = -1`: Inclusion of build status files as inputs is controlled by the + [--[no]stamp](https://docs.bazel.build/versions/main/user-manual.html#flag--stamp) flag. + Stamped targets are not rebuilt unless their dependencies change. + + When stamping is enabled, an additional two environment variables will be set for the action: + - `BAZEL_STABLE_STATUS_FILE` + - `BAZEL_VOLATILE_STATUS_FILE` + + These files can be read and parsed by the action, for example to pass some values to a linker. + **kwargs: Additional arguments """ _run_binary( @@ -188,5 +217,6 @@ def run_binary( mnemonic = mnemonic, progress_message = progress_message, execution_requirements = execution_requirements, + stamp = stamp, **kwargs )