Translating C to Rust
To translate C files specified in
compile_commands.json (see below), run the
c2rust tool with the
c2rust transpile compile_commands.json
c2rust refactor tool is also available for refactoring Rust code, see refactoring).
The translator requires the exact compiler commands used to build the C code. To provide this information, you will need a standard
compile_commands.json file. Many build systems can automatically generate this file, as it is used by many other tools, but see below for recommendations on how to generate this file for common build processes.
Once you have a
compile_commands.json file describing the C build, translate the C code to Rust with the following command:
c2rust transpile path/to/compile_commands.json
To generate a
Cargo.toml template for a Rust library, add the
c2rust transpile --emit-build-files path/to/compile_commands.json
To generate a
Cargo.toml template for a Rust binary, do this:
c2rust transpile --main myprog path/to/compile_commands.json
--main myprog tells the transpiler to use the
main method from
myprog.rs as the entry point.
The translated Rust files will not depend directly on each other like normal Rust modules. They will export and import functions through the C API. These modules can be compiled together into a single static Rust library or binary.
There are several known limitations in this translator. The translator will emit a warning and attempt to skip function definitions that cannot be translated.
compile_commands.json file can be automatically created using
It may be a good idea to remove optimizations(
-OX) from the compile commands
file, as there are optimization builtins which we do not support translating.
When creating the initial build directory with cmake specify
-DCMAKE_EXPORT_COMPILE_COMMANDS=1. This only works on projects
configured to be built by
cmake. This works on Linux and MacOS.
cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=1 ...
intercept-build (part of the scan-build
tool) is recommended for non-cmake
projects. intercept-build is bundled with clang under
a standalone version can be easily installed via PIP with:
pip install scan-build
intercept-build <build command>
You can also use intercept-build to generate a compilation database for compiling a single C file, for example:
intercept-build sh -c "cc program.c"
bear (linux only)
If you have bear installed, it can be used similarly to intercept-build:
bear <build command>