Установить цель macOS для `swift package generate-xcodeproj`?

Есть ли способ установить цель macOS для swift package generate-xcodeproj генерации проектов Xcode?

Например, установите цель по умолчанию на «x86_64-apple-macosx10.12».

Фон

В настоящее время набор инструментов Xcode 9.2 Swift показывает следующие версии в командной строке:

swift --version
# Apple Swift version 4.0.3 (swiftlang-900.0.74.1 clang-900.0.39.2)
# Target: x86_64-apple-macosx10.9
swift package --version
# Apple Swift Package Manager - Swift 4.0.0-dev (swiftpm-13752)

Результатом swift package generate-xcodeproj является проект Xcode с целью macOS 10.10.

Примечание: сгенерированная цель Xcode 10.10 на одну версию выше целевой версии компилятора быстрой командной строки 10.9. Таким образом, очевидно, целевые объекты macOS по умолчанию для swift и swift package generate-xcodeproj определяются независимо друг от друга.

Пока что любое решение с Package.swift , --xcconfig-overrides, или что-то еще было неуловимым.


person l --marc l    schedule 12.12.2017    source источник
comment
Ищу решение и для этого. То же самое относится и к лучшему способу сделать это: oleb.net/blog/2017/04/   -  person Klaas    schedule 07.01.2018
comment
@Klaas К вашему сведению, я опубликовал свой обходной путь для swift package generate-xcodeproj и …-Xswiftc "-target" -Xswiftc "x86_64… здесь   -  person l --marc l    schedule 09.01.2018


Ответы (4)


Предложение по развитию Swift SE -0236 добавлена ​​конфигурация минимально необходимой цели развертывания для каждой платформы:

// swift-tools-version:5.0
import PackageDescription

let package = Package(
    name: "MyTool",
    platforms: [
        // specify each minimum deployment requirement, 
        //otherwise the platform default minimum is used.
       .macOS(.v10_13),
    ],
     targets: [
        .target(name: "MyTool", dependencies: ["foo", "bar"]),
    ],
    swiftLanguageVersions: [.v5]
)

Это приводит к тому, что целевой объект «MyTool» в проекте Xcode имеет значение «Целевое значение развертывания», равное 10,13.

person Klaas    schedule 15.06.2019

Swift 5

Менеджер пакетов Swift 5 теперь позволяет указывать минимально необходимую целевую платформу с помощью platforms в Package.swift. ... см. ответ Клааса.

Swift 4

В итоге я создал псевдонимы swiftxcode, swiftbuild и swifttest bash в качестве обходного пути для упрощения:

  1. установка цели macOS с помощью swift package generate-xcodeproj и
  2. скрытие swift build -Xswiftc "-target" -Xswiftc "x86_64-…"

Настройка

Отредактируйте и source ~/.bash_profile, чтобы добавить псевдонимы swiftxcode, swiftbuild и swifttest в командную строку.

###################################
### Swift Package Manager (SPM) ###
###################################
alias swiftxcode="swift package generate-xcodeproj --xcconfig-overrides Package.xcconfig"
alias swiftbuild='swift build -Xswiftc "-target" -Xswiftc "x86_64-apple-macosx10.12"'
alias swifttest='swift test -Xswiftc "-target" -Xswiftc "x86_64-apple-macosx10.12"'

Отредактируйте Package.swift в проекте, чтобы указать, используя инструменты Swift Package Manager версии 4:

// swift-tools-version:4.0
import PackageDescription

let package = Package(…

Добавьте Package.xcconfig в папку проекта:

/// Package.xcconfig

/// macOS Deployment Target
/// 
/// Code will load on this and later versions of macOS. 
/// Framework APIs that are unavailable in earlier versions will be weak-linked; 
/// your code should check for `null` function pointers 
/// or specific system versions before calling newer APIs.

MACOSX_DEPLOYMENT_TARGET=10.12

Примечание. Необязательно, BuildSettingExtractor (xcodeproj → xcconfig), созданный Джеймс Демпси может быть полезным чтобы изучить другие настройки, которые можно добавить в Package.xcconfig файл.

Использование

cd to/some_project_folder/
swiftxcode     # create Xcode project
swiftbuild     # build from command line
swifttest      # build and run tests from command line

Предостережения

  1. Package.xcconfig устанавливает значения параметров сборки только на целевом уровне в проекте Xcode. Общий уровень проекта Значения параметров сборки остаются неизменными.
  2. Package.xcconfig значения проекта установлены одинаковыми для всех целей. В настоящее время не существует механизма для xcconfig для каждой цели.
  3. Некоторые значения xcconfig, такие как SKIP_INSTALL, может потребоваться установить вручную в проекте Xcode.

Дорожная карта

Будем надеяться, что текущий ограниченный xcconfig подход, показанный выше, будет заменен возможностью указывать настраиваемые параметры сборки в манифесте пакета, как описано в План развития диспетчера пакетов Swift 4.

Поддержка файла конфигурации

Мы рассматриваем возможность добавления механизма файла конфигурации, который может зависеть от пользователя или пакета, чтобы можно было настраивать определенные поведения диспетчера пакетов. Одним из непосредственных вариантов использования этого может быть временный механизм для передачи переопределяющих флагов компилятора для пакета, хотя мы надеемся решить эту проблему с помощью реальной модели настроек сборки. Другие варианты использования файла конфигурации находятся на рассмотрении.

Также стоит отметить, что Apple «New Build System (Preview)», написанная на Swift и выпущенная с Xcode 9, может использовать xcconfig файлы для определения настроек сборки.

Ресурсы

person l --marc l    schedule 08.01.2018

В случае, если официальные инструменты Swift не допускают некоторых манипуляций с проектом Xcode, вы можете вернуться к написанию сценария, который обновит сгенерированный проект Xcode для вас.

Вы можете использовать xcodeproj rubygem. См. пример сценария.

См. Связанный вопрос Диспетчер пакетов Swift и Xcode: сохранение настроек Xcode?

person Vadim Eisenberg    schedule 14.12.2017

Шаги для достижения этой цели без сторонних инструментов.

1) Создайте файл macos.xcconfig в папке / Sources со следующим содержимым

MACOSX_DEPLOYMENT_TARGET = 10.12

2) Запустите эту команду в корне вашего проекта

swift package generate-xcodeproj --xcconfig-overrides Sources/macos.xcconfig
person Alex    schedule 15.02.2019