PEP 517 / PEP 660 build backend for Mojo libraries (compiles .mojo → .mojopkg → wheel).
Project description
mojox-build
PEP 517 + PEP 660 build backend that compiles a Mojo library into a .whl.
Quickstart
# pyproject.toml
[project]
name = "boucle"
version = "0.2.0"
description = "Async event loop primitives for Mojo"
readme = "README.md"
license = "Apache-2.0"
requires-python = ">=3.10"
dependencies = ["mojox", "mojo-compiler>=0.26,<0.27"]
[build-system]
requires = ["mojox-build>=0.2", "mojo-compiler>=0.26,<0.27"]
build-backend = "mojox_build"
[tool.mojox-build]
# Either a src/ layout (default):
package-root = "src"
# Or an explicit list of packages at the repo root:
# packages = ["boucle"]
uv build produces dist/boucle-0.2.0-py3-none-<platform>.whl containing boucle.mojopkg at boucle-0.2.0.data/platlib/mojo_packages/boucle.mojopkg. When installed, it lands in the venv's site-packages/mojo_packages/, which mojox discovers automatically.
[tool.mojox-build] reference
| Key | Type | Default | Purpose |
|---|---|---|---|
package-root |
str | "src" |
Directory containing top-level package dirs to compile. |
packages |
list[str] | (auto-scan package-root) |
Explicit list of source directories. Each becomes one .mojopkg. |
native-libs |
list[str] | [] |
Pre-built .so / .dylib files to copy into mojo_packages/lib/. |
defines |
table | {} |
-D KEY=VALUE flags passed to mojo package. |
flags |
list[str] | [] |
Extra flags appended to every mojo package invocation. |
source-include |
list[str] | (sensible default) | Glob patterns of files to include in the sdist. |
source-exclude |
list[str] | [] |
Glob patterns to exclude from the sdist. |
wheel-exclude |
list[str] | [] |
Glob patterns to exclude from the wheel. |
What you get
- Platform-tagged wheels.
.mojopkgis compiled native code, so wheels are tagged with the host platform (e.g.manylinux_2_34_x86_64,macosx_13_0_arm64). Cross-platform installs are correctly rejected by uv/pip. - Native lib bundling. Drop
.so/.dylibpaths innative-libs; they ride along inmojo_packages/lib/, where mojox's runtime adds them toLD_LIBRARY_PATH. - PEP 660 editable installs.
uv pip install -e .works. For rebuild-on-change semantics, addcache-keys = [{ file = "pyproject.toml" }, { file = "**/*.mojo" }]to[tool.uv]. - Reproducible builds. ZIP and tar timestamps respect
SOURCE_DATE_EPOCH. - Parallel compilation. Multi-package repos compile their
.mojopkgfiles in parallel (capped at 8 workers). - Preflight checks. Missing
mojo, missing dirs, missing native libs, dynamic-version configs → one clean error message, not a stderr dump. - Full PEP 621 / PEP 639 metadata.
authors,maintainers,urls,keywords,classifiers,optional-dependencies,license-files(copied into.dist-info/licenses/) all flow into the wheel METADATA. --config-setting verbose=true. Streamsmojo packageoutput during builds when you need to debug.
How it works (architecture in five lines)
__init__.py re-exports the hook surface. _hooks is thin glue that calls into _config (parse pyproject), _preflight (environment checks), _build (compile + assemble), and _metadata (METADATA/WHEEL rendering). The whole backend has only one runtime dep beyond the stdlib: packaging for platform tags.
Limitations / known gaps
- Dynamic
project.versionis not supported. Declare it statically. - Editable installs rebuild the full wheel on every invocation; there's no source-import fast path because
.mojopkgis compiled bytecode. - Cross-compilation (
--targetper platform) is not exposed yet. Today's wheels are host-platform only.
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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file mojox_build-0.2.0.tar.gz.
File metadata
- Download URL: mojox_build-0.2.0.tar.gz
- Upload date:
- Size: 8.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.14 {"installer":{"name":"uv","version":"0.11.14","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
823c49edf0b15b40978e9eb33e6a6b4565bf2bdf63d35cac87d161727e1faf8e
|
|
| MD5 |
f8ed6409ec6fed6cc4a00f1f26759194
|
|
| BLAKE2b-256 |
d0365bc6fed3be8bdd33f4b4a9eec07851623c6cbbe4ca325459cf0579d24426
|
File details
Details for the file mojox_build-0.2.0-py3-none-any.whl.
File metadata
- Download URL: mojox_build-0.2.0-py3-none-any.whl
- Upload date:
- Size: 11.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.14 {"installer":{"name":"uv","version":"0.11.14","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7c1062201c992488afcbb2908052a0ee2abd4ed25a1dbf5683948527e93b6487
|
|
| MD5 |
3639aeb102f0ccf67dde9e9630636c2a
|
|
| BLAKE2b-256 |
730d14d5ccea46fe96527bb3ba560072ed5479f1dd82f0b47d5597dd0aaf0502
|