[英]How to run a haskell executable (cabal project) without having cabal or ghc installed
[英]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-files
与project.cabal project.buildinfo。
一个更复杂的解决方案可能会受到这个答案的启发: https : //stackoverflow.com/a/2940799/1663197
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.