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, powerful 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

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

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

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

# Find and configure a C/C++ toolchain
toolchain = find_c_toolchain()
env = project.Environment(toolchain=toolchain)
env.cc.flags.extend(["-O2", "-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()
python build.py
ninja -C build

Installation

# Using uv (recommended)
uv add pcons

# Or pip
pip install pcons

For development:

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

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/

Documentation

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.1.0.tar.gz (228.2 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.1.0-py3-none-any.whl (121.1 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for pcons-0.1.0.tar.gz
Algorithm Hash digest
SHA256 b2b6f18fb847946b3eb392ffc55b7fae2575cdb6b39cf0f469e7d9e869b74bfb
MD5 bc59e67aa42bc39a626b14137812b068
BLAKE2b-256 b71b165172d21f8fc7329c3a3e958e09f86d8ef82b7ae9f4db2523da956aa1d6

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pcons-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 121.1 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.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 48e0d7585e8d8dc388963a87c89c8b4ba69162f7b26eb20cdace14b97ac276ed
MD5 12dfcbc7e2d0124abcaadb4681a108d2
BLAKE2b-256 f2034416a0d6e818caad35b2893f06265f53197495d06097541c3c1c07d9513d

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