我在Hackage上维护一个带有FFI绑定的库。所以我的Haskell库依赖于相应的C库及其头文件。现在我在.cabal
文件中指定外部依赖项,如下所示:
PkgConfig-Depends:
libfoo >= 1.2
在Linux中它适用于我。但是,我有一个库的用户报告,在Windows上安装pkg-config
相当麻烦,而他更喜欢
Includes:
foo.h
Extra-libraries:
foo
我希望我的库尽可能容易构建,并且不想强制不严格要求的构建依赖项。但是,我发现Cabal manual建议使用PkgConfig-Depends
。
我的问题:
.cabal
文件,它可以与pkg-config
一起使用而不使用?pkg-config
(我现在没有Windows机器可以检查)?答案 0 :(得分:14)
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
答案 1 :(得分: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不友好。