如何在Haskell Stack中包含依赖项C库

时间:2018-07-11 00:39:00

标签: haskell haskell-stack

我想创建一个Haskell Stack软件包,其中包括另一个Haskell Stack软件包作为extra-dep。有问题的是,我要包含的软件包是使用Haskell的FFI绑定到某些C代码的。

如果我只是stack unpackstack build那个程序包(HasCacBDD),它就可以正常工作,但是当我将其作为extra-dep包括在内时,堆栈会抱怨缺少库。

看原始包的Setup.hs,我发现它基本上创建了一个名为libHasCacBDD.a的静态库,并将其放在.stack-work路径内的正确文件夹中。链接。当我将其包含在自己的项目中时,该库正是给我一个错误的库。

仔细查看我自己项目的.stack-work文件夹,我发现提到的libHasCacBDD.a确实在某个位置隐藏的目录内。因此,幸运的是,该库正在正确构建,但是我的项目找不到它。

Haskell Stack官方文档说明了在这种情况下的处理方法,但是我认为它不够具体,无法给我令人满意的答案。

我需要做的是指定libHasCacBDD.a库作为extra-lib-dirs选项存储的路径。不过,我不会以平台无关的方式进行操作(如果我在计算机中对路径进行硬编码,那么它就可以在其中工作,在这种情况下进行打包的目的是什么)。

我创建了一个issue on Github,其中包含有关详细信息的更多信息。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

我过去使用Makefile处理该问题,该文件可以找到本地目录,并用参数包装我通常的堆栈命令以使用它。

LIB_DIR :=$(shell dirname $(shell find $(shell stack path --local-install-root) -name libHasCacBDD.a))
ARGS = --extra-lib-dirs ${LIB_DIR}

test:
    stack ${ARGS} test --fast -j4

丑陋,但是可行。

ETA: 第一行调用shell三次:

  • stack path找出要安装软件包的位置
  • find找到您需要的特定文件
  • dirname获取目录

剩余的行将该目录作为额外的库目录传递到stack。每次调用make时都这样做,避免将路径放在文件中,当编译器或软件包版本更改时,该路径需要在文件中进行更新。