Есть ли обычный способ доставки специфичного для поставщика пакета C вместе с базой кода Swift? - PullRequest
0 голосов
/ 09 мая 2018

Я хочу использовать существующую сложную библиотеку, написанную на C из моего клиентского кода Swift.

Давайте используем OpenSSL в качестве примера. В большинстве существующих решений используется либо привязка к общесистемной библиотеке [IBM] , либо преобразованное дерево исходных текстов способом, понятным Swift PM [PerfectlySoft] .

Я не хочу использовать пакет, предоставленный системой, из-за неопределенности совместимости: я хочу использовать точно такую ​​же версию на сервере сборки и на цели развертывания. Это также усложняет процесс установки. Я также не хочу использовать преобразованное исходное дерево, потому что этот подход хрупок, и, если я не ошибаюсь, нет легкодоступного инструмента для его автоматического выполнения.

Я попробовал проверить в своем репозитории нетронутую версию OpenSSL и снабдить ее пользовательской картой модулей и зонтичным заголовком. Основная проблема, с которой я сталкиваюсь, заключается в том, что Swift PM не может видеть его как модуль из коробки:

$ swift test
.../Tests.swift:5:8: error: no such module 'OpenSSL'

Однако Xcode с правильными -I и -L пользовательскими флагами создает его.

У меня все в порядке с сохранением этой версии OpenSSL в моем репозитории, даже с предварительно сконфигурированным, и я в порядке с дополнительным шагом сборки, таким как make, перед swift test. Несмотря на то, что это снижает эргономику разработчика, это не намного хуже, чем установка общесистемной библиотеки. С чем я не в порядке, так это с использованием Xcode в качестве единственного инструмента сборки.

В идеале я хочу, чтобы Swift PM передавал соответствующие -I, -L, -l компилятору. Любые примеры или подсказки будут оценены.

...