Thread overview
Using core/sys/posix/mqueue.d on FreeBSD
Apr 06
Arjan
Apr 06
Arjan
April 06

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):

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?

April 06
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



April 06
Actually, since I'm usually the one who does the FreeBSD ones anyway, here you go:

https://github.com/dlang/dmd/pull/16359

The declarations compile, and they should match the ones in C, since I copied them over and then tweaked them, but I haven't actually tested them.

All that being said, even if they're merged immediately, they won't be available as part of druntime until dmd 2.109.0 is released (and 2.108.0 was released less than a week ago), so you'll probably need to copy them into your own install or use the development version of dmd to get the updated bindings if you want to use them now.

- Jonathan M Davis



April 06
On Saturday, 6 April 2024 at 12:05:56 UTC, Jonathan M Davis wrote:
> Actually, since I'm usually the one who does the FreeBSD ones anyway, here you go:
>
> https://github.com/dlang/dmd/pull/16359
>
> The declarations compile, and they should match the ones in C, since I copied them over and then tweaked them, but I haven't actually tested them.
>
> All that being said, even if they're merged immediately, they won't be available as part of druntime until dmd 2.109.0 is released (and 2.108.0 was released less than a week ago), so you'll probably need to copy them into your own install or use the development version of dmd to get the updated bindings if you want to use them now.
>
> - Jonathan M Davis

This is awesome, Jonathan! Thanks a lot for your elaboration on the issue, no wonder I got confused, and of course the PR! Really appreciated.
Thanks!