Skip to main content

A small build system

Project description

Bygg

a Python build system that gets out of your way

PyPI GitHub Release Date GitHub Workflow Status (with branch) Python Version from PEP 621 TOML GitHub

InstallationUsageDevelopment


Bygg is in early stage of development. It is usable and useful for its currently implemented use cases. Feel free to try it out, but also expect things to change and evolve. Feedback and bug reports are welcome!

Introduction

Bygg is a build system implemented in and configured using Python. It is general-purpose, but is aimed at those that (want to) use Python to glue together other systems.

Bygg tries to get out of your way and be as thin as possible, while still providing correctness and minimal rebuilds.

Basics

  • Specify actions in pure Python.
  • Actions can depend on other actions.
  • An action will be executed if the digests of its source or output files have changed.

Installation

Bygg requires Python 3.11 or 3.12.

Install with

pip install bygg or pipx install bygg

or in a virtual environment.

Usage

Specify the actions in Byggfile.py in your source directory. Either wrap the action function using the @action decorator, or use the Action constructor directly.

# Decorator:

@action(
    "build1",
    inputs=["foo.in", "bar.in"],
    outputs=["foo.out", "bar.out"],
    is_entrypoint=True
)
def a_build_command(ctx: ActionContext):
    # do stuff
    ...


# Separate function + Action constructor:

def also_a_build_command(ctx: ActionContext):
    # do stuff
    ...

Action(
    "build2",
    inputs=["foo.in", "bar.in"],
    outputs=["foo.out", "bar.out"],
    dependencies=["another action"],
    command=also_a_build_command,
    is_entrypoint=True
)

Bygg will check for the presence of Byggfile.py in the current directory. The actions above would be built with bygg build1 and bygg build2, respectively. See the examples/ directory for worked examples.

Settings file

There is also support for declaring actions in a YAML settings file, Byggfile.yml. This is intended primarily for configuring static settings like which virtual environment to use and their respective entrypoints, but can also be used for declaring other (static) actions. See examples/taskrunner/Byggfile.yml and examples/environments/Byggfile.yml.

Shell tab completions

TL;DR: bygg --completions

Bygg has support for Bash and Zsh tab completions of arguments and entrypoint actions. The completions will be loaded:

  • from Byggfile.py if Byggfile.yml doesn't exist, or if there are no environments declared in Byggfile.yml.
  • from Byggfile.yml if it exists. If it has environments, each environment will be installed if needed and its respective Byggfile evaluated to collect all entrypoint actions.

To install completions, do:

bygg --completions

It will output a line that you can then add to .bashrc or .zshrc.

Don't forget to open a new shell instance after you've made changes to the settings files.

Manual steps

Add the following line to .bashrc or .zshrc:

eval "$(.your_bygg_venv/bin/register-python-argcomplete .your_bygg_venv/bin/bygg)"
Note for Zsh + argcomplete v2 users

The recommended setup above uses the argcomplete that is installed with Bygg, since this version (starting with v3) has proper support for Zsh so that the action completions will show descriptions. If you for whatever reason need to use a lower version of argcomplete you need to load the Bash compatibility layer first, and then the Bygg completions:

autoload -U bashcompinit ; bashcompinit
eval "$(register-python-argcomplete bygg)"

Getting a local copy

If you want to try out the examples or even develop Bygg itself, Bygg can be tried out and worked on without installing it globally:

First, clone this repo and cd into it, then execute the commands below.

If uv is installed (e.g. with pipx install uv), it will be used by bootstrap.py and the Bygg examples where relevant. This will speed up project setup and test running. If uv is not installed, regular pip will be used.

# Create a virtual environment and install Bygg into it together with its dependencies:
./bootstrap.py
# Activate the virtual environment:
. .venv/bin/activate

Now you can try out one of the examples:

cd examples/trivial
bygg transform

In the above, bygg is the command to execute bygg, and transform is an action (much like a target in a Makefile). See examples/trivial/Byggfile.py for details.

The target can be cleaned with

bygg transform --clean

Development

Running tests

With Bygg's virtual environment activated per above, tests can be run from the root directory:

pytest

With the virtual environment deactivated, the full test suite can be run with Nox. Nox should be installed outside of Bygg's virtual environment since it manages its own virtual environments:

pipx install nox

or

pip install --user --upgrade nox

After that, run tests with

nox

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

bygg-0.5.4.tar.gz (59.3 kB view details)

Uploaded Source

Built Distribution

bygg-0.5.4-py3-none-any.whl (37.6 kB view details)

Uploaded Python 3

File details

Details for the file bygg-0.5.4.tar.gz.

File metadata

  • Download URL: bygg-0.5.4.tar.gz
  • Upload date:
  • Size: 59.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: python-httpx/0.27.0

File hashes

Hashes for bygg-0.5.4.tar.gz
Algorithm Hash digest
SHA256 00577b9ab69977b910de6009ed13d7306de9a676015bf23451d1bcdfd14e86df
MD5 aeab475336eb225f29548a8d63efb5a2
BLAKE2b-256 d17edf035ee895b5e6d655781e0546374fae30680f439faf8da1b717c1a1f632

See more details on using hashes here.

File details

Details for the file bygg-0.5.4-py3-none-any.whl.

File metadata

  • Download URL: bygg-0.5.4-py3-none-any.whl
  • Upload date:
  • Size: 37.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: python-httpx/0.27.0

File hashes

Hashes for bygg-0.5.4-py3-none-any.whl
Algorithm Hash digest
SHA256 ef2ddb2182ba0094317440b7af739fe74f3ad15cc417559828ce9138dab2ee1b
MD5 b96472ded870853598ee9161c1aea930
BLAKE2b-256 2da6ac3d2e81d79db84514b0b1b2131ddf0923b829a77f1f0abdefa8eabbb380

See more details on using hashes here.

Supported by

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