Skip to main content

A generic PEP-517 build backend which allows additional processing to be applied to the resulting metadata, wheel and/or editable wheel.

Project description

multistage-build

A generic PEP-517 build backend which allows additional processing to be applied to the resulting metadata, wheel and/or editable wheel.

Motivating Example

Sometimes it is desirable to run a post-processing step on a built wheel. For example, we may wish to inject some additional metadata into the wheel. To do this, we should write a function which accepts the wheel path as its only argument, for example:

def my_wheel_post_processing_func(wheel_path):
    print(f'The wheel to be processed is at {wheel_path}')

This function can then be declared as post-processing step of the PEP-517 build_wheel function:

[build-system]
requires = [
    'multistage-build',
    'setuptools',
]
build-backend = "multistage_build:backend"

[tool.multistage-build]
build-backend = "setuptools.build_meta"
post-build-wheel = [
    {hook-function="my_mod:my_wheel_post_processing_func", hook-path="."},
]

[project]
name = "some-project"
version = "0.1.0"
...

We could also publish this functionality to the package repository, and consume it by declaring it as a build requirement:

[build-system]
requires = [
    'multistage-build',
    'my_mod',
    'setuptools',
]
build-backend = "multistage_build:backend"

[tool.multistage-build]
build-backend = "setuptools.build_meta"
post-build-wheel = [
    "my_mod:my_wheel_post_processing_func",
]

[project]
name = "some-project"
version = "0.1.0"
...

Plugin based hooks

For tools wishing to expose a standard behaviour, without requiring the user to declare each of the hooks manually, it is possible to declare potential hooks as entrypoints.

An example of a project which automatically registers build-time hooks using entry points:

[project.entry-points.multistage_build]
post-prepare-metadata-for-build-wheel = "my_mod:prepare_metadata_for_build_wheel_fn"
post-build-sdist = "my_mod:build_editable_fn"
post-build-wheel = "my_mod:build_editable_fn"
post-build-editable = "my_mod:build_wheel_fn"

These hooks will get called for any user of the multistage_build backend, even if the project declaring these entrypoints doesn't itself use multistage-build. It allows one to build a library of hooks, and to have consumers add them by adding extra build dependencies (and declaring a multistage-build backend).

As is normal for entry-points, the name of the function is unimportant. It is possible to declare multiple entry-points per hook. A nice pattern would be to only run some behaviour if the hook is configured in the pyproject.toml (which is in the CWD when the hook is running); though this isn't obligatory (esp. when no configuration is needed - in that case, the existence of the project in the build environment is enough of a signal for the hook to be run).

Status of work

The current functionality includes:

  • Hooks for build-sdist (post-build-sdist``), build-wheel (post-build-wheel), and build-editable (post-build-editable), and prepare-metadata-for-build-wheel (post-prepare-metadata-for-build-wheel`)
  • Ability to have local definitions included, using the same mechanism as in-source builds from PEP-517.

There are a few known features not yet implemented:

  • Hooks for all other PEP-517 and PEP-660 hooks
  • Ability to override multiple hooks with a single declaration (e.g. editable and build hooks). Perhaps allow entrypoint definitions so that you get it simply by having the dependency installed?

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

multistage_build-0.2.0.tar.gz (15.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

multistage_build-0.2.0-py3-none-any.whl (9.0 kB view details)

Uploaded Python 3

File details

Details for the file multistage_build-0.2.0.tar.gz.

File metadata

  • Download URL: multistage_build-0.2.0.tar.gz
  • Upload date:
  • Size: 15.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for multistage_build-0.2.0.tar.gz
Algorithm Hash digest
SHA256 d9bfa41c00ffc0a4e51d72c3ffbb2e07d704612770d2d393cd72fbc19fba5c51
MD5 997e858d3a303c29ea4e8d5ce1b92d48
BLAKE2b-256 5e95aaaba3a4c2538fce80a25e1ec16c5ebb6380056932ffd5f2f5e6b0d629a2

See more details on using hashes here.

Provenance

The following attestation bundles were made for multistage_build-0.2.0.tar.gz:

Publisher: python-publish.yml on pelson/multistage-build

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file multistage_build-0.2.0-py3-none-any.whl.

File metadata

File hashes

Hashes for multistage_build-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 621feee5d6332c1b6feb43895028054df67c6f548c93bb620589bde9f6ff6338
MD5 b2899d8e4f81d9adec9bc8be93d6fba6
BLAKE2b-256 03255269a12ad215f8892476a2c4b688f10aec3de3e13cb6256ee1b10fdc0e30

See more details on using hashes here.

Provenance

The following attestation bundles were made for multistage_build-0.2.0-py3-none-any.whl:

Publisher: python-publish.yml on pelson/multistage-build

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page