Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 19 Mar 2004 10:55:35 +1100 (EST)
From:      Bruce Evans <bde@zeta.org.au>
To:        Archie Cobbs <archie@dellroad.org>
Cc:        freebsd-standards@freebsd.org
Subject:   Re: _BSD_SOURCE vs. __BSD_VISIBLE
Message-ID:  <20040319102323.Q23424@gamplex.bde.org>
In-Reply-To: <200403182233.i2IMXPuJ002724@arch20m.dellroad.org>
References:  <200403182233.i2IMXPuJ002724@arch20m.dellroad.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Thu, 18 Mar 2004, Archie Cobbs wrote:

> All I'm trying to do is write some portable code :-)
>
> Here "portable" simply means that it compiles on both FreeBSD and Linux.
> In order to get the various functions I need I have to set a bunch of flags.
>
> On Linux, these flags do the trick (taken from configure.in):
>
>     AC_DEFINE(_XOPEN_SOURCE, 600, XOpen functions)
>     AC_DEFINE(_GNU_SOURCE, 1, GNU functions)
>     AC_DEFINE(_BSD_SOURCE, 1, BSD functions)
>     AC_DEFINE(_ISOC99_SOURCE, 1, ISO C99 functions)
>     AC_DEFINE(_POSIX_VERSION, 200112, POSIX version)
>     AC_DEFINE(_POSIX_C_SOURCE, 200112, POSIX functions)

Using these tends to restrict potability.  Defining _POSIX_C_SOURCE restricts
visibility to the specified version of POSIX, except some settings of
_XOPEN_SOURCE have precedence and restrict visibility to the specified
version of XSI.  Defining the others gives undefined behaviour; the
actual behaviour is to have no effect under FreeBSD, but apparently these
identifiers are part of the Linux defacto standard so they do something
there.  FreeBSD has _C99_SOURCE, which may work like _ISOC99_SOURCE, and
_ANSI_SOURCE which restricts to C90, and _POSIX_SOURCE which restricts to
the POSIX.1-1990.

> On FreeBSD, _BSD_SOURCE is not recognized, but _POSIX_C_SOURCE is and
> it actually causes the BSD functions to be hidden. So I have to manually
> add __BSD_VISIBLE to get them on FreeBSD.

The only way to get all (Free)BSD functions under FreeBSD is to not
define any identifiers that restrict visibility.

> Q1: Why does Linux require _BSD_SOURCE but FreeBSD requires __BSD_VISIBLE?

Linux apparently requires _BSD_SOURCE to give BSD extensions.  This is
a bug in Linux.  The BSD extensions are better of course :-), and feature
tests macros should generally restrict, not enable extensions.  I think
Linux does this because some BSD extensions are incompatible.

FreeBSD doesn't require __BSD_VISIBLE.  On the contrary, __BSD_VISIBLE is
an implementation detail, and setting it in applications gives undefined
behaviour.

> Q2: Is there some standard for these flags documented somewhere?

_POSIX_C_SOURCE and _XOPEN_SOURCE are documented in the POSIX.1-2001 standard.
So is _POSIX_VERSION, but it is quite different (the system defines it).
The others are nonstandard.

> Q3: What is the right and portable set of flags to use?

There is none.  For FreeBSD, you probably need a null set of flags.
For Linux, this is the wrong list to ask on :-).

Bruce



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20040319102323.Q23424>