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