Skip to main content

A cross-platform software build system, configured in Python, that generates Ninja files

Project description

Pcons

A modern open-source cross-platform zero-install Python-based build system. Builds anything that requires a repeatable workflow, using a dependency graph. Easy to use, reliable and quick. Uses Ninja (or Makefile, XCode, or MSVS) to do the builds. Optimized for C/C++, Fortran, CUDA, wasm etc. but should work for anything that needs building.

CI codecov PyPI PyPI Downloads Python Doc Status

Overview

Pcons is inspired by SCons and CMake, taking a few of the best ideas from each:

  • From SCons: Environments, Tools, dependency tracking, Python as the configuration language
  • From CMake: Generator architecture (configure once, build fast), usage requirements that propagate through dependencies

Key design principles:

  • Configuration, not execution: Pcons generates Ninja files; Ninja executes the build
  • Python is the language: No custom DSL—build scripts are real Python with full IDE support
  • Language-agnostic: Build C++, Rust, LaTeX, protobuf, or anything else
  • Explicit over implicit: Dependencies are discoverable and traceable
  • Extensible: Add-on modules for domain-specific tasks (plugin bundles, SDK configuration, etc.)

Why another software build tool?

I was one of the original developers of SCons, and helped maintain it for many years. I love that python is the config language; that makes build descriptions incredibly flexible and powerful. Recently I've been using CMake for more projects, and despite the deeply painful configuration language, I've come to appreciate its power: conan integration, the separation between describing the build andrunning it, and dependency propagation, among other things. I feel that SCons hasn't kept up with modern python; like any very widely used mature project, it has a lot of accumulated wisdom but also a bit ossified ways of doing things.

I've been thinking for years now about rearchitecting SCons onto a modern python stack with Path and decorators and all the other wonderful stuff python has been doing, and fixing some of the pain points at the same time (substitution/quoting, extensibility, tracing, separation between description and building, and more), but I've never had the time to dig into it. But recently as I've been using a lot more of Claude Code as a programming assistant, and it has gotten significantly better, it seemed like the right time to try this as a collaborative project. So, meet pcons!

Here's a comparison between pcons and other common modern build tools. I think pcons fills a real need, for a general-purpose broadly applicable extensible software build tool using a modern well-known language to describe builds and tools.

Status

Ready for small-scale production use - and still under active development, so feedback is very welcome. It's working in several medium-sized projects.

Core functionality is working and well tested: C/C++/Fortran compilation, static and shared libraries, programs, install targets, installers (Win/Mac), and mixed-language builds. See ARCHITECTURE.md for design details.

Rust / Go interop (experimental)

There's working code on a branch for linking Rust crates into C/C++ projects — pcons drives cargo build and links the resulting library, with optional cbindgen header generation. Go support is straightforward to add on the same pattern. If you have a mixed-language project that would benefit, open an issue and I'll point you at the branch — your feedback will help shape it before merging.

Quick Example

# pcons-build.py
from pcons import Project, find_c_toolchain

project = Project("myapp")
env = project.Environment(toolchain=find_c_toolchain())
env.cc.flags.extend(["-Wall"])

# Build a static library
lib = project.StaticLibrary("core", env, sources=["src/core.c"])
lib.public.include_dirs.append("include")

# Build a program that links the library
app = project.Program("myapp", env, sources=["src/main.c"])
app.private.link_libs.append(lib)

project.generate()
uvx pcons # generate ninja.build and run it, producing build/myapp (or build/myapp.exe)

Installation

No installation needed, if you have uv; just use uvx pcons to configure and build. uvx pcons --help for more info. If you want to install it, though:

# Install as a CLI tool (recommended)
uv tool install pcons
pcons ...

# Or add to a project's dependencies
uv add pcons

# Or with pip
pip install pcons

Verifying Release Signatures

Release artifacts on the GitHub Releases page are signed with Sigstore using short-lived certificates issued via GitHub Actions OIDC; transparency-log records are stored at rekor.sigstore.dev. Each .tar.gz and .whl has a matching .sigstore.json bundle. To verify with cosign:

cosign verify-blob \
  pcons-x.y.z.tar.gz \
  --bundle pcons-x.y.z.tar.gz.sigstore.json \
  --new-bundle-format \
  --certificate-identity-regexp='https://github.com/DarkStarSystems/pcons/.*' \
  --certificate-oidc-issuer='https://token.actions.githubusercontent.com'

Documentation

Development

# Run tests
uv run pytest

# Run linter
make lint

# Format code
make fmt

# Or use uv directly
uv run ruff check pcons/
uv run mypy pcons/

This Project is AI-Assisted

PCons is my long-term vision for a modern build tool. I've used Claude Code extensively to assist in creating this project, mostly Claude Opus 4.6. It has been a huge help in realizing the vision I've had for a long time. If you reflexively or morally reject all AI-generated or AI-assisted code, pcons is not for you. That said, I've reviewed every decision and nearly every line, and this code reflects my vision, my architecture, my goals and my priorities. I take full responsibility for it, and as a professional software engineer with 40+ years of C/C++/python experience I stand behind it. I also intend to support it long-term.

One of my sub-goals has been to make sure the documentation and source organization is clear; not just for humans but for browsing by AI agents. I want to make it easy for a human or an AI agent to create a best-practices pcons-build.py for your project quickly and easily. Using AI to auto-generate doc and making sure APIs are clean and consistent helps with that goal.

License

MIT License - see LICENSE

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

pcons-0.20.1.tar.gz (3.1 MB view details)

Uploaded Source

Built Distribution

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

pcons-0.20.1-py3-none-any.whl (387.4 kB view details)

Uploaded Python 3

File details

Details for the file pcons-0.20.1.tar.gz.

File metadata

  • Download URL: pcons-0.20.1.tar.gz
  • Upload date:
  • Size: 3.1 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.6

File hashes

Hashes for pcons-0.20.1.tar.gz
Algorithm Hash digest
SHA256 783ac93a2dd03bb9fe1e35ad248a863b8c1bb93ab7f8ef34c3e01c942ae86166
MD5 50b5db94441e82bdcdda7a573077b024
BLAKE2b-256 e8fcd9257a2553793e22f212802e2675e2b3b35936913e5f718d14fcf9a8f84f

See more details on using hashes here.

File details

Details for the file pcons-0.20.1-py3-none-any.whl.

File metadata

  • Download URL: pcons-0.20.1-py3-none-any.whl
  • Upload date:
  • Size: 387.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.6

File hashes

Hashes for pcons-0.20.1-py3-none-any.whl
Algorithm Hash digest
SHA256 33844aa7307ac388ef651ab5d55cdc9a8acd9389825761bae3af153cecd67b80
MD5 bfa76750d996db63d60cb237d34e9ff9
BLAKE2b-256 e5ebd04e4b9e01a6acf70e89b21e8fbf2ed367c6257f49ab578fb590894ea799

See more details on using hashes here.

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