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