2011-02-10 14 views
13

Utrzymuję bibliotekę z powiązaniami FFI w ramach Hackage. Tak więc moja biblioteka Haskella zależy od odpowiedniej biblioteki C i jej plików nagłówkowych. Teraz określić zależność od zewnętrznych w pliku jak to .cabal:Jak określić zależność od zewnętrznej biblioteki C w .cabal?

PkgConfig-Depends: 
     libfoo >= 1.2 

I to działa dobrze dla mnie w systemie Linux. Mam jednak użytkownikowi biblioteki, który informuje, że instalacja pkg-config na Windows jest dość uciążliwe, a zamiast tego woli

Includes: 
     foo.h 
Extra-libraries: 
     foo 

Chciałbym moja biblioteka być tak proste, jak to możliwe, aby zbudować i don” t chcą wymuszać zależności budowania, które nie są ściśle wymagane. Jednak widzę, że Cabal manual sugeruje użycie .

Moje pytania:

  • Którędy Wolałbym pakietów cross-platform?
  • Czy można napisać plik .cabal w taki sposób, aby mógł on pracować z pkg-config i bez?
  • I, przy okazji, jest pkg-config zawarty w platformie Haskell (nie mam komputera z Windowsem do sprawdzenia teraz)?
+3

pkg-config nie jest dołączony do platformy w systemie Windows (2010.2.0.0). –

+0

dziękuję, @ ​​Stephen. – sastanin

Odpowiedz

12

Metoda pkg-config jest preferowana, ponieważ pkg-config wie, gdzie znaleźć pliki włączeń i biblioteki, które mogą znajdować się w niestandardowych lokalizacjach w niektórych systemach.

Możesz zapisać plik .cabal, aby użyć obu metod. Używanie flagi, jak pokazano tutaj, ma tę zaletę, że Cabal automatycznie wypróbuje inną wartość flagi, jeśli domyślnie nie powiedzie się. (Poniżej przykład nie jest testowany)

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

Dziękuję. Wybrałem to podejście z flagą, ale zamiast tego wolałem flagę 'NoPkgConfig', ponieważ' cabal configure -fNoPkgConfig' jest bardziej czytelny niż 'cabal configure -f-UsePkgConfig'. To podejście działa dobrze na Linuksie (z zainstalowanym i bez 'pkg-config' zainstalowanym).Opowiem o tym, co później otrzyma użytkownik systemu Windows. – sastanin

+0

Aktualizacja: to podejście działa również w systemie Windows. – sastanin

5

pkg-config nie jest częścią platformy Haskell, ani nie można sobie wyobrazić, że kiedykolwiek będzie.

Zazwyczaj używam includes/Extra-libraries, jeśli są względnie proste. Ale w przypadku złożonych pakietów, które mogą mieć wiele dołączonych bibliotek, takich jak gtk, jest o wiele przyjemniej używać pkg-config, gdy jest to możliwe.

Możliwe jest zapisanie pliku .cabal, który będzie działał zi bez określonych pól. Spróbuj tego:

if os(windows) 
    Includes: 
     foo.h 
    Extra-libraries: 
     foo 
else 
    PkgConfig-Depends: 
     libfoo >= 1.2 

Należy również pamiętać, że .cabal może uruchomić skrypt konfiguracyjny, który może pomóc w niektórych sytuacjach, ale nie jest bardzo przyjazny dla okna.

+0

Dziękuję. Myślałem o zrobieniu czegoś takiego, ale prawdopodobnie rozwiązanie zaproponowane przez @Heatsink jest bardziej elastyczne. Spróbuję tego pierwszy. – sastanin

+2

@jetxee - to prawda, że ​​flagi mogą być bardziej elastyczne, ale mogą też powodować problemy. Wygląda na to, że Cabal chce przekompilować już zainstalowane pakiety, gdy nowy pakiet jest budowany z innym zestawem flag, co może spowodować, że db pakietu stanie się niespójny. Mogę być stronniczy, ponieważ właśnie musiałem naprawić mój pakiet db. –

Powiązane problemy