Tool for porting C to D

Laeeth Isharc noreply at laeeth.com
Fri Jul 24 01:03:16 UTC 2026


Hi.

It's not finished yet, but in case it helps someone, here's a 
little tool I worked on for porting C to D.  It will port 
declarations too, for C and some of C++ (works for imgui more or 
less).  I didn't write much of the code, but I wouldn't say it's 
exactly vibe-coded either.  Credit to C2Rust for the inspiration.

It uses clang front end to dump the C++ AST to json.  (I will 
move to CBOR when the tool is more mature).  Then D parses the 
json into a Cxx AST and on the happy path transforms that into a 
D AST, which is serialised to make your programme. It uses clang 
to advise on which/which order to process headers and it should 
pick up a compile db or in theory makefile or cmake. The 
fallback/less happy path is just raw text.

I tried it on NASA spice library, 1700 odd numerical C files and 
most of them worked. Some problems with imports and dangling 
elses that I think/hope are mostly fixed or should be soon.

There's a provenance tracing log facility (so you can see why it 
did what it did) and a fallback log (if the transformation didn't 
work for some reason then it just falls back to raw text, which 
will usually have more problems).

It should preserve comments but I'm sure there's a bug or two 
left.

There's an override facility for macros and some other things, 
not battle tested yet.

There's an mcp server tool with the idea that an LLM could guide 
the process.  In practice so far I just used it to port C in cli 
mode.  Probably though, especially for C++ you need to make some 
decisions about what to do when generating bindings and if I had 
a better way to express that policy it could do more there.

Generating high-level idiomatic D wrappers guided by policy could 
be another future extension.

It's not the fastest - spice took 40 minutes or so, although 
that's not a small project.

I tried on libgit2 - slightly worse than spice but not 
horrendous.  My focus isn't mostly on the tool right now, but I 
hope to keep improving it over time.

To build it cd tools/clangparse-dump and run make.  Then dub 
build -c c2d in the root.

Sorry for the state of the docs but I guess it's easy enough to 
figure out with modern tools.

I use Linux so probably some minor fixes needed for Windows and 
MacOS.  You need clang, bear etc.

https://codeberg.org/dlang-public/clang-parser-d

I have a tool for porting zig C declarations to D if anyone would 
find it helpful - much less used though.



More information about the Digitalmars-d-announce mailing list