2011-02-10 2 views
13

Я поддерживаю библиотеку с привязками FFI к Hackage. Поэтому моя библиотека Haskell зависит от соответствующей библиотеки C и ее файлов заголовков. Теперь я указать внешнюю зависимость в .cabal файла, как это:Как указать зависимость от внешней библиотеки C в .cabal?

PkgConfig-Depends: 
     libfoo >= 1.2 

И это хорошо работает для меня в Linux. Тем не менее, у меня есть пользователь библиотеки, который сообщает, что установка pkg-config на Windows, является довольно громоздкой, а вместо этого он предпочитает

Includes: 
     foo.h 
Extra-libraries: 
     foo 

Я хотел бы моя библиотека, чтобы быть столь же легко построить, как это возможно, и Дон» t хотят заставить строить зависимости, которые строго не требуются. Однако я вижу, что Cabal manual предлагает использовать PkgConfig-Depends.

Мои вопросы:

  • Какой путь я должен предпочесть для пакетов кросс-платформенных?
  • Можно ли написать файл .cabal таким образом, чтобы он мог работать с pkg-config и без?
  • И, кстати, есть pkg-config, входящий в платформу Haskell (у меня нет Windows-компьютера для проверки прямо сейчас)?
+3

pkg-config не входит в состав платформы Windows (2010.2.0.0). –

+0

спасибо, @Stephen. – sastanin

ответ

12

Метод 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 
+0

Спасибо. Я выбрал этот подход с флагом, увы, я предпочел флаг NoPkgConfig, потому что 'cabal configure -fNoPkgConfig' более читаем, чем' cabal configure -f-UsePkgConfig'. Этот подход хорошо работает в Linux (с установленным и установленным «pkg-config»).Я расскажу, что обратная связь с пользователями Windows будет позже. – sastanin

+0

Обновление: этот подход хорошо работает и в Windows. – sastanin

5

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

+0

Спасибо. Я решил сделать что-то подобное, но, вероятно, решение, предложенное @Heatsink, более гибкое. Сначала я попробую. – sastanin

+2

@jetxee - это правда, что флаги могут быть более гибкими, но могут также вызвать проблемы. Кажется, что Cabal хочет перекомпилировать уже установленные пакеты, когда новый пакет построен с другим набором флагов, что может привести к тому, что ваш пакет db будет несовместим. Я могу быть предвзятым, потому что мне просто пришлось исправить свой пакет db. –

Смежные вопросы