hatch-cpp
Hatch plugin for C++ builds
Overview
A simple, extensible C++ build plugin for hatch.
[tool.hatch.build.hooks.hatch-cpp]
libraries = [
{name = "project/extension", sources = ["cpp/project/basic.cpp"], include-dirs = ["cpp"]}
]
For more complete systems, see:
Configuration
Configuration is driven from the [tool.hatch.build.hooks.hatch-cpp] hatch hook configuration field in a pyproject.toml.
It is designed to closely match existing Python/C/C++ packaging tools.
verbose = true
libraries = { Library Args }
cmake = { CMake Args }
platform = { Platform, either "linux", "darwin", or "win32" }
See the test cases for more concrete examples.
hatch-cpp is driven by pydantic models for configuration and execution of the build.
These models can themselves be overridden by setting build-config-class / build-plan-class.
Library Arguments
name = "mylib"
sources = [
"path/to/file.cpp",
]
language = "c++"
binding = "cpython" # or "pybind11", "nanobind", "generic"
std = "" # Passed to -std= or /std:
include_dirs = ["paths/to/add/to/-I"]
library_dirs = ["paths/to/add/to/-L"]
libraries = ["-llibraries_to_link"]
extra_compile_args = ["--extra-compile-args"]
extra_link_args = ["--extra-link-args"]
extra_objects = ["extra_objects"]
define_macros = ["-Ddefines_to_use"]
undef_macros = ["-Uundefines_to_use"]
py_limited_api = "cp39" # limited API to use
CMake Arguments
hatch-cpp has some convenience integration with CMake.
Though this is not designed to be as full-featured as e.g. scikit-build, it should be satisfactory for many small projects.
root = "path/to/cmake/root"
build = "path/to/cmake/build/folder"
install = "path/to/cmake/install/folder"
cmake_arg_prefix = "MYPROJECT_"
cmake_args = {} # any other cmake args to pass
cmake_env_args = {} # env-specific cmake args to pass
include_flags = {} # include flags to pass -D
CLI
hatch-cpp is integrated with hatch-build to allow easy configuration of options via command line:
hatch-build \
-- \
--verbose \
--platform linux \
--vcpkg.vcpkg a/path/to/vcpkg.json \
--libraries.0.binding pybind11 \
--libraries.0.include-dirs cpp,another-dir
This CLI is aware of your pyproject.toml-configured setup.
To display help for this, run (note the passthrough --):
hatch-build -- --help
For example, for the test_project_basic in this project's tests folder:
hatch-build --hooks-only -- --help
[sdist]
[wheel]
[2025-11-11T17:31:06-0500][p2a][WARNING]: Only dicts with str, int, float, bool, or enum values are supported - field `cmake_env_args` got value type typing.Dict[str, str]
usage: hatch-build-extras-model [-h] [--verbose] [--name NAME] [--libraries.0.name LIBRARIES.0.NAME]
[--libraries.0.sources.0 LIBRARIES.0.SOURCES.0] [--libraries.0.sources LIBRARIES.0.SOURCES]
[--libraries.0.language LIBRARIES.0.LANGUAGE] [--libraries.0.binding LIBRARIES.0.BINDING]
[--libraries.0.std LIBRARIES.0.STD] [--libraries.0.include-dirs.0 LIBRARIES.0.INCLUDE_DIRS.0]
[--libraries.0.include-dirs LIBRARIES.0.INCLUDE_DIRS]
[--libraries.0.library-dirs LIBRARIES.0.LIBRARY_DIRS]
[--libraries.0.libraries LIBRARIES.0.LIBRARIES]
[--libraries.0.extra-compile-args LIBRARIES.0.EXTRA_COMPILE_ARGS]
[--libraries.0.extra-link-args LIBRARIES.0.EXTRA_LINK_ARGS]
[--libraries.0.extra-objects LIBRARIES.0.EXTRA_OBJECTS]
[--libraries.0.define-macros LIBRARIES.0.DEFINE_MACROS]
[--libraries.0.undef-macros LIBRARIES.0.UNDEF_MACROS]
[--libraries.0.export-symbols LIBRARIES.0.EXPORT_SYMBOLS]
[--libraries.0.depends LIBRARIES.0.DEPENDS]
[--libraries.0.py-limited-api LIBRARIES.0.PY_LIMITED_API] [--cmake.root CMAKE.ROOT]
[--cmake.build CMAKE.BUILD] [--cmake.install CMAKE.INSTALL]
[--cmake.cmake-arg-prefix CMAKE.CMAKE_ARG_PREFIX] [--cmake.cmake-args CMAKE.CMAKE_ARGS]
[--cmake.include-flags CMAKE.INCLUDE_FLAGS] [--platform.cc PLATFORM.CC]
[--platform.cxx PLATFORM.CXX] [--platform.ld PLATFORM.LD] [--platform.platform PLATFORM.PLATFORM]
[--platform.toolchain PLATFORM.TOOLCHAIN] [--platform.disable-ccache] [--vcpkg.vcpkg VCPKG.VCPKG]
[--vcpkg.vcpkg-root VCPKG.VCPKG_ROOT] [--vcpkg.vcpkg-repo VCPKG.VCPKG_REPO]
[--vcpkg.vcpkg-triplet VCPKG.VCPKG_TRIPLET] [--build-type BUILD_TYPE] [--commands COMMANDS]
options:
-h, --help show this help message and exit
--verbose
--name NAME
--libraries.0.name LIBRARIES.0.NAME
--libraries.0.sources.0 LIBRARIES.0.SOURCES.0
--libraries.0.sources LIBRARIES.0.SOURCES
--libraries.0.language LIBRARIES.0.LANGUAGE
--libraries.0.binding LIBRARIES.0.BINDING
--libraries.0.std LIBRARIES.0.STD
--libraries.0.include-dirs.0 LIBRARIES.0.INCLUDE_DIRS.0
--libraries.0.include-dirs LIBRARIES.0.INCLUDE_DIRS
--libraries.0.library-dirs LIBRARIES.0.LIBRARY_DIRS
--libraries.0.libraries LIBRARIES.0.LIBRARIES
--libraries.0.extra-compile-args LIBRARIES.0.EXTRA_COMPILE_ARGS
--libraries.0.extra-link-args LIBRARIES.0.EXTRA_LINK_ARGS
--libraries.0.extra-objects LIBRARIES.0.EXTRA_OBJECTS
--libraries.0.define-macros LIBRARIES.0.DEFINE_MACROS
--libraries.0.undef-macros LIBRARIES.0.UNDEF_MACROS
--libraries.0.export-symbols LIBRARIES.0.EXPORT_SYMBOLS
--libraries.0.depends LIBRARIES.0.DEPENDS
--libraries.0.py-limited-api LIBRARIES.0.PY_LIMITED_API
--cmake.root CMAKE.ROOT
--cmake.build CMAKE.BUILD
--cmake.install CMAKE.INSTALL
--cmake.cmake-arg-prefix CMAKE.CMAKE_ARG_PREFIX
--cmake.cmake-args CMAKE.CMAKE_ARGS
--cmake.include-flags CMAKE.INCLUDE_FLAGS
--platform.cc PLATFORM.CC
--platform.cxx PLATFORM.CXX
--platform.ld PLATFORM.LD
--platform.platform PLATFORM.PLATFORM
--platform.toolchain PLATFORM.TOOLCHAIN
--platform.disable-ccache
--vcpkg.vcpkg VCPKG.VCPKG
--vcpkg.vcpkg-root VCPKG.VCPKG_ROOT
--vcpkg.vcpkg-repo VCPKG.VCPKG_REPO
--vcpkg.vcpkg-triplet VCPKG.VCPKG_TRIPLET
--build-type BUILD_TYPE
--commands COMMANDS
Environment Variables
hatch-cpp will respect standard environment variables for compiler control, e.g. CC, CXX, LD, CMAKE_GENERATOR, OSX_DEPLOYMENT_TARGET, etc.
Pyodide
Pyodide builds are detected from PYODIDE_ABI_VERSION. The hook preserves Pyodide's Emscripten compiler wrappers, gives extension modules CPython's Emscripten suffix, and emits the corresponding pyemscripten wheel platform tag. No project-specific build hook is required.
[tool.hatch.build.hooks.hatch-cpp]
libraries = [
{name = "project/extension", sources = ["cpp/extension.cpp"], binding = "pybind11"},
]
[tool.cibuildwheel.pyodide]
test-command = "python -c 'from project.extension import answer; assert answer() == 42'"
When a vcpkg.json manifest is active, Emscripten builds use vcpkg's wasm32-emscripten community triplet. Package support varies by port.
Metadata
Release files for hatch-cpp 0.5.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| hatch_cpp-0.5.2.tar.gz | 30.4 kB | Without provenance | Details for hatch_cpp-0.5.2.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| hatch_cpp-0.5.2-py3-none-any.whl | Python 3 | none | any | Details for hatch_cpp-0.5.2-py3-none-any.whl |
Total release size: 83.4 kB
Release files / hatch_cpp-0.5.2.tar.gz
| Download URL | hatch_cpp-0.5.2.tar.gz |
|---|---|
| Size | 30.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
25db8166be2ab64f3d8e87b34b6ce04db1729de74163bbb64ed483d3d9d02c70
|
|
BLAKE2b-256 checksum How to use checksums |
c5d6f4ab0bb9f43f46c49beef70b9e35965e05c9100fe258d4073c9e148e630d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.15
|
Release files / hatch_cpp-0.5.2-py3-none-any.whl
| Download URL | hatch_cpp-0.5.2-py3-none-any.whl |
|---|---|
| Size | 53.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
265f229e8ddbc98197202ba4de066577dac421b3984308267f1c9a9490a7ad89
|
|
BLAKE2b-256 checksum How to use checksums |
99999a3ca373af129a7442d81d684951931ef84ab8b1febb632a1a3df2235388
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.15
|
Security for hatch-cpp 0.5.2
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.