C => V source code translator.
Demo Video: Translating DOOM from C to V, building and running it.
https://www.youtube.com/watch?v=6oXrz3oRoEg
v .
... or if you want to debug c2v behaviour:
v -d trace_verbose .
No dependencies other than a clang
binary.
c2v accepts the following arguments:
-keep_ast keep ast files
-print_tree print the entire tree
c2v file.c
This will generate file.v
.
c2v project
This will translate each C file in the project
directory.
project/ ==> project/
a.c a.c
foo.c a.v
foo.c
foo.v
You may need to run translated code with v -translated file.v
until early 2023.
C2V can also generate V wrappers on top of C libraries.
c2v wrapper file.c
C2V is using Clang's AST to generate V. This allowed us to avoid writing a C parser.
In order to avoid LLVM dependencies/C++ complexity, C2V parses AST generated by the clang
binary.
C2V supports reading from a project configuration file named c2v.toml
, located in one of these places, in this order:
- if C2V_CONFIG is set, it should contain the c2v.toml path.
- the project folder (the last folder passed to c2v) + /c2v.toml
- the project folder (the folder of the file that is last passed to c2v) + /c2v.toml
That file has the following format:
[project]
uses_sdl = true
output_dirname = "c2v_out.dir"
additional_flags = "-I. -I.. -I../.."
["info.c"]
additional_flags = "-I/some/folder/used/only/for/that/specific/file"
In the above:
uses_sdl
is a boolean, that defaults to false.
When it is true, c2v will append the result of sdl2-config --cflags
to additional_flags
.
output_dirname
is a string, that defaults to c2v_output
. c2v will create that folder, if it does not exist, and it will put all the translated .v files there.
additional_flags
is a string, that will be passed verbatim to the clang parser for each .c file. It can be used to pass additional -I flags, that are specific to your project, so that clang can find all the headers needed by that project.
Note: all these are global to the project.
The c2v.toml configuration file also supports file specific overrides, for the additional_flags
option, just put them in their own sections,
titled as the file name.