| """A small utility module dedicated to detecting whether or not the `--stamp` flag is enabled |
| |
| This module can be removed likely after the following PRs ar addressed: |
| - https://github.com/bazelbuild/bazel/issues/11164 |
| """ |
| |
| load("//rust/private:utils.bzl", "dedent") |
| |
| StampSettingInfo = provider( |
| doc = "Information about the `--stamp` command line flag", |
| fields = { |
| "value": "bool: Whether or not the `--stamp` flag was enabled", |
| }, |
| ) |
| |
| def _stamp_build_setting_impl(ctx): |
| return StampSettingInfo(value = ctx.attr.value) |
| |
| _stamp_build_setting = rule( |
| doc = dedent("""\ |
| Whether to encode build information into the binary. Possible values: |
| |
| - stamp = 1: Always stamp the build information into the binary, even in [--nostamp][stamp] builds. \ |
| This setting should be avoided, since it potentially kills remote caching for the binary and \ |
| any downstream actions that depend on it. |
| - stamp = 0: Always replace build information by constant values. This gives good build result caching. |
| - stamp = -1: Embedding of build information is controlled by the [--[no]stamp][stamp] flag. |
| |
| Stamped binaries are not rebuilt unless their dependencies change. |
| [stamp]: https://docs.bazel.build/versions/main/user-manual.html#flag--stamp |
| """), |
| implementation = _stamp_build_setting_impl, |
| attrs = { |
| "value": attr.bool( |
| doc = "The default value of the stamp build flag", |
| mandatory = True, |
| ), |
| }, |
| ) |
| |
| def stamp_build_setting(name, visibility = ["//visibility:public"]): |
| native.config_setting( |
| name = "stamp_detect", |
| values = {"stamp": "1"}, |
| visibility = visibility, |
| ) |
| |
| _stamp_build_setting( |
| name = name, |
| value = select({ |
| ":stamp_detect": True, |
| "//conditions:default": False, |
| }), |
| visibility = visibility, |
| ) |
| |
| def is_stamping_enabled(attr): |
| """Determine whether or not build stamping is enabled |
| |
| Args: |
| attr (struct): A rule's struct of attributes (`ctx.attr`) |
| |
| Returns: |
| bool: The stamp value |
| """ |
| stamp_num = getattr(attr, "stamp", -1) |
| if stamp_num == 1: |
| return True |
| elif stamp_num == 0: |
| return False |
| elif stamp_num == -1: |
| stamp_flag = getattr(attr, "_stamp_flag", None) |
| return stamp_flag[StampSettingInfo].value if stamp_flag else False |
| else: |
| fail("Unexpected `stamp` value: {}".format(stamp_num)) |