This is a tool that generate C declarations to .wit. For existing C projects, you can use this project to generate declarations to corresponding wit file.
Note that we provide a standalone clang-tool c2wit
and a clang plugin libC2WitPlugin.so
.
They share the same code about wit-codegen, but expose different user interfaces, for your choice.
OCI-container (namely, docker) images are provided on github packages. This is a standalone tool wrapper, you can mount local filesystem into the container and run our tool.
Note: the images is fairly large due to LLVM/Clang dependency (1GB+), if you can not stand this, you can build from source.
Declaration having attribute __attribute__((annotate("wit-export")))
will be exported.
An example translation unit:
/* test.c */
struct
__attribute__((annotate("wit-export")))
Floats {
float F32;
double F64;
};
(a) Use a clang plugin
Invoke your system clang and load the plugin
clang -fsyntax-only -fplugin=build/C2Wit.so -Xclang -plugin -Xclang c2wit test.c
And this plugin converts "Floats" to a .wit record.
record Floats {
F32: f32,
F64: f64,
}
(b) Use the standalone tool
Here we provide a standalone executable that could be invoked directly.
c2wit test.c
Based on libTooling, you may specify a compilation database, used to find header files & definitions the translation unit.
Record renaming
Annotate the record with wit-define
:
__attribute__((annotate("wit-define", <name>)))
gives this record a name, types desugared (i.e. no typedefs, typeofs) are considered the same. This is useful to mark a struct a "string", because we do not have native strings in C/C++.
struct
__attribute__((annotate("wit-define", "string")))
foo {
int length;
char *data;
};
typedef struct foo sugared_foo;
struct
__attribute__((annotate("wit-export")))
bar {
int a;
struct foo b;
sugared_foo c;
};
record bar {
a: i32,
b: string,
c: string,
}
See docs/developer-guide.