#45570: gpsd @3.11: driver_rtcm2.c:125:2: error: #error Unknown endianness! ---------------------------+--------------------------- Reporter: ryandesign@… | Owner: ryandesign@… Type: defect | Status: closed Priority: Normal | Milestone: Component: ports | Version: 2.3.2 Resolution: fixed | Keywords: tiger leopard Port: gpsd | ---------------------------+--------------------------- Comment (by ryandesign@…): I may as well reproduce here what I sent to the developer, in case anyone is interested: ----- The problem is that on 10.5 only the following are defined: {{{ $ cpp -E -dM < /dev/null | grep -E '(BYTE|ENDIAN)' #define __BIG_ENDIAN__ 1 #define _BIG_ENDIAN 1 }}} That's on a PowerPC Mac; on an Intel Mac, presumably `__LITTLE_ENDIAN__` and `_LITTLE_ENDIAN` would both be defined to `1`. This runs afoul of the code in gpsd's driver_rtcm2.c which first does this: {{{ /* * BSD uses _BYTE_ORDER, and Linux uses __BYTE_ORDER. */ #if !defined( __BYTE_ORDER) && defined(_BYTE_ORDER) #define __BYTE_ORDER _BYTE_ORDER #endif #if !defined( __BIG_ENDIAN) && defined(_BIG_ENDIAN) #define __BIG_ENDIAN _BIG_ENDIAN #endif #if !defined( __LITTLE_ENDIAN) && defined(_LITTLE_ENDIAN) #define __LITTLE_ENDIAN _LITTLE_ENDIAN #endif }}} And then does this: {{{ /* * Darwin (Mac OS X) uses special defines. */ #if !defined( __BYTE_ORDER) && defined(__DARWIN_BYTE_ORDER) #define __BYTE_ORDER __DARWIN_BYTE_ORDER #endif #if !defined( __BIG_ENDIAN) && defined(__DARWIN_BIG_ENDIAN) #define __BIG_ENDIAN __DARWIN_BIG_ENDIAN #endif #if !defined( __LITTLE_ENDIAN) && defined(__DARWIN_LITTLE_ENDIAN) #define __LITTLE_ENDIAN __DARWIN_LITTLE_ENDIAN #endif }}} On 10.5, in the first block, on PowerPC, `__BIG_ENDIAN` gets set to `_BIG_ENDIAN`, i.e. `1` (or on Intel, `__LITTLE_ENDIAN` gets set to `_LITTLE_ENDIAN`, i.e. `1`), and `1` doesn't match either of the possible values of `__BYTE_ORDER` == `__DARWIN_BYTE_ORDER` (which is either `__DARWIN_BIG_ENDIAN` == `4321` or `__DARWIN_LITTLE_ENDIAN` == `1234`), which is where the error trips: {{{ #if __BYTE_ORDER == __BIG_ENDIAN #define WORDS_BIGENDIAN 1 #elif __BYTE_ORDER == __LITTLE_ENDIAN #undef WORDS_BIGENDIAN #else #error Unknown endianness! #endif /* __BYTE_ORDER */ }}} Assuming the BSD block is correct for BSD, the solution I propose is to reverse the order of these two blocks, putting the Darwin block before the BSD one. This allows the build to succeed on 10.5 at least. -- Ticket URL: <https://trac.macports.org/ticket/45570#comment:5> MacPorts <https://www.macports.org/> Ports system for OS X