Skip to main content

A C/C++ #include path normalizer that rewrites includes to resolve cleanly against a minimal -I set.

Project description

inclean

English | 简体中文

A C/C++ #include path normalizer.

Many legacy C/C++ libraries #include headers by bare filename (#include "bar.h") even though the actual header lives several directories deep (src/internal/bar.h). To consume such a library a caller must add every internal directory to their -I list — which pollutes their include namespace and breaks the library's encapsulation.

inclean does a one-shot, source-level normalization. It scans every source file in the library and rewrites each #include so it resolves cleanly against a small, explicit set of allowed include directories. After running inclean, consumers only -I the allowed directories.


Install

inclean is published to crates.io, PyPI, and as prebuilt binaries on GitHub Releases. Pick whichever ecosystem you already have on your machine.

Via PyPI (Python wheels — no Rust toolchain needed)

Three options:

uv tool install inclean      # isolated, fastest
pipx install inclean         # isolated
pip install inclean          # into the current environment

The wheels ship the native binary built by maturin; inclean lands on your PATH the same way ruff or uv do. Requires Python ≥ 3.8.

Via cargo

Two options:

cargo binstall inclean       # prebuilt binary from GitHub Releases (no compilation)
cargo install inclean        # build from crates.io

cargo binstall fetches inclean's binstall metadata from crates.io and downloads the matching prebuilt archive from this repo's GitHub Releases (no compilation). cargo binstall is a third-party cargo subcommand — install it first via cargo-bins/cargo-binstall if you don't already have it.

cargo install downloads the source from crates.io and compiles it locally.

Prebuilt binaries (no package manager)

Download a tarball for your platform from the latest GitHub Release and put inclean (or inclean.exe) on your PATH.

From repo source

Clone this repo and build from source:

git clone https://github.com/inaku-Gyan/inclean.git
cd inclean
cargo install --path .

Quick start

inclean is driven by an inclean.toml placed at the root of the library you want to clean up. A typical workflow:

inclean init                # write a documented starter inclean.toml
$EDITOR inclean.toml        # tell it where your headers live
inclean check               # dry-run: report every proposed change
inclean diff                # see the rewrites as a unified diff
inclean apply               # write the rewrites in place

check / diff / apply optionally take [PATHS...] to restrict which files are processed; with no paths they consider every source file under the project root. -c PATH overrides the upward inclean.toml walk; -j N sets the worker thread count.

Rule matching first checks file_paths, file_suffixes, include_forms, and include_match. Globs are anchored and use literal separators: foo.h only matches foo.h, while **/foo.h matches at any depth. Glob lists are ordered: a leading unescaped ! excludes, and the last matching pattern wins. Use TOML single quotes for a literal leading bang, for example '\!weird.h'; in double quotes, write "\\!weird.h". When include_directories is set, inclean then probes those literal directories and applies include_on_unresolved (error / skip / allow) and include_on_ambiguous (error / skip / first).

Example

A simple replace-action config that rewrites #include "foo.h" to #include "lib/foo.h":

[project]
root = "."
version = "0.3.0-alpha.2"
min_inclean_version = "0.3.0-alpha.2"

[[rule]]
name = "lib-prefix"
file_paths = ["src/**/*"]
include_match = ["foo.h", "bar.h"]
action = { type = "replace", with = "lib/${original}" }

See tests/golden_tests/ for runnable end-to-end examples.

Editor support

inclean.toml ships with a JSON Schema for editor completion and validation. Editors that understand the #:schema directive (VS Code with Even Better TOML, Helix, Zed) automatically pick it up:

#:schema https://raw.githubusercontent.com/inaku-Gyan/inclean/v1.2.3/schemas/inclean.toml.schema.json

[project]
root = "."
version = "1.2.3"
min_inclean_version = "1.1.0"

(The above version numbers are just examples.)

inclean init writes both the #:schema line (for the editor) and the [project].version + [project].min_inclean_version fields, each pinned to the CLI version that generated the file. To upgrade schema validation, edit the version segment in the URL to a newer release tag.

#:schema and the [project] version fields are independent. The #:schema URL is purely for editor tooling; the CLI runs its own two-direction compatibility check (CLI_COMPAT_MIN <= cfg.version AND cfg.min_inclean_version <= CLI_CURRENT). inclean is pre-1.0 and does not ship migration shims for breaking schema changes — see CLAUDE.md.

You can also dump a local copy:

inclean config schema --output inclean.toml.schema.json

Documentation

  • inclean init writes the most complete user-facing configuration reference into the generated inclean.toml.
  • schemas/inclean.toml.schema.json — editor schema generated from the Rust config structs.
  • tests/golden_tests/ — runnable examples for replacement, resolution, copy semantics, suppression, trailing comments, conflicts, and encoding preservation.
  • CONTRIBUTING.md — toolchain, dev workflow, conventions, scope.

License

BSD 3-Clause.

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

inclean-0.3.0a2.tar.gz (87.7 kB view details)

Uploaded Source

Built Distributions

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

inclean-0.3.0a2-py3-none-win_amd64.whl (1.7 MB view details)

Uploaded Python 3Windows x86-64

inclean-0.3.0a2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.8 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

inclean-0.3.0a2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.7 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

inclean-0.3.0a2-py3-none-macosx_11_0_arm64.whl (1.6 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

inclean-0.3.0a2-py3-none-macosx_10_12_x86_64.whl (1.7 MB view details)

Uploaded Python 3macOS 10.12+ x86-64

File details

Details for the file inclean-0.3.0a2.tar.gz.

File metadata

  • Download URL: inclean-0.3.0a2.tar.gz
  • Upload date:
  • Size: 87.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for inclean-0.3.0a2.tar.gz
Algorithm Hash digest
SHA256 14b4a706943e696b4dc51328385e477dde88f8f96e2c157cedf3fc8890518e3c
MD5 b438cb58c99c6f4cbce168886a18b91c
BLAKE2b-256 3e550215d768a4f54181d01ccf0789399fe01aec732fca85911811b3222d445d

See more details on using hashes here.

Provenance

The following attestation bundles were made for inclean-0.3.0a2.tar.gz:

Publisher: release.yml on inaku-Gyan/inclean

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

File details

Details for the file inclean-0.3.0a2-py3-none-win_amd64.whl.

File metadata

  • Download URL: inclean-0.3.0a2-py3-none-win_amd64.whl
  • Upload date:
  • Size: 1.7 MB
  • Tags: Python 3, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for inclean-0.3.0a2-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 0c6ac9fded1f8c80d1a50d5640f1b750e816f8a8878db9c7897c178a416fd70a
MD5 3461dfc8143e6d0c60769a603423e894
BLAKE2b-256 14db70aa2de2abd67f73833870edfb7bbed817d74775c771d21c51e45299df1c

See more details on using hashes here.

Provenance

The following attestation bundles were made for inclean-0.3.0a2-py3-none-win_amd64.whl:

Publisher: release.yml on inaku-Gyan/inclean

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

File details

Details for the file inclean-0.3.0a2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for inclean-0.3.0a2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 3846eef08ba73cf54d7fd7595330308170afa89e7649bfe82962c06d9fd785ae
MD5 114d3c9430e400f46404e1e4a50c4cf4
BLAKE2b-256 b8ea11831222c7342db2ead8a499f11554f450a9fe247366e3ca0b16939db8a0

See more details on using hashes here.

Provenance

The following attestation bundles were made for inclean-0.3.0a2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on inaku-Gyan/inclean

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

File details

Details for the file inclean-0.3.0a2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for inclean-0.3.0a2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 e1d4d75ec50be9c426d64b38e37d52d2b7d0a730ea581c53f46f192cf2d7531d
MD5 846b270d7eccb72d64f7b2594fb92a57
BLAKE2b-256 927a81fdd128f72e593b260c7258cb686adedd6f20c5e34b66dab015bdd1237c

See more details on using hashes here.

Provenance

The following attestation bundles were made for inclean-0.3.0a2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: release.yml on inaku-Gyan/inclean

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

File details

Details for the file inclean-0.3.0a2-py3-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for inclean-0.3.0a2-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 9b28a46c356d338973d7a0b2f668a00fb0680f98215d927a9f3fc43504bbd01b
MD5 637c44a670cb2b93c9ef68005b717b44
BLAKE2b-256 4926bafaef4ddba91ada5bc19056d9387d2561f63a0db51219e06ad1361a79aa

See more details on using hashes here.

Provenance

The following attestation bundles were made for inclean-0.3.0a2-py3-none-macosx_11_0_arm64.whl:

Publisher: release.yml on inaku-Gyan/inclean

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

File details

Details for the file inclean-0.3.0a2-py3-none-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for inclean-0.3.0a2-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 5230b4b91b2d956563c64a09012078534041e46e02fa05deaf6e4032b4e3bd98
MD5 c4b3408408c7153a995722164ee53a64
BLAKE2b-256 5b0c5aeaec8c49b46015f3115a094ba3e9f2ddb1d372ad3ca3dfab13419e61b3

See more details on using hashes here.

Provenance

The following attestation bundles were made for inclean-0.3.0a2-py3-none-macosx_10_12_x86_64.whl:

Publisher: release.yml on inaku-Gyan/inclean

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

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