Subject: Re: Solaris like __EXTENSIONS__ ?
To: None <marc@informatik.uni-bremen.de>
From: Ben Harris <bjh21@netbsd.org>
List: tech-userlevel
Date: 04/21/2003 15:25:11
In article <17560000.1050934110@leeloo.intern.geht.de> you write:
>> I've been thinking this would be a good idea for some time, but for a
>> completely different reason. At the moment, NetBSD extensions are
>> wrapped in:
>>
>># if !defined(_ANSI_SOURCE) && !defined(_POSIX_C_SOURCE) && \
>> !defined(_XOPEN_SOURCE)
>But not all of them. Eg. the u_int type needed for RPC is covered by a
>#if !defined(_POSIX_SOURCE) && !defined(_XOPEN_SOURCE)
That's because it's in <sys/types.h>, which no ANSI C program will ever
include, so there's no need to protect ANSI C programs from it. On the
other hand, the fact that it uses _POSIX_SOURCE rather than _POSIX_C_SOURCE
looks like being a bug, and a demonstration of why having _NETBSD_SOURCE
would be helpful.
>> I think it would make life less complicated if we had _NETBSD_SOURCE
>> (say), which was defined by <sys/featuretest.h> if the application
>> hadn't requested a more restrictive standard. Of course, an
>> application could define _NETBSD_SOURCE for itself if it wanted to
>> ensure that it got our extensions. This would be much like GNU libc
>> works, but less complicated because we don't try to conform to so many
>> standards.
>FreeBSD 5 has something like set, too. They're setting a __BSD_VISIBLE in
>sys/cdefs.h. But, it isn't supposed to be changed from outside. If you set
>POSIX* you're lost..
That seems a little silly, since that conflicts with the way that other
feature-test macros work. You're explicitly allowed to define both
_POSIX_C_SOURCE and _XOPEN_SOURCE, for instance, and that's equivalent to
defining _XOPEN_SOURCE on its own.
>> For added points, we could arrange that the value of _NETBSD_SOURCE be
>> significant, so that you could get NetBSD's extensions as of some date
>> by setting _NETBSD_SOURCE to that date (or __NetBSD_Version__, or
>> whatever).
>Hmm.. IMHO it's to complicated. I like the simple "extensions on/off" way
>Solaris and Glibc handle it.
We could arrange that setting _NETBSD_SOURCE to 1 (or empty) caused it to
default to the latest version, but yes, that might be a bit complex. The
problem is that without it, there's no way an application setting
_NETBSD_SOURCE can be sure we won't arbitrarily trample some bit of their
namespace in a future version. If they can say "I'm happy for you to
trample the parts of my namespace that you used in version 1.6, but no
more", this problem is avoided. I suspect that most application authors
would find this all too confusing, though.
>> In Python's case, the fact that it's including an RPC header file
>> indicates that it's asking for an extension to POSIX, so after that we
>> can legitimately trample the namespace all we want. Unfortunately,
>> this would mean re-including all the already-included header files
>Hmm.. I'm not sure if I understand your point correctly.
You don't. My point was that Python shouldn't _need_ to set _NETBSD_SOURCE,
because the fact that it's including <rpc/types.h> indicates that it wants
an extension to POSIX, since that header doesn't exist in POSIX.
Unfortunately, actually implementing this is probably more trouble than it's
worth.
> But, if I Do
>something like this:
>
>#define _POSIX_C_SOURCE 200112L
>#define _XOPEN_SOURCE 600
>#define _XOPEN_SOURCE_EXTENDED 1
>#define _NETBSD_SOURCE 1
>
>#include <sys/types.h>
>#include <rpc/types>
>#include <rpc/clnt.h>
>...
>
>It should "just work".
Having to define _NETBSD_SOURCE is hardly "just working".
>For the Python RPC case this would be enough:
>#if defined(_NETBSD_SOURCE) || (!defined(_POSIX_SOURCE) &&
>!defined(_XOPEN_SOURCE))
Actually, I'd like that to be:
#if defined(_NETBSD_SOURCE)
with _NETBSD_SOURCE being defined by <sys/featuretest.h> if none of the
other macros is defined.
--
Ben Harris <bjh21@netbsd.org>
Portmaster, NetBSD/acorn26 <URL:http://www.netbsd.org/Ports/acorn26/>