Как указать зависимость от внешней библиотеки C в .cabal? - PullRequest
14 голосов
/ 10 февраля 2011

Я поддерживаю библиотеку с привязками 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 для проверки прямо сейчас)?

Ответы [ 2 ]

14 голосов
/ 10 февраля 2011

Метод pkg-config предпочтительнее, потому что pkg-config знает, где найти файлы включения и библиотеки, которые могут находиться в нестандартных местах в некоторых системах.

Вы можете написать файл .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
5 голосов
/ 10 февраля 2011

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

...