build legacy-support for an older OS than the host OS?
René J.V. Bertin
rjvbertin at gmail.com
Wed Jun 4 12:02:17 UTC 2025
On Tuesday June 03 2025 21:26:18 Fred Wright wrote:
Thanks!
>2a) Set SDKROOT to point to the target SDK.
I of course ended up trying my hand at this, and actually succeeding for 10.7. I used this addition in the legacy-support port:
# set host_os_version ${macosx_deployment_target}
# variant sdk10.7 description {build as if on OS X 10.7} {}
# if {[variant_isset sdk10.7]} {
# set macosx_deployment_target 10.7
# configure.sdk_version ${macosx_deployment_target}
# set extraflags -D__MPLS_TARGET_OSVER=1070
# }
# if {${host_os_version} ne ${macosx_deployment_target}} {
# ui_warn "Building for ${configure.sdk_version}!"
# configure.sdkroot [portconfigure::configure_get_sdkroot ${configure.sdk_version}]
# # somehow we need to invoke this twice?!
# configure.sdkroot [portconfigure::configure_get_sdkroot ${configure.sdk_version}]
# set extraflags "${extraflags} \
# -mmacosx-version-min=${macosx_deployment_target} \
# -isysroot${configure.sdkroot}"
# configure.cflags-append {*}${extraflags}
# configure.cxxflags-append {*}${extraflags}
# configure.ldflags-append {*}${extraflags}
# }
then manually installed the static archive with a version suffix to its name. I wasn't really motivated to risk breaking my entire install by installing the corresponding shared libraries though they'd probably work and just make me use the "backported" versions of a handful of functions that my host 10.9.5 has over 10.7 .
Then, in the port this all started for, I added
# platform darwin {
# set host_os_version ${macosx_deployment_target}
# variant sdk10.7 description {build as if on OS X 10.7} {}
# if {[variant_isset sdk10.7]} {
# set macosx_deployment_target 10.7
# configure.sdk_version ${macosx_deployment_target}
# legacysupport.use_mp_libcxx yes
# # very important: tell the legacysupport headers which OS version we're targetting!
# set extraflags -D__MPLS_TARGET_OSVER=1070
# }
# if {${host_os_version} ne ${macosx_deployment_target}} {
# ui_warn "Building for ${configure.sdk_version}!"
# configure.sdkroot [portconfigure::configure_get_sdkroot ${configure.sdk_version}]
# # somehow we need to invoke this twice?!
# configure.sdkroot [portconfigure::configure_get_sdkroot ${configure.sdk_version}]
# set extraflags "${extraflags} -mmacosx-version-min=${macosx_deployment_target} \
# -isysroot${configure.sdkroot}"
# configure.cflags-append {*}${extraflags}
# configure.cxxflags-append {*}${extraflags}
# configure.ldflags-append {*}${extraflags}
#
# proc legacysupport::get_library_name {} {
# global prefix macosx_deployment_target
# return ${prefix}/lib/libMacportsLegacySupport-${macosx_deployment_target}.a
# }
# }
# }
#
and got a proper 10.7 binary. (Full disclosure: I use a hotpatched official rust toolchain, which always sets the min os version to 10.12 so I need vtool to fix that - and had to enable building vtool in port:cctools first).
That binary works ... on 10.9 . I don't think I have yet heard back if it also does on 10.7 but in theory it should esp. since I haven't found any indication that it actually calls any of those functions 10.7 doesn't have.
If ever I were to pursue this more seriously I'd probably add legacy-support supports for a select number of older SDKs, which install just that versioned static archive, and maybe add a convenience procedure to the legacy-support PG to add the appropriate TARGET_OSVER macro definition to CPPFLAGS.
Re 10.6 : I tried that first. Turns out that this would add a backported function that calls a function (chk_fail or something like that) which is itself unavailable on 10.9 .
R.
More information about the macports-dev
mailing list