如何在.cabal中指定对外部C库的依赖?

我使用Hackage上的FFI绑定来维护一个库。 所以我的Haskell库依赖于相应的C库及其头文件。 现在我在.cabal文件中指定外部依赖关系,如下所示:

 PkgConfig-Depends: libfoo >= 1.2 

在Linux中它对我来说很好。 不过,我有一个图书馆的用户报告说,在Windows上安装pkg-config相当麻烦,而不是他更喜欢

 Includes: foo.h Extra-libraries: foo 

我希望我的库尽可能容易构build,并且不想强制不严格要求的构build依赖关系。 但是,我看到Cabal手册build议使用PkgConfig-Depends

我的问题:

  • 我应该select哪一种跨平台软件包?
  • 是否有可能写一个.cabal文件的方式,它可以使用pkg-config和没有?
  • 顺便说一下,Haskell平台中包含pkg-config (我没有Windows机器来检查)?

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 

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。