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!
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.
- 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.
Bygg requires Python 3.11 or 3.12.
Install with
pip install bygg
or
pipx install bygg
or in a virtual environment.
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.
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
.
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
ifByggfile.yml
doesn't exist, or if there are no environments declared inByggfile.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)"
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
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