如何在没有硬编码ghc版本的情况下使用cabal和堆栈链接到Haskell静态运行时?

时间:2016-03-23 00:29:40

标签: haskell cabal haskell-stack

我有一个导出共享静态库的项目,我在project.cabal文件中使用了以下部分

executable libsxp.so
    main-is:       Somefile.hs
    default-language: Haskell2010
    ghc-options: -shared -dynamic -fPIC -lHSrts-ghc7.10.2

GHC的版本是使用Stack控制的,所以有没有办法让我可以获取并附加版本来制作-lHSrts-ghc{version}或者是否有一些配置?我试过设置

stack build --ghc-options='-O0 -lHSrts-ghc7.10.2' 

但它似乎没有选择它。

另外澄清一下,cabal install由Stack调用,而不是由我调用。

2 个答案:

答案 0 :(得分:3)

该cabal文件有效吗?如果是这样,那么做这样的事情就足够了:

executable libsxp.so
    ghc-options: -shared -dynamic -fPIC
    if impl (ghc >= 7.10.2 && < 7.10.3)
        ghc-options: -lHSrts-ghc7.10.2
    else if impl (ghc >= 7.10.3 && < 7.10.4)
        ghc-options: -lHSrts-ghc7.10.3
    else if ...
顺便说一下,为什么你的可执行文件以.so结尾?我从未在可执行条款中看到过这一点。

您确定使用的是7.10.2而不是7.10.3吗?试试stack exec -- ghc --version

答案 1 :(得分:1)

这个答案描述了一般原则:https://stackoverflow.com/a/6034881/1663197

  

使用Cabal中的配置样式,您可以编写一些配置   用于替换sdl-config输出的变量的脚本   命令。然后将在$ foo.buildinfo.in文件中替换这些值,   产生$ foo.buildinfo文件,Cabal将包含在构建中   过程

首先,您需要在project.cabal中将您的cabal build-type切换为Configure。配置样式在cabal users guide中描述。对于构建类型Configure,Setup.hs的内容必须是:

import Distribution.Simple
main = defaultMainWithHooks autoconfUserHooks

如果处理GHC运行时版本,您可以在 项目 .buildinfo.in 文件中包含与其对应的变量@GHC_VERSION@

ghc-options: -lHSrts-ghc@GHC_VERSION@

最后,您编写了一个 configure bash脚本,该脚本将GHC版本作为mgsloan建议生成,并通过替换{{1}生成 项目 .buildinfo 文件} 项目 .buildinfo.in 文件中的varibale:

@GHC_VERSION@

这种方式在构建开始时,它将首先执行 configure 脚本,然后读取 project.buildinfo 文件并与 project.cabal 合并。

使用configure和填充GHC_VERSION=$(stack exec -- ghc-pkg field ghc version --simple-output) sed 's,@GHC_VERSION@,'"$GHC_VERSION"',' project.buildinfo.in > project.buildinfo 也许值得 project.buildinfo.in;使用 project.cabal 中的project.buildinfo extra-source-files

这个答案可能会激发更复杂的解决方案:https://stackoverflow.com/a/2940799/1663197