Crates.io | single-header |
lib.rs | single-header |
version | 0.2.1 |
source | src |
created_at | 2024-01-22 18:07:33.144499 |
updated_at | 2024-02-26 00:10:39.298266 |
description | a rust command line utility to generate portable C/C++ single header file |
homepage | |
repository | http://github.com/DaemonSnake/single-header |
max_upload_size | |
id | 1109042 |
size | 38,678 |
a rust command line utility to generate portable C/C++ single header file
This Rust program is designed to convert C/C++ files into portable single-header files.
-fdirectives-only
option to limit system specific macros / includes#include
expansion of all system headers#include
directives that are as close to the original as possible.#ifndef
or #pragma once
.Limitations:
#if
/#else
/#endif
) that occurs outside system headers will be evaluated.
Only way to prevent this would be to implement a custom mock C-preprocessor.for the following project
// test.hpp
#pragma once
#include "first.hpp"
void test() {}
// first.hpp
#pragma once
#include "second.hpp"
#include <cstddef>
void second_function() {}
// second.hpp
#pragma once
#include <type_traits>
void first_function() {}
will produce:
$> single-header test.hpp
#ifndef TEST_HPP_SINGLE_HEADER
# define TEST_HPP_SINGLE_HEADER
#include <type_traits>
void first_function() {}
#include <cstddef>
void second_function() {}
void test() {}
#endif // TEST_HPP_SINGLE_HEADER
Using cargo via crates.io:
cargo install single-header
Manually:
git clone git@github.com:DaemonSnake/single-header.git
cd single-header
cargo install --path .
Usage: single-header [OPTIONS] <FILE> [-- <CPP_OPTS>...]
Arguments:
<FILE>
path to c/c++ header file
[CPP_OPTS]...
additional parameters for the preprocessor
Options:
-p, --preprocessor <PREPROCESSOR>
[default: cpp]
[possible values: cpp, gcc, clang]
--cmake <CMAKE>
path to build folder to find the compile_commands.json file that contains how to compile <FILE>
-i, --inline <INLINE_PATH>
path / file that must allways be `#include` expanded (can provided multiple times)
-x, --lang <LANG>
[default: c++]
[possible values: c, c++]
--protect <PROTECTION>
protect against multiple includes with `#ifndef` or `#pragma once`
[default: ifndef]
[possible values: ifndef, once]
-h, --help
Print help (see a summary with '-h')
cpp
, gcc
or clang