"""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))