簡體   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