我想创建一个Haskell Stack软件包,其中包括另一个Haskell Stack软件包作为extra-dep
。有问题的是,我要包含的软件包是使用Haskell的FFI绑定到某些C代码的。
如果我只是stack unpack
和stack build
那个程序包(HasCacBDD),它就可以正常工作,但是当我将其作为extra-dep
包括在内时,堆栈会抱怨缺少库。
看原始包的Setup.hs
,我发现它基本上创建了一个名为libHasCacBDD.a
的静态库,并将其放在.stack-work
路径内的正确文件夹中。链接。当我将其包含在自己的项目中时,该库正是给我一个错误的库。
仔细查看我自己项目的.stack-work
文件夹,我发现提到的libHasCacBDD.a
确实在某个位置隐藏的目录内。因此,幸运的是,该库正在正确构建,但是我的项目找不到它。
Haskell Stack官方文档说明了在这种情况下的处理方法,但是我认为它不够具体,无法给我令人满意的答案。
我需要做的是指定libHasCacBDD.a
库作为extra-lib-dirs
选项存储的路径。不过,我不会以平台无关的方式进行操作(如果我在计算机中对路径进行硬编码,那么它就可以在其中工作,在这种情况下进行打包的目的是什么)。
我创建了一个issue on Github,其中包含有关详细信息的更多信息。
有什么建议吗?
答案 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
时都这样做,避免将路径放在文件中,当编译器或软件包版本更改时,该路径需要在文件中进行更新。