Re: Feature Conditional for M_PI

Joel Sherrill via Newlib <[email protected]>
Newsgroups gmane.comp.lib.newlib
Message-ID <CAF9ehCX+2xMDi4FvYpKqYEATyTthkmNNAcHrkS_8nO_y8juGDg@mail.gmail.com>
On Mon, Aug 31, 2020 at 10:30 AM Corinna Vinschen via Newlib <
[email protected]> wrote:

> On Aug 31 17:27, Corinna Vinschen via Newlib wrote:
> > On Aug 31 10:10, Joel Sherrill wrote:
> > > Hi
> > >
> > > I was porting some code from Linux to Cygwin and came across this.
> M_PI in
> > > math.h is defined by POSIX as part of XSI. It does not appear to be
> part of
> > > C99 or C++03.  I have this cut down to show the problem:
> > >
> > > ==========================
> > > #include <math.h>
> > >
> > > double pi = M_PI;
> > > ==========================
> > >
> > > And this script to try various feature defines and compilers:
> > >
> > > ===========================
> > > GCC=${GCC:-g++}
> > >
> > > ${GCC} -c m.c
> > > ${GCC} -D_XOPEN_SOURCE=700 -c m.c
> > > ${GCC} -D_POSIX_C_SOURCE=200809L -c m.c
> > > ${GCC} -D_XOPEN_SOURCE=700 -c -D_POSIX_C_SOURCE=200809L -c m.c
> > > ===========================
> > >
> > > All of those compiler invocations work on Linux but the third one does
> not
> > > work on Cygwin or RTEMS which use newlib.
> > >
> > > Is the proper thing to do to add  -D_XOPEN_SOURCE=700 when compiling
> this
> > > program?
> > >
> > > Just curious if Linux is defining _XOPEN_SOURCE by default and newlib
> > > doesn't.
> >
> > In glibc's math.h, M_PI is guarded with
> >
> >   #if defined __USE_MISC || defined __USE_XOPEN
> >
> > In newlib, it's guarded with
> >
> >   #if __BSD_VISIBLE || __XSI_VISIBLE
> >
> > Note that this is identical to the guards on at least FreeBSD.
> >
> > In both cases, newlib as well as glibc, "MISC" is defined by default,
> > but "BSD" isn't.  That's why your 3rd invocation fails on BSDs and
> > newlib/Cygwin, but not on Linux.
>

Thanks for poking at the BSDs. I went and tried that also.

>
> Huh, wait!  I bet this does *not* fail on BSD because BSD very likely
> defines __BSD_VISIBLE by default.
>

The third case fails on FreeBSD 12 as well.

>
> We could move the math.h constants to __MISC_VISIBLE || __XSI_VISIBLE,
> perhaps that makes more sense for us?
>

https://github.com/freebsd/freebsd/blob/master/lib/msun/src/math.h#L143 has
this:

 #if __BSD_VISIBLE || __XSI_VISIBLE

which matches your expectations on their wrapper but not the outcome.
I guess they don't define __BSD_VISIBLE by default.

If we want newlib to follow glibc, then this should change to MISC but
I certainly would want to hear from some of the standards folks who
are on this list. :)

--joel

>
>
> Corinna
>
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.