Deimos (How to port a header)

Johannes Pfau nospam at example.com
Fri Feb 1 01:56:32 PST 2013


On Thursday, 31 January 2013 at 20:42:47 UTC, Marco Leise wrote:
> Maybe Deimos (the GitHub presence) could use a dry piece of
> text that explains how to convert a header. I have just had
> the need for xcb for example, but no idea how a good header
> translation is supposed to look like, if all files need to be
> converted already on the first go and other questions, like if
> all functions should be marked nothrow for example.

We should probably start a wiki page.

Regarding nothrow: I'm not really sure if this is officially 
supported, but at least on linux with dwarf exceptions you can 
throw exceptions between language boundaries. So a C function 
might call a extern(C) callback function implemented in D which 
might throw. In those cases C functions shouldn't be nothrow. In 
99% of all cases C functions don't call callbacks and therefore 
can be nothrow. Deimos does not enforce any rules though. (I 
think there was a discussion that D doesn't officially support 
throwing exceptions across language boundaries. In that case you 
could mark all C fuctions as nothrow, but you'd have to make sure 
that all callback functions passed to C are nothrow as well.)

>
> Also it looks like a long on Windows is 32-bit while on Linux
> it depends on the machine word size and libraries like xcb use
> "architecture dependent includes" for whatever that means in
> praxis.

You can use core.stdc.config's c_long and c_ulong. What's more 
problematic is that we'd also need a c_int and c_short. But for 
the currently supported architectures it's not necessary.

If you need types like int8_t we have core.stdc.stdint. In 
general if a c binding for your type declarations exists, just 
use that. If your c types are defined with some weird 
proprocessor stuff, but the intention is that they always have a 
fixed size there's a simple solution: you can just implement them 
as aliases to the D type with the same type and forget about the 
C preprocessor crap.

>
> There was even a "Variant" struct that gets additional fields,
> if the system compiler supports 64-bit ints. This can get ugly
> really fast and I just went with the comment that said that
> all interesting compilers support some kind of 64-bit int.

You can't know from D if the C comiler supports 64bit integers, 
so there's nothing you can do. A nice solution would be to use 
something like version(cHasNo64Int) so users of the binding can 
still manually force that mode by setting the version.

>
> So my impression is that currently only people with a
> good background of C on multiple platforms can reliably create
> Deimos bindings, unless they share their insights, possibly as
> a link from GitHub/Deimos to the Wiki on dlang.org.
> ("Aldacron"'s blog post is a great start, but I'm looking for
> something extendable and collaborative.)

Yep, that should really be done. Writing bindings for complex C 
libraries can require some C knowlege though (e.g. when you have 
to convert weird macros or strange C array syntax or function 
pointer syntax).

>
> I just imagined if I wrote DBus bindings and someone else
> wrote XCB bindings, we can share and benefit both. Also Deimos
> is ideal to be imported as Git sub-modules in other projects.
> A native D GUI library needs that stuff as well in the long
> term.



More information about the Digitalmars-d-learn mailing list