将 Swift 脚本编译为通用二进制文件的热门方法
Hot to compile a Swift script to a universal binary
我们可以轻松编译 Swift 脚本:
$ swiftc /path/to/script.swift -o /path/to/binary
但是,这仅适用于当前架构。
$ lipo -archs /path/to/binary
arm64
我找到了一些为多种架构构建的命令,但它们似乎需要设置一个新项目。我不想也不需要这样做,现在我只想轻松地编译一个脚本文件,因此 swiftc
。有办法吗?
作为奖励,是否需要安装 Rosetta 2 才能生成通用二进制文件,或者是否可以在没有它的情况下生成它们?
您需要构建二进制文件两次,例如,对于一个针对 macOS 的项目,您将使用 -target x86_64-apple-macos10.15
编译一次,而另一次使用 -target arm64-apple-macos10.15
.
之后,您将使用 lipo -create
将它们拼接成一个文件,如下所示 lipo -create <path/to/arm64-slice> <path/to/x86_64-slice> -output <path/to/universal/binary>
。
我是这样做的:
➜ UniversalBinaryTest swiftc source.swift -target x86_64-apple-macos10.15 -o binary_x86-64
➜ UniversalBinaryTest lipo -archs binary_x86-64
x86_64
➜ UniversalBinaryTest swiftc source.swift -target arm64-apple-macos10.15 -o binary_arm64
➜ UniversalBinaryTest lipo -archs binary_arm64
arm64
➜ UniversalBinaryTest lipo -create binary_x86-64 binary_arm64 -output binary_universal
➜ UniversalBinaryTest lipo -archs binary_universal
x86_64 arm64
完成所有这些之后,您可能想要 re-sign 新的二进制文件。
编辑:实际上,如果两个切片都已签名,看起来 lipo 会为您处理签名:
➜ UniversalBinaryTest codesign -s - binary_x86-64
➜ UniversalBinaryTest codesign -vvv binary_x86-64
binary_x86-64: valid on disk
binary_x86-64: satisfies its Designated Requirement
➜ UniversalBinaryTest codesign -vvvvv binary_x86-64
binary_x86-64: valid on disk
binary_x86-64: satisfies its Designated Requirement
➜ UniversalBinaryTest codesign -s - binary_arm64
➜ UniversalBinaryTest lipo -create binary_x86-64 binary_arm64 -output binary_universal
➜ UniversalBinaryTest codesign -vvv binary_universal
binary_universal: valid on disk
binary_universal: satisfies its Designated Requirement
我们可以轻松编译 Swift 脚本:
$ swiftc /path/to/script.swift -o /path/to/binary
但是,这仅适用于当前架构。
$ lipo -archs /path/to/binary
arm64
我找到了一些为多种架构构建的命令,但它们似乎需要设置一个新项目。我不想也不需要这样做,现在我只想轻松地编译一个脚本文件,因此 swiftc
。有办法吗?
作为奖励,是否需要安装 Rosetta 2 才能生成通用二进制文件,或者是否可以在没有它的情况下生成它们?
您需要构建二进制文件两次,例如,对于一个针对 macOS 的项目,您将使用 -target x86_64-apple-macos10.15
编译一次,而另一次使用 -target arm64-apple-macos10.15
.
之后,您将使用 lipo -create
将它们拼接成一个文件,如下所示 lipo -create <path/to/arm64-slice> <path/to/x86_64-slice> -output <path/to/universal/binary>
。
我是这样做的:
➜ UniversalBinaryTest swiftc source.swift -target x86_64-apple-macos10.15 -o binary_x86-64
➜ UniversalBinaryTest lipo -archs binary_x86-64
x86_64
➜ UniversalBinaryTest swiftc source.swift -target arm64-apple-macos10.15 -o binary_arm64
➜ UniversalBinaryTest lipo -archs binary_arm64
arm64
➜ UniversalBinaryTest lipo -create binary_x86-64 binary_arm64 -output binary_universal
➜ UniversalBinaryTest lipo -archs binary_universal
x86_64 arm64
完成所有这些之后,您可能想要 re-sign 新的二进制文件。
编辑:实际上,如果两个切片都已签名,看起来 lipo 会为您处理签名:
➜ UniversalBinaryTest codesign -s - binary_x86-64
➜ UniversalBinaryTest codesign -vvv binary_x86-64
binary_x86-64: valid on disk
binary_x86-64: satisfies its Designated Requirement
➜ UniversalBinaryTest codesign -vvvvv binary_x86-64
binary_x86-64: valid on disk
binary_x86-64: satisfies its Designated Requirement
➜ UniversalBinaryTest codesign -s - binary_arm64
➜ UniversalBinaryTest lipo -create binary_x86-64 binary_arm64 -output binary_universal
➜ UniversalBinaryTest codesign -vvv binary_universal
binary_universal: valid on disk
binary_universal: satisfies its Designated Requirement