Re: [commit: ghc] master: define own version of PRIdPTR on platform where its not available (71f7ab6)
Karel Gardas <[email protected]>
| Newsgroups | gmane.comp.lang.haskell.cvs.ghc |
|---|---|
| Message-ID | <[email protected]> |
On 11/ 9/12 11:34 AM, Gabriel Dos Reis wrote: >> commit 71f7ab6a05448e48a3b5741bb8a5ef57701e9c70 >> Author: Karel Gardas<[email protected]> >> Date: Thu Nov 8 22:04:44 2012 +0100 >> >> define own version of PRIdPTR on platform where its not available >> >> Note that PRIdPTR is considered as linux-ism so it's not available on platforms >> like Solaris, although some other free Unix(-like) OSes apparently supports >> it too. > > The log comment is not correct. > In fact, it is ISO C99 standard; some old proprietary C system headers > not have it (13 years later) but it is not linux-ism. Hello, I've analyzed the issue and it looks like, Solaris is defining PRIdPTR in sys/int_fmtio.h, this file is thorough sys/inttypes.h included into inttypes.h when !defined(_XOPEN_SOURCE) || defined(_XPG6) || defined(__EXTENSIONS__) -- unfortunately GHC's PosixSource.h which is included before inttypes.h in mkDerivedconstants.c defines _XOPEN_SOURCE for Solaris which means PRdPTR is not defined as the sys/int_fmtio.h is not included under such conditions. Now, I'm not expert in C nor in C99, but what does it mean? That Solaris is strict and does not consider _XOPEN_SOURCE to be C99? Small test: #define _XOPEN_SOURCE #include <stdio.h> #include <inttypes.h> int main() { printf("%s\n", PRIdPTR); return 0; } reveals that it cannot be compiled with gcc -std=c99 test.c due to following error: In file included from /usr/include/stdio.h:15:0, from test.c:3: /usr/include/sys/feature_tests.h:354:2: error: #error "Compiler or options invalid for pre-UNIX 03 X/Open applications and pre-2001 POSIX applications" test.c: In function ‘main’: test.c:9:16: error: ‘PRIdPTR’ undeclared (first use in this function) test.c:9:16: note: each undeclared identifier is reported only once for each function it appears in and of course it cannot be compiled with simple gcc test.c due to: test.c: In function ‘main’: test.c:9:16: error: ‘PRIdPTR’ undeclared (first use in this function) test.c:9:16: note: each undeclared identifier is reported only once for each function it appears in When I remove _XOPEN_SOURCE definition, then the compilation with or without -std=c99 goes fine. To me it looks like _XOPEN_SOURCE is kind of in conflict with C99 -- at least on Solaris. The question is if Solaris team is right here or wrong here and how other platforms use/support this... But most important question is to undefine _XOPEN_SOURCE or define either _XPG6 or __EXTENSION__ just on Solaris? What's the most cleanest solution? Thanks for any idea! Karel