Как указать зависимость от внешней библиотеки 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.