我已经遍历了Distribution.Simple*包,以了解PreProcessor数据类型可以用于定义自定义的预处理器。但提供的例子并不那么有用。我不知道怎么调用预处理器。
目前,我只是在Setup.hs文件中定义了自己的预处理程序。
这个特性有什么完整的例子吗?
编辑的
查看我刚找到的这邮件列表存档。但解决方案涉及从一种类型的文件(由该文件的扩展名标识)转换为另一种类型的文件。
我想要做的是将代码注入到现有的.hs文件中,其中定义了自定义标记。
-- <inject point="foo">
-- extra Haskell code goes here
-- </inject>发布于 2011-09-10 09:07:11
要做的最重要的事情之一是将您在BuildType文件中的.Cabal设置为自定义。如果它停留在简单的地方,那么Cabal将完全忽略Setup.hs文件。
Build-Type: Custom下面是我的包中的自定义预处理器示例,它首先运行cpphs,然后运行hsc2hs
#!/usr/bin/env runhaskell
> {-# LANGUAGE BangPatterns #-}
> import Distribution.Simple
> import Distribution.Simple.PreProcess
> import Distribution.Simple.Utils
> import Distribution.PackageDescription
> import Distribution.Simple.LocalBuildInfo
> import Data.Char
> import System.Exit
> import System.IO
> import System.Directory
> import System.FilePath.Windows
> main = let hooks = simpleUserHooks
> xpp = ("xpphs", ppXpp)
> in defaultMainWithHooks hooks { hookedPreProcessors = xpp:knownSuffixHandlers }
>
> ppXpp :: BuildInfo -> LocalBuildInfo -> PreProcessor
> ppXpp build local =
> PreProcessor {
> platformIndependent = True,
> runPreProcessor = mkSimplePreProcessor $ \inFile outFile verbosity ->
> do info verbosity (inFile++" is being preprocessed to "++outFile)
> let hscFile = replaceExtension inFile "hsc"
> runSimplePreProcessor (ppCpp build local) inFile hscFile verbosity
> handle <- openFile hscFile ReadMode
> source <- sGetContents handle
> hClose handle
> let newsource = unlines $ process $ lines source
> writeFile hscFile newsource
> runSimplePreProcessor (ppHsc2hs build local) hscFile outFile verbosity
> removeFile hscFile
> return ()
> }当找到扩展名为.xpphs的任何文件时,此预处理器将由Cabal自动调用。
在您的示例中,只需使用.hs扩展注册预处理器即可。(我不确定Cabal是否允许这样做。但是,如果没有,您可以简单地用注入点重命名文件为.xh或什么的。这实际上会更好,因为那时您不处理项目中的每个文件)
https://stackoverflow.com/questions/7370029
复制相似问题