Skip to content

Commit 563a967

Browse files
author
Shubh Bapna
committed
add extra metadata files while building wheels
1 parent 480b3cc commit 563a967

File tree

5 files changed

+141
-0
lines changed

5 files changed

+141
-0
lines changed

.github/workflows/test.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ jobs:
7373
- rust_vendor
7474
- download_sequence
7575
- optimize_build
76+
- extra_metadata
7677

7778
steps:
7879
- name: Get source

.mergify.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,9 @@ pull_request_rules:
7575
- check-success=e2e (3.11, 1.75, optimize_build)
7676
- check-success=e2e (3.12, 1.75, optimize_build)
7777

78+
- check-success=e2e (3.11, 1.75, extra_metadata)
79+
- check-success=e2e (3.12, 1.75, extra_metadata)
80+
7881
- "-draft"
7982

8083
# At least 1 reviewer

e2e/test_extra_metadata.sh

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
#!/bin/bash
2+
# -*- indent-tabs-mode: nil; tab-width: 2; sh-indentation: 2; -*-
3+
4+
# Test whether extra metadata was added in the wheels or not
5+
6+
SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
7+
source "$SCRIPTDIR/common.sh"
8+
9+
fromager \
10+
--log-file="$OUTDIR/bootstrap.log" \
11+
--error-log-file="$OUTDIR/fromager-errors.log" \
12+
--sdists-repo="$OUTDIR/sdists-repo" \
13+
--wheels-repo="$OUTDIR/wheels-repo" \
14+
--work-dir="$OUTDIR/work-dir" \
15+
--settings-file="$SCRIPTDIR/build_settings.yaml" \
16+
bootstrap 'stevedore==5.2.0'
17+
18+
find "$OUTDIR/wheels-repo/" -name '*.whl'
19+
find "$OUTDIR/sdists-repo/" -name '*.tar.gz'
20+
ls "$OUTDIR"/work-dir/*/build.log || true
21+
22+
EXPECTED_FILES="
23+
$OUTDIR/wheels-repo/downloads/setuptools-*.whl
24+
$OUTDIR/wheels-repo/downloads/pbr-*.whl
25+
$OUTDIR/wheels-repo/downloads/stevedore-*.whl
26+
"
27+
28+
pass=true
29+
for pattern in $EXPECTED_FILES; do
30+
if [ ! -f "${pattern}" ]; then
31+
echo "Did not find $pattern" 1>&2
32+
pass=false
33+
fi
34+
done
35+
36+
$pass
37+
38+
wheel unpack $OUTDIR/wheels-repo/downloads/stevedore-5.2.0-py3-none-any.whl -d $OUTDIR
39+
40+
EXPECTED_FILES="
41+
$OUTDIR/stevedore-5.2.0/stevedore-5.2.0.dist-info/BUILD
42+
$OUTDIR/stevedore-5.2.0/stevedore-5.2.0.dist-info/build-backend-requirements.txt
43+
$OUTDIR/stevedore-5.2.0/stevedore-5.2.0.dist-info/build-system-requirements.txt
44+
$OUTDIR/stevedore-5.2.0/stevedore-5.2.0.dist-info/build-sdist-requirements.txt
45+
"
46+
47+
pass=true
48+
for pattern in $EXPECTED_FILES; do
49+
if [ ! -f "${pattern}" ]; then
50+
echo "Did not find $pattern" 1>&2
51+
pass=false
52+
fi
53+
done
54+
55+
$pass
56+
57+
for file in $EXPECTED_FILES; do
58+
cat $file
59+
done

requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,4 @@ stevedore
1414
tomlkit
1515
tqdm
1616
virtualenv
17+
wheel

src/fromager/wheels.py

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,15 @@
33
import os
44
import pathlib
55
import platform
6+
import shutil
67
import sys
78
import tempfile
89
import typing
910
import zipfile
1011
from datetime import datetime
1112

1213
import elfdeps
14+
import tomlkit
1315
from packaging.requirements import Requirement
1416
from packaging.utils import parse_wheel_filename
1517
from packaging.version import Version
@@ -129,6 +131,73 @@ def analyze_wheel_elfdeps(
129131
return requires, provides
130132

131133

134+
def add_extra_metadata_to_wheels(
135+
ctx: context.WorkContext,
136+
req: Requirement,
137+
version: Version,
138+
extra_environ: dict[str, str],
139+
sdist_root_dir: pathlib.Path,
140+
wheel_file: pathlib.Path,
141+
) -> None:
142+
extra_data_plugin = overrides.find_override_method(
143+
req.name, "add_extra_metadata_to_wheels"
144+
)
145+
data_to_add = {}
146+
if extra_data_plugin:
147+
data_to_add = overrides.invoke(
148+
extra_data_plugin,
149+
ctx=ctx,
150+
req=req,
151+
version=version,
152+
extra_environ=extra_environ,
153+
sdist_root_dir=sdist_root_dir,
154+
)
155+
if not isinstance(data_to_add, dict):
156+
logger.warning(
157+
f"{req.name}: unexpected return type from plugin add_extra_metadata_to_wheels. Expected dictionary. Will ignore"
158+
)
159+
data_to_add = {}
160+
161+
with tempfile.TemporaryDirectory() as dir_name:
162+
cmd = ["wheel", "unpack", str(wheel_file), "-d", dir_name]
163+
external_commands.run(
164+
cmd,
165+
cwd=dir_name,
166+
network_isolation=ctx.network_isolation,
167+
)
168+
169+
wheel_file_name_parts = wheel_file.name.split("-")
170+
distribution_name = f"{wheel_file_name_parts[0]}-{wheel_file_name_parts[1]}"
171+
dist_info_dir = (
172+
pathlib.Path(dir_name)
173+
/ distribution_name
174+
/ f"{distribution_name}.dist-info"
175+
)
176+
if not dist_info_dir.exists():
177+
logger.debug(
178+
f"{req.name}: could not add additional metadata. {dist_info_dir} does not exist"
179+
)
180+
return
181+
182+
build_file = dist_info_dir / "BUILD"
183+
build_file.write_text(
184+
tomlkit.dumps(ctx.settings.get_package_settings(req.name))
185+
)
186+
if data_to_add:
187+
build_file.write_text(tomlkit.dumps(data_to_add))
188+
189+
req_files = sdist_root_dir.parent.glob("*-requirements.txt")
190+
for req_file in req_files:
191+
shutil.copy(req_file, dist_info_dir)
192+
193+
cmd = ["wheel", "pack", str(dist_info_dir.parent), "-d", str(wheel_file.parent)]
194+
external_commands.run(
195+
cmd,
196+
cwd=dir_name,
197+
network_isolation=ctx.network_isolation,
198+
)
199+
200+
132201
def build_wheel(
133202
ctx: context.WorkContext,
134203
req: Requirement,
@@ -172,6 +241,14 @@ def build_wheel(
172241
# TODO: raise error?
173242
return None
174243
wheel = wheels[0]
244+
add_extra_metadata_to_wheels(
245+
ctx=ctx,
246+
req=req,
247+
version=version,
248+
extra_environ=extra_environ,
249+
sdist_root_dir=sdist_root_dir,
250+
wheel_file=wheel,
251+
)
175252
logger.info(f"{req.name}: built wheel '{wheel}' in {end - start}")
176253
analyze_wheel_elfdeps(ctx, req, wheel)
177254
return wheel

0 commit comments

Comments
 (0)