| |
![Jonathan M Davis's Gravatar profile Gravatar of Jonathan M Davis](//www.gravatar.com/avatar/c2372c89dbe85590c9c1dd06c6f998e0?d=identicon&s=32) | Posted by Jonathan M Davis in reply to Arjan | Permalink Reply |
|
Jonathan M Davis ![Jonathan M Davis's Gravatar profile Gravatar of Jonathan M Davis](//www.gravatar.com/avatar/c2372c89dbe85590c9c1dd06c6f998e0?d=identicon&s=80)
| On Saturday, April 6, 2024 3:57:46 AM MDT Arjan via Digitalmars-d-learn wrote:
> I'm using posix mqueue in a D application on Linux. Works fine. But on FreeBSD it fails to compile due to the version statement:
>
> [version (CRuntime_Glibc):](
> https://github.com/dlang/dmd/blob/0cfdd7a589fd34fdf91db72e4999b4920efe5dc2/d
> runtime/src/core/sys/posix/mqueue.d#L31)
>
> While the file seems to be perfectly fine for FreeBSD too.
>
> If I comment that line out, the app builds but have to supply the linker the lib -ltr in dub.sdl to get it linking too:
>
> ```
> lflags "-lrt"
> ```
>
> Which I don't have to do on Linux.
>
> How to process from here to supply a PR?
> Supposedly that version statement is there for a reason. How do I
> also incorporate FreeBSD?
Everything in core.sys is supposed to be in version statements specific to each OS (and Linux complicates that further by having different libcs, resulting in even more version statements). The core.sys.posix files are supposed to contain only stuff from standard POSIX, whereas core.sys.linux contains Linux-specific stuff, core.sys.freebsd contains FreeBSD-specific stuff, etc.
So, a file in core.sys.posix really shouldn't be doing
version (CRuntime_Glibc):
Rather, it should be
version (CRuntime_Glibc)
{
}
and the other POSIX OSes should have their own version statements in there with declarations which match what they have (which isn't necessarily the same as Glibc on Linux) - though only the standard POSIX declarations should be in there. So, for instance, FreeBSD's standard POSIX declarations for mqueue should go in
version (FreeBSD)
{
}
within that core.sys.posix.mqueue, but if it has stuff in mqueue.h which is not standard POSIX, then it would need to go in core.sys.freebsd.mqueue instead.
You can see this pattern with other files in core.sys, e.g.
https://github.com/dlang/dmd/blob/0cfdd7a589fd34fdf91db72e4999b4920efe5dc2/ druntime/src/core/sys/posix/time.d
vs
https://github.com/dlang/dmd/blob/0cfdd7a589fd34fdf91db72e4999b4920efe5dc2/ druntime/src/core/sys/freebsd/time.d
So, the correct thing to do with core.sys.posix.mqueue is to fix it so that all of the existing declarations are in
version (CRuntime_Glibc)
{
}
and
version (CRuntime_Glibc):
is gone. Then
version (FreeBSD)
{
}
needs to be added with the standard POSIX declarations from FreeBSD. None of the declarations should be shared across OSes.
https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/mqueue.h.html
shows what's standard, but you'll have to get the actual C declarations from
/usr/include/mqueue.h
on FreeBSD and convert them to the appropriate declarations for D.
As for any linker commands, they may vary between OSes. All that druntime provides for language bindings is the declarations. If a particular OS requires any linker flags for any particular symbols, then you'll need to take care of that with your build just like you would with C/C++.
But ultimately, which bindings druntime has is highly dependent on what someone needed previously, since usually, they get put in there when someone needs them rather than anyone trying to add them all. And in this case, Sociomantic needed them for Linux, so they got them added, but either no one else has needed the bindings, or no one else has needed them for anything other than Linux with glibc - or if they did, they didn't get them into druntime.
- Jonathan M Davis
|