bintools-wrapper: default platform versions for darwin
Instead of always supplying flags, apply the flags as defaults. Use clang's native flags instead of lifting the linker flags from binutils with `-Wl,`. If a project is using clang to drive linking, make clang do the right thing with MACOSX_DEPLOYMENT_TARGET. This can be overridden by command line arguments. This will cause modern clang to pass `-platform_version 10.12 0.0.0`, since it doesn't know about the SDK settings. Older versions of clang will pass down `-macos_version_min` flags with no sdk version. At the linker layer, apply a default value for anything left ambiguous. If nothing is specified, pass a full `-platform_version`. If only `-macos_version_min` is specified, then lock down the sdk_version explicitly with `-sdk_version`. If a min version and sdk version is passed, do nothing.
This commit is contained in:
parent
44f09ccabf
commit
6605fadc68
@ -0,0 +1,70 @@
|
|||||||
|
# Unconditionally adding in platform version flags will result in warnings that
|
||||||
|
# will be treated as errors by some packages. Add any missing flags here.
|
||||||
|
|
||||||
|
# There are two things to be configured: the "platform version" (oldest
|
||||||
|
# supported version of macos, ios, etc), and the "sdk version".
|
||||||
|
#
|
||||||
|
# The modern way of configuring these is to use:
|
||||||
|
# -platform_version $platform $platform_version $sdk_version"
|
||||||
|
#
|
||||||
|
# The old way is still supported, and uses flags like:
|
||||||
|
# -${platform}_version_min $platform_version
|
||||||
|
# -sdk_version $sdk_version
|
||||||
|
#
|
||||||
|
# If both styles are specified ld will combine them. If multiple versions are
|
||||||
|
# specified for the same platform, ld will emit an error.
|
||||||
|
#
|
||||||
|
# The following adds flags for whichever properties have not already been
|
||||||
|
# provided.
|
||||||
|
|
||||||
|
havePlatformVersionFlag=
|
||||||
|
haveDarwinSDKVersion=
|
||||||
|
haveDarwinPlatformVersion=
|
||||||
|
|
||||||
|
n=0
|
||||||
|
nParams=${#params[@]}
|
||||||
|
while (( n < nParams )); do
|
||||||
|
p=${params[n]}
|
||||||
|
case "$p" in
|
||||||
|
# the current platform
|
||||||
|
-@darwinPlatform@_version_min)
|
||||||
|
haveDarwinPlatformVersion=1
|
||||||
|
;;
|
||||||
|
|
||||||
|
# legacy aliases
|
||||||
|
-macosx_version_min|-iphoneos_version_min|-iosmac_version_min|-uikitformac_version_min)
|
||||||
|
haveDarwinPlatformVersion=1
|
||||||
|
;;
|
||||||
|
|
||||||
|
-sdk_version)
|
||||||
|
haveDarwinSDKVersion=1
|
||||||
|
;;
|
||||||
|
|
||||||
|
-platform_version)
|
||||||
|
havePlatformVersionFlag=1
|
||||||
|
|
||||||
|
# If clang can't determine the sdk version it will pass 0.0.0. This
|
||||||
|
# has runtime effects so we override this to use the known sdk
|
||||||
|
# version.
|
||||||
|
if [ "${params[n+3]-}" = 0.0.0 ]; then
|
||||||
|
params[n+3]=@darwinSdkVersion@
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
n=$((n + 1))
|
||||||
|
done
|
||||||
|
|
||||||
|
# If the caller has set -platform_version, trust they're doing the right thing.
|
||||||
|
# This will be the typical case for clang in nixpkgs.
|
||||||
|
if [ ! "$havePlatformVersionFlag" ]; then
|
||||||
|
if [ ! "$haveDarwinSDKVersion" ] && [ ! "$haveDarwinPlatformVersion" ]; then
|
||||||
|
# Nothing provided. Use the modern "-platform_version" to set both.
|
||||||
|
extraBefore+=(-platform_version @darwinPlatform@ @darwinMinVersion@ @darwinSdkVersion@)
|
||||||
|
elif [ ! "$haveDarwinSDKVersion" ]; then
|
||||||
|
# Add missing sdk version
|
||||||
|
extraBefore+=(-sdk_version @darwinSdkVersion@)
|
||||||
|
elif [ ! "$haveDarwinPlatformVersion" ]; then
|
||||||
|
# Add missing platform version
|
||||||
|
extraBefore+=(-@darwinPlatform@_version_min @darwinMinVersion@)
|
||||||
|
fi
|
||||||
|
fi
|
@ -252,11 +252,6 @@ stdenv.mkDerivation {
|
|||||||
fi
|
fi
|
||||||
'')
|
'')
|
||||||
|
|
||||||
# Ensure consistent LC_VERSION_MIN_MACOSX and remove LC_UUID.
|
|
||||||
+ optionalString stdenv.targetPlatform.isMacOS ''
|
|
||||||
echo "-sdk_version 10.12 -no_uuid" >> $out/nix-support/libc-ldflags-before
|
|
||||||
''
|
|
||||||
|
|
||||||
##
|
##
|
||||||
## User env support
|
## User env support
|
||||||
##
|
##
|
||||||
@ -310,6 +305,13 @@ stdenv.mkDerivation {
|
|||||||
echo "-arch ${targetPlatform.darwinArch}" >> $out/nix-support/libc-ldflags
|
echo "-arch ${targetPlatform.darwinArch}" >> $out/nix-support/libc-ldflags
|
||||||
''
|
''
|
||||||
|
|
||||||
|
###
|
||||||
|
### Remove LC_UUID
|
||||||
|
###
|
||||||
|
+ optionalString (stdenv.targetPlatform.isDarwin && !(stdenv.cc.bintools.bintools.isGNU or false)) ''
|
||||||
|
echo "-no_uuid" >> $out/nix-support/libc-ldflags-before
|
||||||
|
''
|
||||||
|
|
||||||
+ ''
|
+ ''
|
||||||
for flags in "$out/nix-support"/*flags*; do
|
for flags in "$out/nix-support"/*flags*; do
|
||||||
substituteInPlace "$flags" --replace $'\n' ' '
|
substituteInPlace "$flags" --replace $'\n' ' '
|
||||||
@ -320,6 +322,20 @@ stdenv.mkDerivation {
|
|||||||
substituteAll ${../wrapper-common/utils.bash} $out/nix-support/utils.bash
|
substituteAll ${../wrapper-common/utils.bash} $out/nix-support/utils.bash
|
||||||
''
|
''
|
||||||
|
|
||||||
|
###
|
||||||
|
### Ensure consistent LC_VERSION_MIN_MACOSX
|
||||||
|
###
|
||||||
|
+ optionalString stdenv.targetPlatform.isDarwin (
|
||||||
|
let
|
||||||
|
inherit (stdenv.targetPlatform) darwinMinVersion darwinPlatform darwinSdkVersion;
|
||||||
|
in ''
|
||||||
|
export darwinPlatform=${darwinPlatform}
|
||||||
|
export darwinMinVersion=${darwinMinVersion}
|
||||||
|
export darwinSdkVersion=${darwinSdkVersion}
|
||||||
|
substituteAll ${./add-darwin-ldflags-before.sh} $out/nix-support/add-local-ldflags-before.sh
|
||||||
|
''
|
||||||
|
)
|
||||||
|
|
||||||
##
|
##
|
||||||
## Extra custom steps
|
## Extra custom steps
|
||||||
##
|
##
|
||||||
|
@ -78,6 +78,14 @@ fi
|
|||||||
|
|
||||||
extraAfter+=($NIX_LDFLAGS_AFTER_@suffixSalt@)
|
extraAfter+=($NIX_LDFLAGS_AFTER_@suffixSalt@)
|
||||||
|
|
||||||
|
# These flags *must not* be pulled up to -Wl, flags, so they can't go in
|
||||||
|
# add-flags.sh. They must always be set, so must not be disabled by
|
||||||
|
# NIX_LDFLAGS_SET.
|
||||||
|
if [ -e @out@/nix-support/add-local-ldflags-before.sh ]; then
|
||||||
|
source @out@/nix-support/add-local-ldflags-before.sh
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
# Specify the target emulation if nothing is passed in ("-m" overrides this
|
# Specify the target emulation if nothing is passed in ("-m" overrides this
|
||||||
# environment variable). Ensures we never blindly fallback on targeting the host
|
# environment variable). Ensures we never blindly fallback on targeting the host
|
||||||
# platform.
|
# platform.
|
||||||
|
@ -143,6 +143,7 @@ stdenv.mkDerivation {
|
|||||||
|
|
||||||
passthru = {
|
passthru = {
|
||||||
inherit targetPrefix;
|
inherit targetPrefix;
|
||||||
|
isGNU = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
meta = with lib; {
|
meta = with lib; {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user