Ответ 1
Я думаю, что освобождение исполняемого файла bootstrap как отдельного пакета является самым простым решением, и есть инструкции по интеграции вашего пользовательского препроцессора с 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"