Skip to content

Commit 3ee8115

Browse files
committed
feat: add interpreter_markers attribute
1 parent 938d25f commit 3ee8115

File tree

3 files changed

+31
-36
lines changed

3 files changed

+31
-36
lines changed

examples/simple/README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# simple example
1+
# Simple example
22

33
This example shows how to use poetry to fetch external dependencies from a pyproject.toml file,
44
then use them in BUILD files as dependencies of Bazel targets.

python/poetry_deps.bzl

+27-30
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,15 @@ load("@bazel_skylib//lib:versions.bzl", "versions")
33
load("//python:markers.bzl", "evaluate", "parse")
44

55
# Environment Markers https://peps.python.org/pep-0508/#environment-markers
6-
_PLATFORM_MAPPING = {
7-
"aarch64-apple-darwin": {"platform_system": "Darwin", "platform_tag": "macosx_11_0_arm64", "sys_platform": "darwin", "os_name": "posix"},
8-
"aarch64-unknown-linux-gnu": {"platform_system": "Linux", "platform_tag": "manylinux_2_17_arm64", "sys_platform": "linux", "os_name": "posix"},
9-
"x86_64-apple-darwin": {"platform_system": "Darwin", "platform_tag": "macosx_10_15_x86_64", "sys_platform": "darwin", "os_name": "posix"},
10-
"x86_64-pc-windows-msvc": {"platform_system": "Windows", "platform_tag": "win_amd64", "sys_platform": "win32", "os_name": "nt"},
11-
"x86_64-unknown-linux-gnu": {"platform_system": "Linux", "platform_tag": "manylinux_2_17_x86_64", "sys_platform": "linux", "os_name": "posix"},
6+
_INTERPRETER_MARKERS = {
7+
"aarch64-apple-darwin": """{"platform_system": "Darwin", "platform_tag": ["macosx_11_0_arm64", "macosx_12_0_arm64"], "sys_platform": "darwin", "os_name": "posix"}""",
8+
"aarch64-unknown-linux-gnu": """{"platform_system": "Linux", "platform_tag": "manylinux_2_17_arm64", "sys_platform": "linux", "os_name": "posix"}""",
9+
"x86_64-apple-darwin": """{"platform_system": "Darwin", "platform_tag": "macosx_10_15_x86_64", "sys_platform": "darwin", "os_name": "posix"}""",
10+
"x86_64-pc-windows-msvc": """{"platform_system": "Windows", "platform_tag": "win_amd64", "sys_platform": "win32", "os_name": "nt"}""",
11+
"x86_64-unknown-linux-gnu": """{"platform_system": "Linux", "platform_tag": "manylinux_2_17_x86_64", "sys_platform": "linux", "os_name": "posix"}""",
1212
}
1313

14-
def _derive_tags(interpreter, constraints):
14+
def _derive_environment_markers(interpreter, interpreter_markers):
1515
tags = {
1616
"extra": "*",
1717
"implementation_name": "cpython",
@@ -23,12 +23,12 @@ def _derive_tags(interpreter, constraints):
2323
tags["python_version"] = "3.{}".format(parts[index + 1])
2424
break
2525

26-
for fr, to in _PLATFORM_MAPPING.items():
26+
for fr, to in interpreter_markers.items():
2727
if fr in interpreter:
28-
tags.update(**to)
29-
break
28+
tags.update(**json.decode(to))
29+
return fr, tags
3030

31-
return tags
31+
return None, tags
3232

3333
def _include_dep(dep, markers, environment):
3434
if not markers:
@@ -67,30 +67,30 @@ def _package_impl(ctx):
6767

6868
toolchain = ctx.toolchains["@bazel_tools//tools/python:toolchain_type"]
6969
runtime_info = toolchain.py3_runtime
70-
target_platforms_constraints = {}
71-
for constraint in ctx.attr.constraints:
72-
constraint_info = constraint[platform_common.ConstraintValueInfo]
73-
if ctx.target_platform_has_constraint(constraint_info) and constraint.label.workspace_name == "platforms":
74-
target_platforms_constraints[constraint.label.package] = constraint.label.name
75-
76-
tags = _derive_tags(runtime_info.interpreter.path, target_platforms_constraints)
70+
runtime_tag, tags = _derive_environment_markers(runtime_info.interpreter.path, ctx.attr.interpreter_markers)
7771
python_version = tags["python_version"]
7872
platform_tag = tags["platform_tag"]
7973

80-
output = ctx.actions.declare_directory("{}/{}/{}".format(python_version, platform_tag, ctx.label.name))
74+
output = ctx.actions.declare_directory("{}/{}/{}".format(python_version, runtime_tag, ctx.label.name))
8175
arguments = [
8276
ctx.attr.name,
8377
ctx.attr.version,
8478
"--python-version",
8579
python_version,
86-
"--platform",
87-
platform_tag,
8880
"--output",
8981
output.path,
9082
"--files",
9183
json.encode(ctx.attr.files),
9284
]
9385

86+
if type(platform_tag) == "string":
87+
arguments += ["--platform", platform_tag]
88+
elif type(platform_tag) == "list":
89+
for platform in tags["platform_tag"]:
90+
arguments += ["--platform", platform]
91+
else:
92+
fail("platform_tag must be either a string o a list of strings")
93+
9494
if ctx.attr.source_url:
9595
arguments += [
9696
"--source-url",
@@ -100,7 +100,7 @@ def _package_impl(ctx):
100100
ctx.actions.run(
101101
outputs = [output],
102102
mnemonic = "InstallWheel",
103-
progress_message = "Installing Python package {} for Python {} {}".format(ctx.label.name, python_version, platform_tag),
103+
progress_message = "Installing Python package {} for Python {} {}".format(ctx.label.name, python_version, runtime_tag),
104104
arguments = arguments,
105105
use_default_shell_env = True,
106106
executable = ctx.executable._poetry_deps,
@@ -126,14 +126,11 @@ package = rule(
126126
"files": attr.string_dict(doc = "The package resolved files"),
127127
"markers": attr.string(doc = "The JSON string with a dictionary of dependency markers accordingly to PEP 508"),
128128
"source_url": attr.string(doc = "The source file URL"),
129-
"constraints": attr.label_list(
130-
default = [
131-
"@platforms//os:macos",
132-
"@platforms//os:linux",
133-
"@platforms//os:windows",
134-
"@platforms//cpu:x86_64",
135-
"@platforms//cpu:aarch64",
136-
],
129+
"interpreter_markers": attr.string_dict(
130+
default = _INTERPRETER_MARKERS,
131+
doc = "The mapping of an interpter substring mapping to environment markers as a JSON string. " +
132+
"Default value corresponds to platforms defined at " +
133+
"https://github.com/bazelbuild/rules_python/blob/23cf6b66/python/versions.bzl#L231-L277",
137134
),
138135
"_poetry_deps": attr.label(default = ":poetry_deps", cfg = "exec", executable = True),
139136
},

python/poetry_deps.py

+3-5
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
parser.add_argument("version", type=str, help="Python package constraint")
1616
parser.add_argument("--output", type=Path, default=Path(), help="package output directory")
1717
parser.add_argument("--python-version", type=str, default=None, help="python version")
18-
parser.add_argument("--platform", type=Path, default=None, help="platform")
18+
parser.add_argument("--platform", type=Path, nargs="*", help="platform")
1919
parser.add_argument("--files", type=str, default="{}", help="files:hash dictionary")
2020
parser.add_argument("--source-url", type=str, default="", help="source file URL")
2121

@@ -28,11 +28,9 @@
2828
(output_pkg / item.name).symlink_to(item)
2929
sys.exit(0)
3030

31-
platform_args = []
31+
platform_args = [f"--platform={platform}" for platform in args.platform]
3232
if args.python_version:
3333
platform_args.append(f"--python-version={args.python_version}")
34-
if args.platform:
35-
platform_args.append(f"--platform={args.platform}")
3634

3735
# Pre-process
3836
output_whl = output_pkg.parent / (output_pkg.name + "_whl")
@@ -46,7 +44,7 @@
4644
f"--destination-directory={os.fspath(output_whl)}",
4745
"--no-cache-dir",
4846
"--no-dependencies",
49-
# "--only-binary=:all:", # TODO: in some cases CC compiler is needed
47+
"--only-binary=:all:", # TODO: in some cases CC compiler is needed
5048
"--disable-pip-version-check",
5149
"--quiet",
5250
]

0 commit comments

Comments
 (0)