2011-02-10 10 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を使用することを示しています。

私の質問:私は、クロスプラットフォームのパッケージのために選ぶべき道

  • pkg-configと一緒に使うことができるように、.cabalファイルを書き込むことはできますか?
  • ところで、Haskellプラットフォームにはpkg-configが含まれています(私は現在Windowsマシンをチェックしていません)。
+3

pkg-configはWindowsプラットフォーム(2010.2.0.0)には含まれていません。 –

+0

ありがとう、@ステフェン。 – sastanin

答えて

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 
+0

ありがとうございます。私はフラグを付けてこのアプローチを選んだのですが、 'cabal configure -fNoPkgConfig'は' cabal configure -f-UsePkgConfig'より読みやすいので、 'NoPkgConfig'フラグを代わりに使用しました。このアプローチは、Linux( 'pkg-config'がインストールされていてもいなくても)上でうまくいきます。私はWindowsのユーザーのフィードバックが後であることを報告します。 – sastanin

+0

更新:このアプローチはWindowsでもうまくいきます。 – sastanin

5

pkg-configは、Haskell Platformには含まれていません。

比較的シンプルであれば、通常はincludes/Extra-librariesを使用します。しかし、gtkのようなインクルードされたライブラリがたくさんある複雑なパッケージの場合、利用可能な場合はpkg-configを使う方がはるかにいいです。

特定のフィールドの有無にかかわらず動作する.cabalファイルを作成することは可能です。これを試してみてください:

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

.cabalは、いくつかの状況で助けることができるconfigureスクリプトを実行できることに注意してください非常に窓がフレンドリーではありません。

+0

ありがとうございます。私はこのようなことをすると考えましたが、おそらく@Heatsinkによって提案された解決策はより柔軟です。私はまずそれを試してみる。 – sastanin

+2

@jetxee - フラグの柔軟性は高いですが、問題が発生する可能性もあります。 Cabalは、新しいパッケージが異なるフラグセットで構築されているときに、すでにインストールされているパッケージを再コンパイルして、パッケージdbを不整合な状態にする可能性があるようです。私はちょうど私のパッケージのDBを修正しなければならなかったので、私は偏っているかもしれません。 –

関連する問題