On 2017-9-29 18:48 , Leonardo Brondani Schenkel wrote:
On 2017-09-29 10:23, Joshua Root wrote:
On 2017-9-29 18:14 , Leonardo Brondani Schenkel wrote:
This seems to be an issue in XCode 9 to me, since I believe that when
setting the deployment target to 10.12 or earlier it should not be
exposing symbols that are not available at runtime.
It is working correctly as far as it goes; autoconf just doesn't solve
the entire problem. Symbols that are not available on all the OS
versions being targeted must be checked for at runtime before use.
That way a single binary can use newer APIs when they are available
but still run on older OS releases.
Fair enough. I think I don't fully understand the role of "deployment
target": to me it was the *maximum* version I want to be able to link
against, but apparently it is the opposite.
The SDK you build against determines the latest APIs that can be used
(MAC_OS_X_VERSION_MAX_ALLOWED) while MACOSX_DEPLOYMENT_TARGET (which
affects MAC_OS_X_VERSION_MIN_REQUIRED) determines the oldest OS on which
the binary can run.
That means, symbols available on MAC_OS_X_VERSION_MIN_REQUIRED are
linked normally, while symbols that are available on
MAC_OS_X_VERSION_MAX_ALLOWED but not MAC_OS_X_VERSION_MIN_REQUIRED are
weak linked, and trying to use symbols that are not available on
MAC_OS_X_VERSION_MAX_ALLOWED results in a link error.
However, the motivation for my the original post was more to talk about
if it makes sense to have something done on MacPorts level to mitigate
this issue or just deal with it on a port-by-port basis. Just to be
clear: I'm not advocating one or the other — I'm just curious about what
the lists thinks.
Well, our installation instructions say to install the Command Line
Tools, which avoids this problem. I guess we could try setting
MAC_OS_X_VERSION_MAX_ALLOWED explicitly, but unlike
MACOSX_DEPLOYMENT_TARGET, it isn't picked up from the environment by the
compiler driver, so a lot of ports would require special handling to get
it into the CPPFLAGS.
- Josh