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.launchpad/nixpkgs/master
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 |
Loading…
Reference in new issue