2011-02-10 64 views
13

我在Hackage上維護一個帶有FFI綁定的庫。所以我的Haskell庫依賴於相應的C庫及其頭文件。現在我指定的對外依存度在.cabal文件是這樣的:如何在.cabal中指定對外部C庫的依賴關係?

PkgConfig-Depends: 
     libfoo >= 1.2 

而且它很適合我的Linux操作系統。不過,我有誰報告庫的用戶,在Windows上安裝pkg-config是相當麻煩的,相反,他更喜歡

Includes: 
     foo.h 
Extra-libraries: 
     foo 

我想我的圖書館是爲易建越好,不要」不想強制構建不嚴格要求的依賴關係。但是,我看到Cabal manual建議使用PkgConfig-Depends

我的問題:

  • 哪種方式,我應該更喜歡跨平臺的包?
  • 是否有可能以這種方式編寫.cabal文件,它可以與pkg-config一起使用而不使用?
  • 順便說一句,是包含在Haskell平臺中的pkg-config(我沒有Windows機器可以檢查)?
+3

pkg-config未包含在Windows平臺(2010.2.0.0)中。 – 2011-02-10 18:39:04

+0

謝謝@Stephen。 – sastanin 2011-02-10 19:18:35

回答

12

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

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的友好。

+0

謝謝。我考慮過這樣做,但可能由@Heatsink提出的解決方案更加靈活。我會先嚐試一個。 – sastanin 2011-02-10 19:18:19