繁体   English   中英

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

[英]How to link to Haskell static runtime with cabal and stack without hard coding ghc version?

我有一个导出共享静态库的项目,我在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调用的,而不是我。

该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

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

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


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

import Distribution.Simple
main = defaultMainWithHooks autoconfUserHooks

在处理GHC运行时版本的情况下,您可以在项目 .buildinfo.in文件中拥有与其对应的变量@GHC_VERSION@

ghc-options: -lHSrts-ghc@GHC_VERSION@

最后你编写了一个configure bash脚本,它获得了mgsloan建议的GHC版本,并通过在项目 .buildinfo.in文件中替换@GHC_VERSION@ varibale来生成项目 .buildinfo文件:

GHC_VERSION=$(stack exec -- ghc-pkg field ghc version --simple-output)
sed 's,@GHC_VERSION@,'"$GHC_VERSION"',' project.buildinfo.in > project.buildinfo

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


使用configure和project.buildinfo.in填充extra-source-files也是值得的。 extra-tmp-filesproject.cabal project.buildinfo。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM