Как указать зависимость от внешней библиотеки C в .cabal?
Я поддерживаю библиотеку с привязками FFI к Hackage. Поэтому моя библиотека Haskell зависит от соответствующей библиотеки C и ее файлов заголовков. Теперь я указываю внешнюю зависимость в файле .cabal
следующим образом:
PkgConfig-Depends:
libfoo >= 1.2
И он отлично работает для меня в Linux. Однако у меня есть пользователь библиотеки, которая сообщает, что установка pkg-config
в Windows довольно громоздка, и вместо этого он предпочитает
Includes:
foo.h
Extra-libraries:
foo
Я бы хотел, чтобы моя библиотека была как можно проще построена, и не хочу форсировать зависимости, которые не требуются строго. Однако я вижу, что руководство Cabal предлагает использовать PkgConfig-Depends
.
Мои вопросы:
- В каком формате я предпочитаю использовать межплатформенные пакеты?
- Можно ли записать файл
.cabal
таким образом, чтобы он мог работать с pkg-config
и без?
- И, кстати,
pkg-config
включен в платформу Haskell (у меня нет Windows-компьютера для проверки прямо сейчас)?
Ответы
Ответ 1
Метод pkg-config предпочтительнее, потому что pkg-config знает, где найти файлы include и библиотеки, которые могут находиться в нестандартных местоположениях в некоторых системах.
Вы можете написать файл .cabal для использования обоих методов. Использование флага, как показано здесь, имеет то преимущество, что Cabal будет автоматически проверять значение другого флага, если по умолчанию происходит сбой. (Ниже пример не проверен)
Flag UsePkgConfig
Description: Use pkg-config to check for library dependences
Default: True
Executable hax
if flag(UsePkgConfig)
PkgConfig-Depends: libfoo >= 1.2
else
Includes: foo.h
Extra-libraries: foo
Ответ 2
pkg-config
не включен в платформу Haskell, и я не мог себе представить, что он когда-либо был.
Обычно я использую includes/Extra-libraries
, если они относительно просты. Но для сложных пакетов, в которых может быть много встроенных библиотек, таких как gtk, гораздо удобнее использовать pkg-config, когда они доступны.
Можно написать файл .cabal, который будет работать с определенными полями и без них. Попробуйте следующее:
if os(windows)
Includes:
foo.h
Extra-libraries:
foo
else
PkgConfig-Depends:
libfoo >= 1.2
Также обратите внимание, что .cabal
может запускать configure script, который может помочь в некоторых ситуациях, но не очень удобен для Windows.