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.

Why inclean?

When using legacy libraries like some-old-lib, consumers often have to leak the library's internal directory structure into their own build configuration.

Without inclean: You have to add internal library paths to your own -I search paths to compile successfully.

gcc main.c -o main -I third_party -I third_party/some-old-lib/internal

Without inclean

Using inclean: inclean automatically cleans up and standardizes the #include paths inside some-old-lib. Consumers only need to include the top-level directory.

gcc main.c -o main -I third_party

Using inclean


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.

Configuration at a glance

Each [[rule]] narrows down the includes it owns, then chooses what to do with them.

  • file_paths and file_suffixes select source files.
  • include_forms and include_match select include lines.
  • include_directories enables header lookup; include_resolved_match filters the resolved header path.
  • action rewrites, removes, comments out, keeps, or reports an error; trailing_comment handles same-line comments.

Most projects only need include_match plus one action. Use include_directories for path normalization, and look at macro_rewrite only when you need to edit macro-based includes. For glob rules, macro include behavior, conflict handling, copy semantics, and all fields, see the configuration reference.

Example

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

[project]
root = "."
version = "0.3.0"
min_inclean_version = "0.3.0"

[[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 Tombi or Even Better TOML, Helix, Zed) automatically pick it up:

#:schema https://raw.githubusercontent.com/inaku-Gyan/inclean/v0.4.0-beta.1/schemas/inclean.toml.schema.json

[project]
root = "."
version = "0.4.0-beta.1"
min_inclean_version = "0.4.0-alpha.3"

(The above version numbers are examples for this release line.)

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

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.4.0b1.tar.gz (8.3 MB view details)

Uploaded Source

Built Distributions

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

inclean-0.4.0b1-py3-none-win_amd64.whl (1.7 MB view details)

Uploaded Python 3Windows x86-64

inclean-0.4.0b1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.9 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

inclean-0.4.0b1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.7 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

inclean-0.4.0b1-py3-none-macosx_11_0_arm64.whl (1.7 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

inclean-0.4.0b1-py3-none-macosx_10_12_x86_64.whl (1.8 MB view details)

Uploaded Python 3macOS 10.12+ x86-64

File details

Details for the file inclean-0.4.0b1.tar.gz.

File metadata

  • Download URL: inclean-0.4.0b1.tar.gz
  • Upload date:
  • Size: 8.3 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for inclean-0.4.0b1.tar.gz
Algorithm Hash digest
SHA256 f82c49649b1f9e11dc208b003417f52d1c67648cf14cb69a934734beea9e0968
MD5 dbd2c116c0570478e17e10b033a660d1
BLAKE2b-256 06f887ccd31a114979fea63ba52257a79c5b98e4ba0b9c2fed0cac3facc3330f

See more details on using hashes here.

Provenance

The following attestation bundles were made for inclean-0.4.0b1.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.4.0b1-py3-none-win_amd64.whl.

File metadata

  • Download URL: inclean-0.4.0b1-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.4.0b1-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 8585417237b01917434851d198eecee2461d83c6d8ee37e26693b11a59cb24e4
MD5 787c72b7a19b55dffb34add8a1a2635b
BLAKE2b-256 cff6d089cabd8da04dbfd15497d72b039623858c24d6204775ae297eb22c2e1e

See more details on using hashes here.

Provenance

The following attestation bundles were made for inclean-0.4.0b1-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.4.0b1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for inclean-0.4.0b1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 890b78e6daacd8ba24900307ed145bfb1edfa8c9dc51da7c6e4da9d7839aa126
MD5 1b27d91786e0cbfa1f89a2afbb9874f8
BLAKE2b-256 59d0a260734f7947935f6be28dee78af524d193e316724e81405ef1694aae525

See more details on using hashes here.

Provenance

The following attestation bundles were made for inclean-0.4.0b1-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.4.0b1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for inclean-0.4.0b1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 090c0cbcd865e38560dd85e293b4bde6214823cd97efef8ff8ffa59943dbdf0f
MD5 9d714ff3b7f1da65972a3e01c3bf647b
BLAKE2b-256 d655d1dcf014b1e9df9c64e5ef2085f7921908308cc0f23e6b146d44e1d537cc

See more details on using hashes here.

Provenance

The following attestation bundles were made for inclean-0.4.0b1-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.4.0b1-py3-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for inclean-0.4.0b1-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ce1b38436a32387350977838e566dbd7a37db712258c4cc1822a2a7af0d4bb02
MD5 5e7b343e048728e5494cc536069d6f89
BLAKE2b-256 376bde7a47c053119c2868e1712c803bb19b8f0074da61c608ea0bcbbffbdcbc

See more details on using hashes here.

Provenance

The following attestation bundles were made for inclean-0.4.0b1-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.4.0b1-py3-none-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for inclean-0.4.0b1-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 3d7042da724fb168e192b40825c93865b844c29ef75401fe9f8076223ed70a1a
MD5 4e6238e2a46545398ad84bf3d4475e9c
BLAKE2b-256 f59b7c892a5f19fd58e5efca959b493db10358a2f20287c281e95a0c969a6c27

See more details on using hashes here.

Provenance

The following attestation bundles were made for inclean-0.4.0b1-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