![](/img/trans.png)
[英]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.