summaryrefslogtreecommitdiff
path: root/Modules/CMakeIOSInstallCombined.cmake
diff options
context:
space:
mode:
authorGregor Jasny <gjasny@googlemail.com>2020-08-08 14:34:09 +0200
committerGregor Jasny <gjasny@googlemail.com>2020-08-08 15:22:12 +0200
commit5852b8867f77c17ae4c905c4f41db850f8d53d47 (patch)
tree35a06ee9baded35e32a053cf56922ae89edd21a4 /Modules/CMakeIOSInstallCombined.cmake
parent79098d23eb2ac54ad8c47e27cdb614d73a64282c (diff)
downloadcmake-5852b8867f77c17ae4c905c4f41db850f8d53d47.tar.gz
CMakeIOSInstallCombined: Enforce disjoint architecture sets
Starting with Xcode 12 the arm64 architecture is supported as an iOS device as well as simulator architecture. But the fat macho file format does not distinguish by SDK, only by architecture. That makes lipo (rightfully) complain that it cannot add both architectures to a single file. To work around we make sure that both SDKs are built for a disjoint set of architectures. If an architecture is present for both SDKs we prefer the currently configured one. The log output has been extended to reflect that: ``` [iOS combined] Architectures (iphoneos): arm64 arm64e armv7 armv7s [iOS combined] Architectures (iphonesimulator): arm64 arm64e i386 x86_64 [iOS combined] Architectures (iphonesimulator) after pruning: i386 x86_64 ```
Diffstat (limited to 'Modules/CMakeIOSInstallCombined.cmake')
-rw-r--r--Modules/CMakeIOSInstallCombined.cmake14
1 files changed, 13 insertions, 1 deletions
diff --git a/Modules/CMakeIOSInstallCombined.cmake b/Modules/CMakeIOSInstallCombined.cmake
index 418bafd630..44bb622f47 100644
--- a/Modules/CMakeIOSInstallCombined.cmake
+++ b/Modules/CMakeIOSInstallCombined.cmake
@@ -80,6 +80,17 @@ function(_ios_install_combined_get_valid_archs sdk resultvar)
cmake_policy(POP)
endfunction()
+# Make both arch lists a disjoint set by preferring the current SDK
+# (starting with Xcode 12 arm64 is available as device and simulator arch on iOS)
+function(_ios_install_combined_prune_common_archs corr_sdk corr_archs_var this_archs_var)
+ list(REMOVE_ITEM ${corr_archs_var} ${${this_archs_var}})
+
+ string(REPLACE ";" " " printable "${${corr_archs_var}}")
+ _ios_install_combined_message("Architectures (${corr_sdk}) after pruning: ${printable}")
+
+ set("${corr_archs_var}" "${${corr_archs_var}}" PARENT_SCOPE)
+endfunction()
+
# Final target can contain more architectures that specified by SDK. This
# function will run 'lipo -info' and parse output. Result will be returned
# as a CMake list.
@@ -266,8 +277,9 @@ function(ios_install_combined target destination)
_ios_install_combined_detect_sdks(this_sdk corr_sdk)
# Get architectures of the target
- _ios_install_combined_get_valid_archs("${corr_sdk}" corr_valid_archs)
_ios_install_combined_get_valid_archs("${this_sdk}" this_valid_archs)
+ _ios_install_combined_get_valid_archs("${corr_sdk}" corr_valid_archs)
+ _ios_install_combined_prune_common_archs("${corr_sdk}" corr_valid_archs this_valid_archs)
# Return if there are no valid architectures for the SDK.
# (note that library already installed)