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

sas*_*nin 14 windows haskell packaging pkg-config cabal

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

PkgConfig-Depends:
      libfoo >= 1.2
Run Code Online (Sandbox Code Playgroud)

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

Includes:
      foo.h
Extra-libraries:
      foo
Run Code Online (Sandbox Code Playgroud)

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

我的问题:

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

Hea*_*ink 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
Run Code Online (Sandbox Code Playgroud)


Joh*_*n L 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
Run Code Online (Sandbox Code Playgroud)

另请注意,.cabal可以运行配置脚本,这在某些情况下可能会有所帮助,但对Windows不友好.

  • @jetxee - 旗帜可以更灵活,但它们也可能导致问题.当使用不同的标志集构建新包时,Cabal似乎想要重新编译已安装的软件包,这会使您的软件包db处于不一致状态.我可能有偏见,因为我只需要修复我的包db. (2认同)