12

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

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

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

4

1 回答 1

7

我认为将引导程序可执行文件作为单独的包发布是最简单的解决方案,并且有关于如何将自定义预处理器与 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"
于 2012-09-24T23:02:06.057 回答