Skip to content
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

feat: add extra metadata files while building wheels #329

Merged
merged 1 commit into from
Aug 16, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/workflows/test.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ jobs:
- rust_vendor
- download_sequence
- optimize_build
- extra_metadata

steps:
- name: Get source
Expand Down
3 changes: 3 additions & 0 deletions .mergify.yml
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,9 @@ pull_request_rules:
- check-success=e2e (3.11, 1.75, optimize_build)
- check-success=e2e (3.12, 1.75, optimize_build)

- check-success=e2e (3.11, 1.75, extra_metadata)
- check-success=e2e (3.12, 1.75, extra_metadata)

- "-draft"

# At least 1 reviewer
Expand Down
59 changes: 59 additions & 0 deletions e2e/test_extra_metadata.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
#!/bin/bash
# -*- indent-tabs-mode: nil; tab-width: 2; sh-indentation: 2; -*-

# Test whether extra metadata was added in the wheels or not

SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
source "$SCRIPTDIR/common.sh"

fromager \
--log-file="$OUTDIR/bootstrap.log" \
--error-log-file="$OUTDIR/fromager-errors.log" \
--sdists-repo="$OUTDIR/sdists-repo" \
--wheels-repo="$OUTDIR/wheels-repo" \
--work-dir="$OUTDIR/work-dir" \
--settings-file="$SCRIPTDIR/build_settings.yaml" \
bootstrap 'stevedore==5.2.0'

find "$OUTDIR/wheels-repo/" -name '*.whl'
find "$OUTDIR/sdists-repo/" -name '*.tar.gz'
ls "$OUTDIR"/work-dir/*/build.log || true

EXPECTED_FILES="
$OUTDIR/wheels-repo/downloads/setuptools-*.whl
$OUTDIR/wheels-repo/downloads/pbr-*.whl
$OUTDIR/wheels-repo/downloads/stevedore-*.whl
"

pass=true
for pattern in $EXPECTED_FILES; do
if [ ! -f "${pattern}" ]; then
echo "Did not find $pattern" 1>&2
pass=false
fi
done

$pass

wheel unpack $OUTDIR/wheels-repo/downloads/stevedore-5.2.0-py3-none-any.whl -d $OUTDIR

EXPECTED_FILES="
$OUTDIR/stevedore-5.2.0/stevedore-5.2.0.dist-info/fromager-build-settings
$OUTDIR/stevedore-5.2.0/stevedore-5.2.0.dist-info/fromager-build-backend-requirements.txt
$OUTDIR/stevedore-5.2.0/stevedore-5.2.0.dist-info/fromager-build-system-requirements.txt
$OUTDIR/stevedore-5.2.0/stevedore-5.2.0.dist-info/fromager-build-sdist-requirements.txt
"

pass=true
for pattern in $EXPECTED_FILES; do
if [ ! -f "${pattern}" ]; then
echo "Did not find $pattern" 1>&2
pass=false
fi
done

$pass

for file in $EXPECTED_FILES; do
cat $file
done
1 change: 1 addition & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,4 @@ stevedore
tomlkit
tqdm
virtualenv
wheel
77 changes: 77 additions & 0 deletions src/fromager/wheels.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,15 @@
import os
import pathlib
import platform
import shutil
import sys
import tempfile
import typing
import zipfile
from datetime import datetime

import elfdeps
import tomlkit
from packaging.requirements import Requirement
from packaging.utils import parse_wheel_filename
from packaging.version import Version
Expand Down Expand Up @@ -129,6 +131,73 @@ def analyze_wheel_elfdeps(
return requires, provides


def add_extra_metadata_to_wheels(
ctx: context.WorkContext,
req: Requirement,
version: Version,
extra_environ: dict[str, str],
sdist_root_dir: pathlib.Path,
wheel_file: pathlib.Path,
) -> None:
extra_data_plugin = overrides.find_override_method(
dhellmann marked this conversation as resolved.
Show resolved Hide resolved
req.name, "add_extra_metadata_to_wheels"
)
data_to_add = {}
if extra_data_plugin:
data_to_add = overrides.invoke(
extra_data_plugin,
ctx=ctx,
req=req,
version=version,
extra_environ=extra_environ,
sdist_root_dir=sdist_root_dir,
)
if not isinstance(data_to_add, dict):
logger.warning(
f"{req.name}: unexpected return type from plugin add_extra_metadata_to_wheels. Expected dictionary. Will ignore"
)
data_to_add = {}

with tempfile.TemporaryDirectory() as dir_name:
dhellmann marked this conversation as resolved.
Show resolved Hide resolved
cmd = ["wheel", "unpack", str(wheel_file), "-d", dir_name]
external_commands.run(
cmd,
cwd=dir_name,
network_isolation=ctx.network_isolation,
)

wheel_file_name_parts = wheel_file.name.split("-")
distribution_name = f"{wheel_file_name_parts[0]}-{wheel_file_name_parts[1]}"
dist_info_dir = (
pathlib.Path(dir_name)
/ distribution_name
/ f"{distribution_name}.dist-info"
)
if not dist_info_dir.exists():
logger.debug(
f"{req.name}: could not add additional metadata. {dist_info_dir} does not exist"
)
return

build_file = dist_info_dir / "fromager-build-settings"
settings = ctx.settings.get_package_settings(req.name)
if data_to_add:
settings["metadata-from-plugin"] = data_to_add

build_file.write_text(tomlkit.dumps(settings))

req_files = sdist_root_dir.parent.glob("*-requirements.txt")
shubhbapna marked this conversation as resolved.
Show resolved Hide resolved
for req_file in req_files:
shutil.copy(req_file, dist_info_dir / f"fromager-{req_file.name}")

cmd = ["wheel", "pack", str(dist_info_dir.parent), "-d", str(wheel_file.parent)]
external_commands.run(
cmd,
cwd=dir_name,
network_isolation=ctx.network_isolation,
)


def build_wheel(
ctx: context.WorkContext,
req: Requirement,
Expand Down Expand Up @@ -172,6 +241,14 @@ def build_wheel(
# TODO: raise error?
return None
wheel = wheels[0]
add_extra_metadata_to_wheels(
ctx=ctx,
req=req,
version=version,
extra_environ=extra_environ,
sdist_root_dir=sdist_root_dir,
wheel_file=wheel,
)
logger.info(f"{req.name}: built wheel '{wheel}' in {end - start}")
analyze_wheel_elfdeps(ctx, req, wheel)
return wheel
Expand Down
Loading