我使用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
。
我的问题:
.cabal
文件的方式,它可以使用pkg-config
和没有? 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。