我走过了阴谋集团Distribution.Simple*
包知道PreProcessor
数据类型可用于定义自定义预处理器。但提供的例子并不是那么有用。我不知道如何调用预处理器。
目前,我只是在中定义我自己的预处理器Setup.hs
file.
有这个功能的完整示例吗?
[EDITED]
Check this我刚刚找到的邮件列表存档。但解决方案涉及从一种类型的文件(由该文件的扩展名标识)转换为另一种类型。
我想做的是将代码注入现有的.hs
定义了自定义标记的文件,例如
-- <inject point="foo">
-- extra Haskell code goes here
-- </inject>
最重要的事情之一是将 .Cabal 文件中的 BuildType 设置为 Custom。如果它停留在 Simple 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 或其他名称。这实际上会更好,因为您不处理every然后将文件添加到您的项目中)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)