![](/img/trans.png)
[英]How do you build an executable from haskell packages (which use stack / cabal) in nix?
[英]How to build and use a bootstrap executable in a Cabal package
我想Cabalize一個Haskell項目,以便將其上傳到Hackage。 它由一個構建引導程序可執行文件的標准.hs文件和八個非標准.lhs文件組成,這些文件由引導程序可執行文件處理,以生成構建生產可執行文件的.hs文件。
換句話說,我的項目是一個自定義文字預處理器(帶有HTML標記,代碼修飾,這里是文檔),它自己編寫。 它取決於bootstrap版本,它可以翻譯生產版本的文字代碼,但不適合一般使用。 所以我不希望bootstrap版本是一個單獨的包; 它只能在這里使用一次。
我一直在使用Makefile,這在Cabal中是可能的,但不是在Cabal的精神中。 什么是干凈的方式,這最大限度地利用了Cabal的普遍性? 我沒有在在線文檔中看到任何建議,沒有重寫Distribution.Simple或使用Makefile。
我認為將引導程序可執行文件作為單獨的程序包發布是最簡單的解決方案,並且有關於如何將自定義預處理程序與Cabal集成的說明 。
如果您不想這樣做,請嘗試將預處理器作為Setup.hs
一部分(不要忘記將構建類型設置為Custom
!)。 您可以在配置步驟中運行預處理器。 看看wxcore
如何做到這一點。
這是一個工作示例(在wxcore
之后wxcore
):
Setup.hs
:
import Distribution.Simple
import Distribution.Simple.LocalBuildInfo
import Distribution.Simple.Setup
import Distribution.PackageDescription
import Control.Monad (forM_)
import System.Directory (copyFile)
import System.FilePath (replaceExtension)
main :: IO ()
main = defaultMainWithHooks simpleUserHooks { confHook = myConfHook }
-- Replace 'copyFile' with more complicated logic.
runMyPreprocessor :: FilePath -> IO ()
runMyPreprocessor abcFile = copyFile abcFile (replaceExtension abcFile ".hs")
myConfHook :: (GenericPackageDescription, HookedBuildInfo) -> ConfigFlags
-> IO LocalBuildInfo
myConfHook (pkgDesc, hbi) flags = do
let extraSrc = extraSrcFiles . packageDescription $ pkgDesc
forM_ extraSrc runMyPreprocessor
confHook simpleUserHooks (pkgDesc, hbi) flags
my-preprocessor.cabal
:
name: my-preprocessor
version: 0.1.0.0
build-type: Custom
cabal-version: >=1.8
extra-source-files: Main.abc
executable my-preprocessor
main-is: Main.hs
build-depends: base < 5
Main.abc
:
module Main
where
main :: IO ()
main = putStrLn "Hello"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.