Горячо скомпилировать сценарий Swift в универсальный двоичный файл

Мы можем легко скомпилировать скрипт Swift с помощью:

      $ swiftc /path/to/script.swift -o /path/to/binary

Однако это компилируется только для текущей архитектуры.

      $ lipo -archs /path/to/binary
arm64

Я нашел несколько команд для сборки для нескольких архитектур, но, похоже, они требуют настройки нового проекта. Я пока не хочу и не должен этого делать, сейчас я просто хочу легко скомпилировать один файл сценария, поэтому . Есть ли способ сделать это?

В качестве бонуса нужно ли устанавливать Rosetta 2 для генерации универсальных бинарников или можно сделать без нее?

1 ответ

Вам нужно будет собрать двоичный файл два раза, например, для проекта, предназначенного для 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

После всего этого вы, вероятно, захотите повторно подписать новый двоичный файл.

Редактировать: На самом деле, похоже, что 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
Другие вопросы по тегам