[MacPorts] #61775: mame: 0.226 build fails on 10.8, due to C header /usr/include/xlocale/_stdio.h, snprintf_l(), etc (was: mame: 0.226 build fails on 10.8; libc++ issue?)
MacPorts
noreply at macports.org
Tue Dec 8 05:26:29 UTC 2020
#61775: mame: 0.226 build fails on 10.8, due to C header
/usr/include/xlocale/_stdio.h, snprintf_l(), etc
----------------------+----------------------
Reporter: mascguy | Owner: mascguy
Type: defect | Status: assigned
Priority: Normal | Milestone:
Component: ports | Version:
Resolution: | Keywords:
Port: mame |
----------------------+----------------------
Description changed by mascguy:
Old description:
> Mame 0.226 fails to build on 10.8, due to compilation errors in file
> 'src/osd/modules/files/posixfile.cpp'.
>
> Here's one example:
>
> {{{
> In file included from
> ../../../../../src/osd/modules/file/posixfile.cpp:41:
> In file included from ../../../../../src/osd/modules/file/posixfile.h:12:
> In file included from ../../../../../src/osd/osdcore.h:17:
> In file included from ../../../../../src/lib/util/strformat.h:174:
> In file included from ../../../../../src/lib/util/vecstream.h:25:
> In file included from
> /opt/local/libexec/llvm-9.0/bin/../include/c++/v1/istream:163:
> In file included from
> /opt/local/libexec/llvm-9.0/bin/../include/c++/v1/ostream:140:
> /opt/local/libexec/llvm-9.0/bin/../include/c++/v1/locale:1455:16: error:
> use of undeclared identifier 'snprintf_l'; did you mean 'vswprintf_l'?
> int __nc = __libcpp_snprintf_l(__nar, sizeof(__nar),
> _LIBCPP_GET_C_LOCALE, __fmt, __v);
> ^
> }}}
>
> The issue appears to relate to the libc++ headers: When '_XOPEN_SOURCE'
> is defined, certain items aren't declared unless '_DARWIN_C_SOURCE' is
> also defined. So far, this bug seems to be isolated to MacOS 10.8.x.
>
> Note that the Mame port is presently using MacPorts Clang 9. However, the
> same failures also occur with MacPorts Clang 10.
>
> Potential solution: Patch source file 'posixfile.cpp', adding the
> following at the appropriate place:
>
> {{{
> // MacPorts: Fix for libc++ compilation errors on MacOS 10.8
> #if defined(__APPLE__)
> #define _DARWIN_C_SOURCE
> #endif
> }}}
>
> While we could certainly define '_DARWIN_C_SOURCE' globally, that seems
> more risky. Particularly given that the issue only affects one Mame
> source file.
>
> I've confirmed that the proposed fix allows Mame to build successfully,
> on MacOS 10.8.
New description:
Mame 0.226 fails to build on 10.8, due to compilation errors in file
'src/osd/modules/files/posixfile.cpp'.
Here's one example:
{{{
In file included from
../../../../../src/osd/modules/file/posixfile.cpp:41:
In file included from ../../../../../src/osd/modules/file/posixfile.h:12:
In file included from ../../../../../src/osd/osdcore.h:17:
In file included from ../../../../../src/lib/util/strformat.h:174:
In file included from ../../../../../src/lib/util/vecstream.h:25:
In file included from
/opt/local/libexec/llvm-9.0/bin/../include/c++/v1/istream:163:
In file included from
/opt/local/libexec/llvm-9.0/bin/../include/c++/v1/ostream:140:
/opt/local/libexec/llvm-9.0/bin/../include/c++/v1/locale:1455:16: error:
use of undeclared identifier 'snprintf_l'; did you mean 'vswprintf_l'?
int __nc = __libcpp_snprintf_l(__nar, sizeof(__nar),
_LIBCPP_GET_C_LOCALE, __fmt, __v);
^
}}}
Root cause appears to be preprocessor logic within C header file
`/usr/include/xlocale/_stdio.h`, determining whether additional stdio
functions are defined. One of those being `snprintf_l()`.
Findings:
* In later MacOS/Xcode releases, the logic is `#if __DARWIN_C_LEVEL >=
200112L || defined(__cplusplus)`. The latter condition ensures we don't
have to worry about `_DARWIN_C_LEVEL`.
* But under MacOS 8.x, the logic is simply `#if __DARWIN_C_LEVEL >=
200112L`, with no awareness of C++ code. This breaks the Mame build.
For now, patching Mame source file `posixfile.cpp` is the easy fix. We
simply have to appropriately define `__DARWIN_C_LEVEL`, or
`_DARWIN_C_SOURCE`. I can confirm that the latter works, and the former
certainly should as well.
Note: I'd prefer not to globally define anything, since the issue is
limited to a single source file. There's too much risk, and it's simply
not needed elsewhere.
--
--
Ticket URL: <https://trac.macports.org/ticket/61775#comment:8>
MacPorts <https://www.macports.org/>
Ports system for macOS
More information about the macports-tickets
mailing list