predefined macros for various BSD-based systems?

Started by Tom Laneover 15 years ago11 messages
#1Tom Lane
tgl@sss.pgh.pa.us

The recently added contrib/pg_upgrade code contains this bit:

/*
* scandir() is originally from BSD 4.3, which had the third argument as
* non-const. Linux and other C libraries have updated it to use a const.
* http://unix.derkeiler.com/Mailing-Lists/FreeBSD/questions/2005-12/msg00214.html
*
* Here we try to guess which libc's need const, and which don't. The net
* goal here is to try to suppress a compiler warning due to a prototype
* mismatch of const usage. Ideally we would do this via autoconf, but
* autoconf doesn't have a suitable builtin test and it seems overkill
* to add one just to avoid a warning.
*/
#elif defined(freebsd) || defined(bsdi) || defined(__darwin__) || defined(openbsd)
/* no const */
return scandir(dirname, namelist, (int (*) (struct dirent *)) selector, NULL);
#else
/* use const */
return scandir(dirname, namelist, selector, NULL);

This drew my attention a couple days ago because it was picking the
wrong alternative on OS X, which was because the as-committed coding
was "defined(darwin)", which is not how that symbol is spelled. I fixed
that, but I am now thinking that the other three checks are equally
tin-eared. In particular, I see that buildfarm members ermine (FreeBSD)
and spoonbill (OpenBSD) are reporting warnings here, which proves that
those two platforms don't predefine "freebsd" or "openbsd" respectively.
Does anyone know if they define "__freebsd__" or "__freebsd" etc?

I'm not even too sure what "bsdi" is, but I'm suspicious of that branch
too. A search of our code finds

contrib/pg_upgrade/file.c: 248: #elif defined(freebsd) || defined(bsdi) || defined(__darwin__) || defined(openbsd)
src/backend/utils/misc/ps_status.c: 67: #elif (defined(BSD) || defined(__bsdi__) || defined(__hurd__)) && !defined(__darwin__)
src/include/port.h: 355: #if defined(bsdi) || defined(netbsd)
src/port/fseeko.c: 20: #if defined(__bsdi__) || defined(__NetBSD__)
src/port/fseeko.c: 24: #ifdef bsdi
src/port/fseeko.c: 47: #ifdef bsdi
src/port/fseeko.c: 55: #ifdef bsdi
src/port/fseeko.c: 66: #ifdef bsdi
src/port/fseeko.c: 76: #ifdef bsdi
src/port/fseeko.c: 87: #ifdef bsdi

which leaves one with not a lot of warm fuzzies that we know how to
spell the symbol for either bsdi or netbsd. (Oh, and shouldn't
this pg_upgrade check be looking for netbsd too?)

In the "darwin" case we aren't really making any assumptions,
because we actually define __darwin__ in port/darwin.h.

I suppose that at least some of the *BSD herd really do predefine some
of the symbols being attributed to them here, but I would like to see
something authoritative about which and what.

regards, tom lane

#2Robert Haas
robertmhaas@gmail.com
In reply to: Tom Lane (#1)
Re: predefined macros for various BSD-based systems?

On Sat, May 15, 2010 at 12:15 AM, Tom Lane <tgl@sss.pgh.pa.us> wrote:

I'm not even too sure what "bsdi" is, but I'm suspicious of that branch
too.  A search of our code finds

It's a commercial distribution of BSD. I remember it being pretty
nice when I used it 10+ years ago, but it sounds like it's dead now.
Too bad.

http://en.wikipedia.org/wiki/Berkeley_Software_Design

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise Postgres Company

#3Tom Lane
tgl@sss.pgh.pa.us
In reply to: Robert Haas (#2)
Re: predefined macros for various BSD-based systems?

Robert Haas <robertmhaas@gmail.com> writes:

On Sat, May 15, 2010 at 12:15 AM, Tom Lane <tgl@sss.pgh.pa.us> wrote:

I'm not even too sure what "bsdi" is, but I'm suspicious of that branch
too. �A search of our code finds

It's a commercial distribution of BSD. I remember it being pretty
nice when I used it 10+ years ago, but it sounds like it's dead now.

Um ... so do you remember which symbol they predefined? It's pretty
lame that we can't even spell it consistently in one source file.
(Or, if BSDI is so dead that no one remembers, shouldn't we rip out
those #if branches?)

regards, tom lane

#4Robert Haas
robertmhaas@gmail.com
In reply to: Tom Lane (#3)
Re: predefined macros for various BSD-based systems?

On Sat, May 15, 2010 at 12:37 AM, Tom Lane <tgl@sss.pgh.pa.us> wrote:

Robert Haas <robertmhaas@gmail.com> writes:

On Sat, May 15, 2010 at 12:15 AM, Tom Lane <tgl@sss.pgh.pa.us> wrote:

I'm not even too sure what "bsdi" is, but I'm suspicious of that branch
too.  A search of our code finds

It's a commercial distribution of BSD.  I remember it being pretty
nice when I used it 10+ years ago, but it sounds like it's dead now.

Um ... so do you remember which symbol they predefined?  It's pretty
lame that we can't even spell it consistently in one source file.
(Or, if BSDI is so dead that no one remembers, shouldn't we rip out
those #if branches?)

No clue. I agree. (Yes.)

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise Postgres Company

#5Peter Eisentraut
peter_e@gmx.net
In reply to: Tom Lane (#1)
Re: predefined macros for various BSD-based systems?

On lör, 2010-05-15 at 00:15 -0400, Tom Lane wrote:

I suppose that at least some of the *BSD herd really do predefine some
of the symbols being attributed to them here, but I would like to see
something authoritative about which and what.

http://www.freebsd.org/doc/en_US.ISO8859-1/books/porters-handbook/porting-versions.html

#6Peter Eisentraut
peter_e@gmx.net
In reply to: Robert Haas (#2)
Re: predefined macros for various BSD-based systems?

On lör, 2010-05-15 at 00:23 -0400, Robert Haas wrote:

It's a commercial distribution of BSD. I remember it being pretty
nice when I used it 10+ years ago, but it sounds like it's dead now.

BSDI is the company that produced BSD/OS, which was Bruce's main
development environment at some point, which is why it has left
excruciating traces all over the PostgreSQL source.

#7Giles Lean
giles.lean@pobox.com
In reply to: Tom Lane (#1)
Re: predefined macros for various BSD-based systems?

Tom Lane <tgl@sss.pgh.pa.us> wrote:

I suppose that at least some of the *BSD herd really do predefine some
of the symbols being attributed to them here, but I would like to see
something authoritative about which and what.

Documentation follows, but first the summary:

FreeBSD: __FreeBSD__
NetBSD: __NetBSD__
OpenBSD: __OpenBSD__

I believe those #defines also tell you what the release is.
I didn't look into their encoding schemes just now, but can if
you want.

(OS X aka Darwin is harder: they seem to like __APPLE__, but
to determine the OS version the best I can see is
__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__, which is quite
horrid.)

Re BSDi, I have no idea really but based on Google searching
I'd bet on __bsdi__.

Per Wikipedia BSDi was discontinued in 2003 and support ended
in 2004. I submit that anyone still using it is not likely to
be updating their PostgreSQL installation, so +1 from me for
dropping support for it unless a volunteer using it comes
forward.

FYI (and you may know this, but I didn't learn until recently)
GCC will tell you quite easily what #defines are predefined,
and all those platforms use gcc:

$ cc -E -dM - < /dev/null | grep FreeBSD
#define __FreeBSD_cc_version 700003
#define __VERSION__ "4.2.1 20070719 [FreeBSD]"
#define __FreeBSD__ 7

But you wanted something authoritative, so here's what I found:

FreeBSD
=======

http://www.freebsd.org/doc/en/books/porters-handbook/porting-versions.html

"__FreeBSD__ is defined in all versions of FreeBSD."

NetBSD
======

From the NetBSD-1.1 release notes (November, 1995):

"* implement new cpp predefine strategy
define __NetBSD__, ..."

This is still the current behaviour, although the current
release is 5.0.2 from February 2010.

OpenBSD
=======

http://www.openbsd.org/porting.html

"Generic Porting Hints

* __OpenBSD__ should be used sparingly, if at all. Constructs that
look like

#if defined(__NetBSD__) || defined(__FreeBSD__)

are often inappropriate. Don't add blindly __OpenBSD__ to
it. Instead, try to figure out what's going on, and what actual
feature is needed."

Regards,

Giles

#8Bruce Momjian
bruce@momjian.us
In reply to: Peter Eisentraut (#6)
Re: predefined macros for various BSD-based systems?

Peter Eisentraut wrote:

On l?r, 2010-05-15 at 00:23 -0400, Robert Haas wrote:

It's a commercial distribution of BSD. I remember it being pretty
nice when I used it 10+ years ago, but it sounds like it's dead now.

BSDI is the company that produced BSD/OS, which was Bruce's main
development environment at some point, which is why it has left
excruciating traces all over the PostgreSQL source.

Uh, I still run BSDi.

--
Bruce Momjian <bruce@momjian.us> http://momjian.us
EnterpriseDB http://enterprisedb.com

#9Andrew Dunstan
andrew@dunslane.net
In reply to: Bruce Momjian (#8)
Re: predefined macros for various BSD-based systems?

Bruce Momjian wrote:

Peter Eisentraut wrote:

On l?r, 2010-05-15 at 00:23 -0400, Robert Haas wrote:

It's a commercial distribution of BSD. I remember it being pretty
nice when I used it 10+ years ago, but it sounds like it's dead now.

BSDI is the company that produced BSD/OS, which was Bruce's main
development environment at some point, which is why it has left
excruciating traces all over the PostgreSQL source.

Uh, I still run BSDi.

That's more or less the OS equivalent of writing with a quill. :-)

cheers

andrew

#10Bruce Momjian
bruce@momjian.us
In reply to: Tom Lane (#1)
Re: predefined macros for various BSD-based systems?

Tom Lane wrote:

I'm not even too sure what "bsdi" is, but I'm suspicious of that branch
too. A search of our code finds

contrib/pg_upgrade/file.c: 248: #elif defined(freebsd) || defined(bsdi) || defined(__darwin__) || defined(openbsd)
src/backend/utils/misc/ps_status.c: 67: #elif (defined(BSD) || defined(__bsdi__) || defined(__hurd__)) && !defined(__darwin__)
src/include/port.h: 355: #if defined(bsdi) || defined(netbsd)
src/port/fseeko.c: 20: #if defined(__bsdi__) || defined(__NetBSD__)
src/port/fseeko.c: 24: #ifdef bsdi
src/port/fseeko.c: 47: #ifdef bsdi
src/port/fseeko.c: 55: #ifdef bsdi
src/port/fseeko.c: 66: #ifdef bsdi
src/port/fseeko.c: 76: #ifdef bsdi
src/port/fseeko.c: 87: #ifdef bsdi

which leaves one with not a lot of warm fuzzies that we know how to
spell the symbol for either bsdi or netbsd. (Oh, and shouldn't
this pg_upgrade check be looking for netbsd too?)

BSDi defines "bsdi" and "__bsdi__", but our code was clearly
inconsistent. I have changed all references to __bsdi__.

FYI, src/tools/ccsym will show you your predefined symbols.

--
Bruce Momjian <bruce@momjian.us> http://momjian.us
EnterpriseDB http://enterprisedb.com

#11Bruce Momjian
bruce@momjian.us
In reply to: Giles Lean (#7)
Re: predefined macros for various BSD-based systems?

Giles Lean wrote:

Tom Lane <tgl@sss.pgh.pa.us> wrote:

I suppose that at least some of the *BSD herd really do predefine some
of the symbols being attributed to them here, but I would like to see
something authoritative about which and what.

Documentation follows, but first the summary:

FreeBSD: __FreeBSD__
NetBSD: __NetBSD__
OpenBSD: __OpenBSD__

Great. I have updated pg_upgrade to use those defines.

--
Bruce Momjian <bruce@momjian.us> http://momjian.us
EnterpriseDB http://enterprisedb.com