-
-
Notifications
You must be signed in to change notification settings - Fork 631
Added stamp
attribute to py_wheel
#554
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -14,6 +14,19 @@ | |
|
||
"""Rules for building wheels.""" | ||
|
||
load("//python/private:stamp.bzl", "is_stamping_enabled") | ||
|
||
PyWheelInfo = provider( | ||
doc = "Information about a wheel produced by `py_wheel`", | ||
fields = { | ||
"name_file": ( | ||
"File: A file containing the canonical name of the wheel (after " + | ||
"stamping, if enabled)." | ||
), | ||
"wheel": "File: The wheel file itself.", | ||
}, | ||
) | ||
|
||
def _path_inside_wheel(input_file): | ||
# input_file.short_path is sometimes relative ("../${repository_root}/foobar") | ||
# which is not a valid path within a zip file. Fix that. | ||
|
@@ -110,6 +123,8 @@ def _py_wheel_impl(ctx): | |
_escape_filename_segment(ctx.attr.platform), | ||
]) + ".whl") | ||
|
||
name_file = ctx.actions.declare_file(ctx.label.name + ".name") | ||
|
||
inputs_to_package = depset( | ||
direct = ctx.files.deps, | ||
) | ||
|
@@ -133,9 +148,16 @@ def _py_wheel_impl(ctx): | |
args.add("--python_requires", ctx.attr.python_requires) | ||
args.add("--abi", ctx.attr.abi) | ||
args.add("--platform", ctx.attr.platform) | ||
args.add("--out", outfile.path) | ||
args.add("--out", outfile) | ||
args.add("--name_file", name_file) | ||
args.add_all(ctx.attr.strip_path_prefixes, format_each = "--strip_path_prefix=%s") | ||
|
||
# Pass workspace status files if stamping is enabled | ||
if is_stamping_enabled(ctx.attr): | ||
args.add("--volatile_status_file", ctx.version_file) | ||
args.add("--stable_status_file", ctx.version_file) | ||
other_inputs.extend([ctx.version_file, ctx.info_file]) | ||
|
||
args.add("--input_file_list", packageinputfile) | ||
|
||
extra_headers = [] | ||
|
@@ -193,15 +215,21 @@ def _py_wheel_impl(ctx): | |
|
||
ctx.actions.run( | ||
inputs = depset(direct = other_inputs, transitive = [inputs_to_package]), | ||
outputs = [outfile], | ||
outputs = [outfile, name_file], | ||
arguments = [args], | ||
executable = ctx.executable._wheelmaker, | ||
progress_message = "Building wheel", | ||
) | ||
return [DefaultInfo( | ||
files = depset([outfile]), | ||
data_runfiles = ctx.runfiles(files = [outfile]), | ||
)] | ||
return [ | ||
DefaultInfo( | ||
files = depset([outfile]), | ||
runfiles = ctx.runfiles(files = [outfile]), | ||
), | ||
PyWheelInfo( | ||
wheel = outfile, | ||
name_file = name_file, | ||
), | ||
] | ||
|
||
def _concat_dicts(*dicts): | ||
result = {} | ||
|
@@ -247,9 +275,35 @@ platform = select({ | |
default = "py3", | ||
doc = "Supported Python version(s), eg `py3`, `cp35.cp36`, etc", | ||
), | ||
"stamp": attr.int( | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. this is a good docstring, and I think it's enough copy-paste that we should consider sharing this attribute in the stamp.bzl file
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. especially because stamp and _stamp_flag should always come as a pair There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I would like to minimize the use of There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. no one is working on bazelbuild/bazel#11164 and all other rulesets have already gone ahead with some local solution. pretty sure what we're doing here will be as permanent as rules_python. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I don't think it should be but I can unfortunately see that happening. Regardless, I don't think There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. py_wheel isn't the only rule that needs stamping, I'm sure there are others or there will be. maybe it can be refactored when we add the second one |
||
doc = """\ | ||
Whether to encode build information into the wheel. Possible values: | ||
|
||
- `stamp = 1`: Always stamp the build information into the wheel, even in \ | ||
[--nostamp](https://docs.bazel.build/versions/main/user-manual.html#flag--stamp) builds. \ | ||
This setting should be avoided, since it potentially kills remote caching for the target 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](https://docs.bazel.build/versions/main/user-manual.html#flag--stamp) flag. | ||
|
||
Stamped targets are not rebuilt unless their dependencies change. | ||
""", | ||
default = -1, | ||
values = [1, 0, -1], | ||
), | ||
"version": attr.string( | ||
mandatory = True, | ||
doc = "Version number of the package", | ||
doc = ( | ||
"Version number of the package. Note that this attribute " + | ||
"supports stamp format strings. Eg `1.2.3-{BUILD_TIMESTAMP}`" | ||
), | ||
), | ||
"_stamp_flag": attr.label( | ||
doc = "A setting used to determine whether or not the `--stamp` flag is enabled", | ||
default = Label("//python/private:stamp"), | ||
), | ||
} | ||
|
||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,73 @@ | ||
"""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 | ||
""" | ||
|
||
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 = """\ | ||
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 staming 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)) |
Uh oh!
There was an error while loading. Please reload this page.