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

时间:2011-02-10 16:25:59

标签: windows haskell packaging cabal pkg-config

我在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一起使用而不使用?
  • 顺便说一句,Haskell平台中包含pkg-config(我现在没有Windows机器可以检查)?

2 个答案:

答案 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不友好。