In a typical build environment the toolchain will use the value of the MACOSX_DEPLOYMENT_TARGET environment variable to determine the version of macOS to support. When cross compiling there are two distinct toolchains, but they will look at this single environment variable. To avoid contamination, we always set the equivalent command line flag which effectively disables the toolchain's internal handling. Prior to this change, the MACOSX_DEPLOYMENT_TARGET variable was ignored, and the toolchains always used the Nix platform definition (`darwinMinVersion`) unless overridden with command line arguments. This change restores support for MACOSX_DEPLOYMENT_TARGET, and adds nix-specific MACOSX_DEPLOYMENT_TARGET_FOR_BUILD and MACOSX_DEPLOYMENT_TARGET_FOR_TARGET for cross compilation.
78 lines
2.9 KiB
Bash
78 lines
2.9 KiB
Bash
# N.B. It may be a surprise that the derivation-specific variables are exported,
|
|
# since this is just sourced by the wrapped binaries---the end consumers. This
|
|
# is because one wrapper binary may invoke another (e.g. cc invoking ld). In
|
|
# that case, it is cheaper/better to not repeat this step and let the forked
|
|
# wrapped binary just inherit the work of the forker's wrapper script.
|
|
|
|
var_templates_list=(
|
|
NIX_CFLAGS_COMPILE
|
|
NIX_CFLAGS_COMPILE_BEFORE
|
|
NIX_CFLAGS_LINK
|
|
NIX_CXXSTDLIB_COMPILE
|
|
NIX_CXXSTDLIB_LINK
|
|
NIX_GNATFLAGS_COMPILE
|
|
)
|
|
var_templates_bool=(
|
|
NIX_ENFORCE_NO_NATIVE
|
|
)
|
|
|
|
accumulateRoles
|
|
|
|
# We need to mangle names for hygiene, but also take parameters/overrides
|
|
# from the environment.
|
|
for var in "${var_templates_list[@]}"; do
|
|
mangleVarList "$var" ${role_suffixes[@]+"${role_suffixes[@]}"}
|
|
done
|
|
for var in "${var_templates_bool[@]}"; do
|
|
mangleVarBool "$var" ${role_suffixes[@]+"${role_suffixes[@]}"}
|
|
done
|
|
|
|
# `-B@out@/bin' forces cc to use ld-wrapper.sh when calling ld.
|
|
NIX_CFLAGS_COMPILE_@suffixSalt@="-B@out@/bin/ $NIX_CFLAGS_COMPILE_@suffixSalt@"
|
|
|
|
# Export and assign separately in order that a failing $(..) will fail
|
|
# the script.
|
|
|
|
if [[ "$cInclude" = 1 ]] && [ -e @out@/nix-support/libc-cflags ]; then
|
|
NIX_CFLAGS_COMPILE_@suffixSalt@="$(< @out@/nix-support/libc-cflags) $NIX_CFLAGS_COMPILE_@suffixSalt@"
|
|
fi
|
|
|
|
if [ -e @out@/nix-support/libc-crt1-cflags ]; then
|
|
NIX_CFLAGS_COMPILE_@suffixSalt@="$(< @out@/nix-support/libc-crt1-cflags) $NIX_CFLAGS_COMPILE_@suffixSalt@"
|
|
fi
|
|
|
|
if [ -e @out@/nix-support/libcxx-cxxflags ]; then
|
|
NIX_CXXSTDLIB_COMPILE_@suffixSalt@+=" $(< @out@/nix-support/libcxx-cxxflags)"
|
|
fi
|
|
|
|
if [ -e @out@/nix-support/libcxx-ldflags ]; then
|
|
NIX_CXXSTDLIB_LINK_@suffixSalt@+=" $(< @out@/nix-support/libcxx-ldflags)"
|
|
fi
|
|
|
|
if [ -e @out@/nix-support/cc-cflags ]; then
|
|
NIX_CFLAGS_COMPILE_@suffixSalt@="$(< @out@/nix-support/cc-cflags) $NIX_CFLAGS_COMPILE_@suffixSalt@"
|
|
fi
|
|
|
|
if [ -e @out@/nix-support/gnat-cflags ]; then
|
|
NIX_GNATFLAGS_COMPILE_@suffixSalt@="$(< @out@/nix-support/gnat-cflags) $NIX_GNATFLAGS_COMPILE_@suffixSalt@"
|
|
fi
|
|
|
|
if [ -e @out@/nix-support/cc-ldflags ]; then
|
|
NIX_LDFLAGS_@suffixSalt@+=" $(< @out@/nix-support/cc-ldflags)"
|
|
fi
|
|
|
|
if [ -e @out@/nix-support/cc-cflags-before ]; then
|
|
NIX_CFLAGS_COMPILE_BEFORE_@suffixSalt@="$(< @out@/nix-support/cc-cflags-before) $NIX_CFLAGS_COMPILE_BEFORE_@suffixSalt@"
|
|
fi
|
|
|
|
# Only add darwin min version flag if a default darwin min version is set,
|
|
# which is a signal that we're targetting darwin.
|
|
if [ "@darwinMinVersion@" ]; then
|
|
mangleVarSingle MACOSX_DEPLOYMENT_TARGET ${role_suffixes[@]+"${role_suffixes[@]}"}
|
|
|
|
NIX_CFLAGS_COMPILE_BEFORE_@suffixSalt@="-m@darwinPlatformForCC@-version-min=${MACOSX_DEPLOYMENT_TARGET_@suffixSalt@:-@darwinMinVersion@} $NIX_CFLAGS_COMPILE_BEFORE_@suffixSalt@"
|
|
fi
|
|
|
|
# That way forked processes will not extend these environment variables again.
|
|
export NIX_CC_WRAPPER_FLAGS_SET_@suffixSalt@=1
|