Ответ 1
вы можете использовать опцию sdk и target для этого. Вот пример:
/Projects/Test $ cat main.swift
print("Hello world!");
Компиляция для x86_64
/Projects/Test $ swiftc main.swift
/Projects/Test $ lipo -info main
Non-fat file: main is architecture: x86_64
/Projects/Test $ ./main
Hello world!
Компиляция для armv7
/Projects/Test $ swiftc main.swift -sdk /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.2.sdk -target armv7-apple-ios8.1
/Projects/Test $ lipo -info main
Non-fat file: main is architecture: armv7
Компиляция для arm64
/Projects/Test $ swiftc main.swift -sdk /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.2.sdk -target arm64-apple-ios8.1
/Projects/Test $ lipo -info main
Non-fat file: main is architecture: arm64
Я написал script build.sh
, чтобы его было проще использовать:
#!/bin/sh
TARGET_MAC_VERSION=10.11
TARGET_IOS_VERSION=8.1
if [ "$#" -ne 2 ]; then
echo "Usage $0: <armv7/arm64/x86_64> <file>"
exit
fi
if [ "$1" != 'armv7' ] && [ "$1" != 'arm64' ] && [ "$1" != 'x86_64' ]; then
echo "Usage $0: <armv7/arm64/x86_64>"
exit
fi
if [ "$1" == 'x86_64' ]; then
SDK=macosx
TARGET="x86_64-macosx$TARGET_MAC_VERSION"
else
SDK=iphoneos
TARGET="$1-apple-ios$TARGET_IOS_VERSION"
fi
echo "xcrun -sdk $SDK swiftc $2 -target $TARGET"
xcrun -sdk $SDK swiftc $2 -target $TARGET
Выход
$ ./build.sh armv7 main.swift
xcrun -sdk iphoneos swiftc main.swift -target armv7-apple-ios8.1
$ lipo -info main
Non-fat file: main is architecture: armv7
$ ./build.sh arm64 main.swift
xcrun -sdk iphoneos swiftc main.swift -target arm64-apple-ios8.1
$ lipo -info main
Non-fat file: main is architecture: arm64
$ ./build.sh x86_64 main.swift
xcrun -sdk macosx swiftc main.swift -target x86_64-macosx10.11
$ lipo -info main
Non-fat file: main is architecture: x86_64
Редактировать Примечание. Оптимизирован script на основе ввода из @jens. См. Комментарии для получения дополнительной информации.