在NixOS上构建时,Cabal无法找到外国图书馆

时间:2015-12-24 19:27:18

标签: haskell cabal nixos nix

我正在尝试使用cabal2nix在NixOS上构建一个内部Haskell项目。它包装(因此依赖于)一个外部库,在Ubuntu上,它将通过wget来源构建,然后运行make && make install && ldconfig。因此,当cabal构建程序时,它显然能够找到合适的头文件(位于/usr/local/include/ta-lib/usr/include/ta-lib)。

在Nix上,我理解的过程是设置一个.nix文件来指定如何获取和构建源,然后Nix设置隔离的构建环境。当我这样做时,外部库被正确地获取和构建。

当Nix运行配置步骤时,它看起来没问题:

configureFlags: --verbose --prefix=/nix/store/fwpw03bd0c2m5yb7v2wc7g6f0qj912ra-talib-0.1.0.0 --libdir=$prefix/lib/$compiler --libsubdir=$pkgid --with-gcc=gcc --package-db=/tmp/nix-build-talib-0.1.0.0.drv-0/package.conf.d --ghc-option=-optl=-Wl,-rpath=/nix/store/fwpw03bd0c2m5yb7v2wc7g6f0qj912ra-talib-0.1.0.0/lib/ghc-7.10.2/talib-0.1.0.0 --enable-split-objs --disable-library-profiling --disable-executable-profiling --enable-shared --enable-library-vanilla --enable-executable-dynamic --enable-tests --extra-include-dirs=/nix/store/gvglncjgd5yif9bc03qalmp2mrjp524n-ta-lib-0.4.0/include --extra-lib-dirs=/nix/store/gvglncjgd5yif9bc03qalmp2mrjp524n-ta-lib-0.4.0/lib

--extra-include-dirs--extra-lib-dirs设置为Nix商店中的正确路径。然而,当它构建时,它抱怨,

Setup: Missing dependency on a foreign library:
* Missing C library: ta_lib

不幸的是,我不明白cabal是如何确定外国图书馆是否存在的。我在这里阅读(Haskell how to resolve cabal error: Missing dependencies on foreign libraries?),cabal将尝试构建并链接一个C程序,该程序由它找到的每个头组成。所以,不知何故,它找不到正确的库。

有什么问题?这是否与Ubuntu中运行ldconfig的步骤有关?

1 个答案:

答案 0 :(得分:4)

问题是ta_lib取决于系统数学库m,但默认情况下该库未链接。您可以通过创建存根C程序来检查它

echo "int main() { return 0; }" >test.c

并尝试将其与ta_lib

相关联
$ nix-shell -p ta_lib --run "gcc test.c -lta_lib"
/nix/store/ghinzmxfm2s41nz8y873jlywwmcbw38l-ta-lib-0.4.0/lib/libta_lib.so: undefined reference to `sinh'
/nix/store/ghinzmxfm2s41nz8y873jlywwmcbw38l-ta-lib-0.4.0/lib/libta_lib.so: undefined reference to `sincos'
[...]
collect2: error: ld returned 1 exit status

现在,当Cabal尝试确定该库是否可用时,它将尝试将其链接到存根测试程序,但由于所有这些未定义的符号,该尝试将失败。因此,Cabal抱怨图书馆无法链接(即使其路径配置和设置正确)。

要解决该问题,请将m库添加到项目的Cabal文件中的extra-libraries属性中,如下所示:

extra-libraries: ta_lib, m

这应该使Cabal配置阶段成功。