【问题标题】:How to build and use a bootstrap executable in a Cabal package如何在 Cabal 包中构建和使用引导程序可执行文件
【发布时间】:2012-09-24 19:04:23
【问题描述】:

我想对 Haskell 项目进行 Cabalize 以便将其上传到 Hackage。它由一个构建引导程序可执行文件的标准 .hs 文件和八个非标准 .lhs 文件组成,这些文件由引导程序可执行文件处理以生成构建生产可执行文件的 .hs 文件。

换句话说,我的项目是一个自定义的文字预处理器(带有 HTML 标记、代码修饰、此处的文档),它是自己编写的。它依赖于一个引导版本,它可以翻译生产版本的文字代码,但不适合一般使用。所以我希望引导版本是一个单独的包;它只能在此处使用一次。

我一直在使用 Makefile,这在 Cabal 中是可能的,但在 Cabal 的精神中却不是。什么是一种干净的方法来做到这一点,最大限度地利用阴谋集团的普遍性?我没有在在线文档中看到任何建议,除了重写 Distribution.Simple 或使用 Makefile。

【问题讨论】:

    标签: haskell cabal


    【解决方案1】:

    我认为将引导程序可执行文件作为单独的包发布是最简单的解决方案,有instructions available on how to integrate your custom preprocessor with 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
    

    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"
    

    【讨论】:

    • 不错!我现在正在试验这个。我的引导预处理器代码很短;一种选择是我将其简单地包含在 Setup.hs 中!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-15
    • 2017-11-17
    • 1970-01-01
    相关资源
    最近更新 更多