Opened 4 years ago
Last modified 4 years ago
#61775 closed defect
mame: 0.226 build fails on 10.8, due to C header /usr/include/xlocale/_stdio.h, snprintf_l(), etc — at Version 8
Reported by: | mascguy (Christopher Nielsen) | Owned by: | mascguy (Christopher Nielsen) |
---|---|---|---|
Priority: | Normal | Milestone: | |
Component: | ports | Version: | |
Keywords: | Cc: | ||
Port: | mame |
Description (last modified by mascguy (Christopher Nielsen))
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.
Change History (8)
comment:1 Changed 4 years ago by mascguy (Christopher Nielsen)
comment:2 follow-up: 4 Changed 4 years ago by ryandesign (Ryan Carsten Schmidt)
MacPorts uses libc++ by default on 10.6 and later. Are you sure that mame is using libstdc++? If it is, that is a bug that should be fixed; it should use the C++ stdlib that MacPorts tells it to.
comment:3 Changed 4 years ago by ryandesign (Ryan Carsten Schmidt)
Priority: | High → Normal |
---|
comment:4 Changed 4 years ago by mascguy (Christopher Nielsen)
Replying to ryandesign:
MacPorts uses libc++ by default on 10.6 and later. Are you sure that mame is using libstdc++? If it is, that is a bug that should be fixed; it should use the C++ stdlib that MacPorts tells it to.
No, you're right... Mame is using libc++, rather than libstdc++.
However, more digging revealed this to be a C header file issue... completely unrelated to the C++ standard library.
comment:5 Changed 4 years ago by mascguy (Christopher Nielsen)
Description: | modified (diff) |
---|---|
Summary: | mame: 0.226 build fails on 10.8, due to host libstdc++ bug (_DARWIN_C_SOURCE needs to be defined) → mame: 0.226 build fails on 10.8; libc++ issue? |
comment:6 Changed 4 years ago by mascguy (Christopher Nielsen)
Description: | modified (diff) |
---|
comment:7 Changed 4 years ago by mascguy (Christopher Nielsen)
In addition to verifying the build fix, I've also confirmed that Mame runs successfully on MacOS 10.8.5.
comment:8 Changed 4 years ago by mascguy (Christopher Nielsen)
Description: | modified (diff) |
---|---|
Summary: | mame: 0.226 build fails on 10.8; libc++ issue? → mame: 0.226 build fails on 10.8, due to C header /usr/include/xlocale/_stdio.h, snprintf_l(), etc |
<After additional investigation, this comment no longer relevant.>