#!/usr/bin/env runhaskell import Control.Monad (when) import Distribution.PreProcess import Distribution.Simple import Distribution.Simple.LocalBuildInfo import Distribution.Simple.Utils (rawSystemVerbose, dieWithLocation) import System.Cmd (system) import System.Directory (getModificationTime, doesFileExist) main = defaultMainWithHooks hooks hooks = defaultUserHooks { hookedPreProcessors = [trhsx, c2hs] } trhsx :: PPSuffixHandler trhsx = ("fhs", f) where f buildInfo localBuildInfo inFile outFile verbose = do when (verbose > 3) $ putStrLn ("checking that preprocessor is up-to-date") let [pIn, pOut] = ["Preprocessor/Hsx/Parser."++s | s <- ["ly","hs"]] exists <- doesFileExist pOut runHappy <- if not exists then return True else do [tIn, tOut] <- mapM getModificationTime [pIn, pOut] return (tIn > tOut) when runHappy $ system ("happy "++pIn) >> return () system ("ghc --make Preprocessor/Main.hs -o preprocessor") when (verbose > 0) $ putStrLn ("preprocessing "++inFile++" to "++outFile) writeFile outFile ("-- GENERATED file. Edit the ORIGINAL "++inFile++ " instead.\n") system ("./preprocessor "++inFile++" >> "++outFile) c2hs :: PPSuffixHandler c2hs = ("chs", f) where f buildInfo localBuildInfo inFile outFile verbose = do when (verbose > 0) $ putStrLn $ "preprocess "++inFile++" to "++outFile maybe (dieWithLocation inFile Nothing "no c2hs available") (\c2hs -> rawSystemVerbose verbose c2hs ["--cppopts", "-D\"__attribute__(A)= \"", "-o", outFile, inFile]) (withC2hs localBuildInfo)