Prerequisites
You need four things: a Rust toolchain, a C linker, uv, and Git. Node is
needed only if you are working on the documentation site.
Install
Section titled “Install”xcode-select --install # clang + linkercurl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | shcurl -LsSf https://astral.sh/uv/install.sh | shGit ships with the Command Line Tools installed by the first command.
Debian / Ubuntu
Section titled “Debian / Ubuntu”sudo apt-get update && sudo apt-get install -y build-essential git curlcurl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | shcurl -LsSf https://astral.sh/uv/install.sh | shbuild-essential is not optional: it supplies cc, which rustc invokes
as its linker. Without it every Rust build fails at the link step with
linker 'cc' not found.
Windows
Section titled “Windows”Use WSL2 and follow the Debian/Ubuntu instructions. The nightly workflow
runs the core crate’s tests on windows-latest and macos-latest, but
the Python extension is built and tested on ubuntu-latest only, so a
native Windows build of the bindings is unverified by this project.
Verify
Section titled “Verify”rustc --version && cargo --version && uv --version && git --versionVersion floors, and why
Section titled “Version floors, and why”| Tool | Floor | Where it is declared | Why |
|---|---|---|---|
| Rust | the pinned toolchain | rust-toolchain.toml (channel = "1.98.1") | rustup reads rust-toolchain.toml in the repository root, so local builds and every CI job use the same compiler and the same clippy lints. No rust-version (MSRV) key is declared in any Cargo.toml; the pinned version is the only one CI proves. |
| Python | 3.11 minimum, 3.13 recommended | requires-python = ">=3.11" in pyproject.toml | 3.11 is the floor the package metadata enforces at install time. The python jobs in .github/workflows/ci.yml build and test the extension on both 3.11 and 3.13 on every PR; 3.13 is what the justfile develops on. 3.12 is not tested. |
uv | any recent release | not pinned | Every just py-* recipe shells out to uv, and CI installs it via astral-sh/setup-uv@v7. It is the project’s only supported way to create the Python environment. |
| Node | 22.12 | not pinned (CI builds the site with Bun via oven-sh/setup-bun@v2) | Docs site only. Astro 7 requires Node 22.12 or later; Bun works too. |
| Bun | latest | oven-sh/setup-bun@v2 in docs-pages.yml | Docs site only, and optional — see below. |
Rust dependencies that move together
Section titled “Rust dependencies that move together”The Python extension crate (pyopenquant) passes polars DataFrames through
pyo3-polars 0.28, which is built for one polars release (0.55) and one PyO3
release (0.29). The three are upgraded together, and openquant uses the same
polars. The extension takes a frame from Python polars through
Series._export, so it needs Python polars 1.28.1 or later (the
pyproject.toml lower bound). Everything comes from crates.io; nothing is
vendored.
- Local Build Setup — build and test the Rust core
- Python Bindings Setup — build and import the Python package