16

我在 Hackage 上维护了一个带有 FFI 绑定的库。所以我的 Haskell 库依赖于对应的 C 库及其头文件。现在我在.cabal文件中指定外部依赖项,如下所示:

PkgConfig-Depends:
      libfoo >= 1.2

它在 Linux 中对我很有效。但是,我有一个库的用户报告说,pkg-config在 Windows 上安装相当麻烦,相反他更喜欢

Includes:
      foo.h
Extra-libraries:
      foo

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

我的问题:

  • 对于跨平台软件包,我应该更喜欢哪种方式?
  • 是否有可能以.cabal这样的方式编写文件,它可以使用pkg-config和不使用?
  • 而且,顺便说一句,pkg-config包含在 Haskell 平台中(我现在没有要检查的 Windows 机器)?
4

2 回答 2

15

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
于 2011-02-10T18:49:07.847 回答
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 不是很友好。

于 2011-02-10T18:46:06.260 回答