Skip to main content

A Python-based build system that generates Ninja files

Project description

Pcons

A modern Python-based build system that generates Ninja (or Makefile) build files.

CI

Overview

Pcons is inspired by SCons and CMake, taking 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.)

Status

🚧 Under active development - ready for experimentation and feedback.

Core functionality is working: C/C++ compilation, static and shared libraries, programs, and install targets. See ARCHITECTURE.md for design details.

Quick Example

# pcons-build.py
from pcons.core.project import Project
from pcons.toolchains import find_c_toolchain

project = Project("myapp", build_dir="build")

# Find and configure a C/C++ toolchain
toolchain = find_c_toolchain()
env = project.Environment(toolchain=toolchain)
env.cc.flags.extend(["-Wall"])

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

# Build a program
app = project.Program("myapp", env)
app.sources.append(project.node("src/main.c"))
app.link(lib)

project.Default(app)
project.resolve()
project.generate()
uv run pcons-build.py
ninja -C build

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:

# Using uv
uv add pcons

# Or pip
pip install pcons

For development:

git clone https://github.com/garyo/pcons.git
cd pcons
uv sync

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/

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.6.0.tar.gz (438.0 kB view details)

Uploaded Source

Built Distribution

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

pcons-0.6.0-py3-none-any.whl (240.4 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: pcons-0.6.0.tar.gz
  • Upload date:
  • Size: 438.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for pcons-0.6.0.tar.gz
Algorithm Hash digest
SHA256 e37ebb25bf074f3bafb3f62173819b251e481ce2c9f6a1fc25420911adc6e3a4
MD5 4fa2a15911d276f081f68b168c2fe02e
BLAKE2b-256 1f48ef6bb628adbb47c5bb06d0e4d146e83e04f983c133e8fdeeb615be54c46c

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for pcons-0.6.0-py3-none-any.whl
Algorithm Hash digest
SHA256 ab0a382f2e5ccd130d62ee0b367d3466e5a8e1bd295dfb9a790bd7fc8d985aa2
MD5 107971698c114a09ff47b7f683c09e82
BLAKE2b-256 c61b83fd41af9a7172f4b7b985e33b3b88166e4d91b1f22e91a1d14b344716e3

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