我想Cabalize一个Haskell项目,以便将其上传到Hackage.它由一个构建引导程序可执行文件的标准.hs文件和八个非标准.lhs文件组成,这些文件由引导程序可执行文件处理,以生成构建生产可执行文件的.hs文件.
换句话说,我的项目是一个自定义文字预处理器(带有HTML标记,代码修饰,这里是文档),它自己编写.它取决于bootstrap版本,它可以翻译生产版本的文字代码,但不适合一般使用.所以我不希望bootstrap版本是一个单独的包; 它只能在这里使用一次.
我一直在使用Makefile,这在Cabal中是可能的,但不是在Cabal的精神中.什么是干净的方式,这最大限度地利用了Cabal的普遍性?我没有在在线文档中看到任何建议,没有重写Distribution.Simple或使用Makefile.
我认为将引导程序可执行文件作为单独的程序包发布是最简单的解决方案,并且有关于如何将自定义预处理程序与Cabal集成的说明.
如果您不想这样做,请尝试将预处理器作为一部分Setup.hs(不要忘记将构建类型设置为Custom!).您可以在配置步骤中运行预处理器.看看这是怎么回事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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
Main.abc:
module Main
where
main :: IO ()
main = putStrLn "Hello"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
453 次 |
| 最近记录: |