Skip to main content

cppboot

cppboot scaffolds a complete, opinionated C++ project so you can start shipping code instead of wiring build systems.

pip install cppboot
cppboot -n myproj
cd myproj && make && make test

CI PyPI Python versions License

Documentation: bluesentinelsec.github.io/cppboot — including the Android (--with-android-ci), iOS (--with-ios-ci), and Web/Emscripten (--with-web-ci) package guides.


Requirements

Python 3.9 or newer
Generated projects CMake 3.20+ (3.28+ with --with-modules), a C++20 compiler, Ninja recommended

Optional tools used when present: git, clang-format, make / ninja, doxygen, ctags, GitHub CLI (gh).


Install

pip install cppboot

Upgrade:

pip install -U cppboot

Quick start

cppboot -n myproj
cd myproj
make          # Debug build
make test
./myproj --version

On Windows (Developer Command Prompt or any shell with cmake on PATH):

build.bat
build.bat test

Create a public GitHub remote in one step (requires authenticated gh):

cppboot -n myproj --github

What you get

Each project is ready for multi-platform development and release:

Area Included
Build CMake (C++20), GNU Makefile, Windows build.bat, CMakePresets.json
Versioning Root VERSION file (single source of truth) → CMake, CLI --version, release checks
Library + app Static library by default (--shared optional), thin src/main.cpp entrypoint
Sample API Version component with unit tests and a microbenchmark
Deps FetchContent (on by default): CLI11, nlohmann/json, spdlog, GoogleTest, Google Benchmark
Quality Microsoft .clang-format, Google C++ style for code, warnings-as-errors, .clangd
Docs Doxygen Doxyfile, README.md, AGENTS.md for humans and coding agents
IDE VS Code (clangd, CMake Tools, CodeLLDB, C++ TestMate), optional Vim + ctags
CI/CD GitHub Actions: multi-OS CI, sanitizers, tag/dispatch Release with zip assets; optional Android (--with-android-ci), iOS (--with-ios-ci), and Web/Emscripten (--with-web-ci) pipelines
Community CODE_OF_CONDUCT.md, CONTRIBUTING.md, SECURITY.md
Bootstrap make fmt then git init + initial commit (when tools are available)

C++20 modules: cppboot -n myproj --with-modules scaffolds module interface units (no classic include/ tree for the sample API). CI installs module-capable toolchains on Linux/macOS.


CLI

cppboot [-n NAME] [options]

Core options

Flag Default Description
-n, --name (prompt) Project / program name
--license apache-2.0 apache-2.0, mit, bsd-3-clause, gpl-3.0, lgpl-3.0, mpl-2.0, zlib, unlicense
--build-system cmake Only cmake is supported
--with-modules off C++20 modules layout
--with-android-ci off Android Prefab AAR package: android/ Gradle project, emulator device tests, Android CI + release jobs (not compatible with --with-modules)
--with-ios-ci off iOS XCFramework package: build/verify scripts, Simulator package tests, iOS CI + release jobs (not compatible with --with-modules)
--with-web-ci off Web/Emscripten package: HTML5 canvas game demo, browser tests in headless Chrome, web CI + release jobs (not compatible with --with-modules)
--shared off Shared library instead of static
--github off Create a public remote with gh and push
--output-dir . Parent directory for the new project folder
-v, --verbose off Verbose logging
--version Print cppboot version
-h, --help Help

Opt-outs (features are on unless disabled)

Flag Effect
--no-vim Skip project-local .vimrc
--no-ctags Skip Universal Ctags config / make tags
--no-vscode Skip VS Code config and CMake presets
--no-github-actions Skip CI, sanitizers, and release workflows
--no-codespaces Skip Dev Container / Codespaces config
--no-community-docs Skip CoC / CONTRIBUTING / SECURITY
--no-git Skip git init and the initial commit
--no-fmt Skip make fmt after scaffolding

Examples:

cppboot -n service --license mit
cppboot -n libdemo --shared --no-vscode
cppboot -n moddemo --with-modules
cppboot -n droidlib --with-android-ci
cppboot -n applelib --with-ios-ci
cppboot -n webgame --with-web-ci
cppboot -n portable --with-android-ci --with-ios-ci --with-web-ci
cppboot -n tool --github --output-dir ~/src

Android (--with-android-ci): adds an android/ Gradle project that packages the library as a Prefab AAR (arm/x86_64 ABIs), a consumer test app with on-device native tests, and GitHub Actions jobs that build the AAR, verify its contents, and run the tests on an emulator. Releases attach <name>-android-release-<version>.aar. Local builds need JDK 17 + the Android SDK; Gradle fetches the pinned NDK and CMake automatically.

iOS (--with-ios-ci): adds scripts that package the library as a static XCFramework (device arm64 + simulator arm64/x86_64, headers included), a Simulator test app consuming the package, and GitHub Actions jobs that build, verify, and test it. Releases attach <name>-ios-xcframework-release-<version>.zip. Local builds need macOS with Xcode command line tools.

Web (--with-web-ci): adds a game-development-oriented Emscripten scaffold — an HTML5 canvas demo built around emscripten_set_main_loop with a custom fullscreen-canvas shell (plus commented hooks for --preload-file assets and SDL2), browser tests (GoogleTest compiled to wasm) run in headless Chrome, and GitHub Actions jobs for both. Releases attach <name>-web-wasm32-release-<version>.zip containing the wasm library, headers, and the playable demo. Local builds need an activated Emscripten SDK.


Generated project workflow

After scaffolding, day-to-day commands (Unix / make):

Command Purpose
make / make debug Configure and build Debug
make release Configure and build Release
make test Unit tests (Debug)
make bench Microbenchmarks (Release)
make sanitizer ASan+UBSan (Linux-oriented)
make fmt clang-format
make doc Doxygen HTML under docs/html
make clean Remove build trees

Windows: the same targets via build.bat / build.bat release / build.bat test, etc.

Versioning: edit the root VERSION file only (e.g. 1.2.3). CMake regenerates the version API; the Release workflow requires the Git tag to match.

Releases (generated repos): push tag vX.Y.Z or run the Release workflow; multi-OS zips attach to the GitHub Release when CI succeeds.


Library usage (Python)

from pathlib import Path
from cppboot import ProjectOptions, generate_project

result = generate_project(
    ProjectOptions(
        name="myproj",
        root=Path.cwd(),
        with_git=True,
        with_fmt=True,
    )
)
print(result.project_dir)

Contributing to cppboot

Clone and develop in an editable environment:

git clone https://github.com/bluesentinelsec/cppboot.git
cd cppboot
python3 -m pip install -e ".[dev]"
python3 -m pytest -q
python3 -m ruff check src tests
python3 -m mypy

Package version is defined in src/cppboot/_version.py. Releases are cut from main with an annotated GitHub tag vX.Y.Z (must match that version); CI publishes the wheel/sdist to PyPI.

See CHANGELOG.md for release history.


License

Apache License 2.0. See LICENSE.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

cppboot-0.3.3.tar.gz (126.2 kB view details)

Uploaded Source

Built Distribution

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

cppboot-0.3.3-py3-none-any.whl (128.8 kB view details)

Uploaded Python 3

File details

Details for the file cppboot-0.3.3.tar.gz.

File metadata

  • Download URL: cppboot-0.3.3.tar.gz
  • Upload date:
  • Size: 126.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for cppboot-0.3.3.tar.gz
Algorithm Hash digest
SHA256 5a51889acab6ccfd56f3ee9a72d22f45e17f63f28400a6e05972794d07a9ca8e
MD5 2ae7df99e088ca9244e11b94ad6da1cf
BLAKE2b-256 c2e100e2838db60abe714ccf15ad500160bb9a1080ecb4fb6cf00b0dedb9ab91

See more details on using hashes here.

Provenance

The following attestation bundles were made for cppboot-0.3.3.tar.gz:

Publisher: publish.yml on bluesentinelsec/cppboot

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file cppboot-0.3.3-py3-none-any.whl.

File metadata

  • Download URL: cppboot-0.3.3-py3-none-any.whl
  • Upload date:
  • Size: 128.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for cppboot-0.3.3-py3-none-any.whl
Algorithm Hash digest
SHA256 5058fe8cb048ac37c24f9e71cecc8dde0420d5310481cf83f033915043470bee
MD5 6ba5c87f1aea208782827bb494f2c88d
BLAKE2b-256 0915c866b786dd7aeff0ad8eed8ca2f5db19138676d3b13a53e6fc3db816e392

See more details on using hashes here.

Provenance

The following attestation bundles were made for cppboot-0.3.3-py3-none-any.whl:

Publisher: publish.yml on bluesentinelsec/cppboot

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

This release

0.3.3 This release

2 files

0.3.2

2 files

0.3.1

2 files

0.3.0

2 files

0.2.3

2 files

0.2.2

2 files

0.2.1

2 files

0.2.0

2 files

0.1.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page