Я хочу использовать существующую сложную библиотеку, написанную на 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
компилятору. Любые примеры или подсказки будут оценены.