[implement yaml based format for library descriptions, allow m4 procesing of them.
John Meacham <john@repetae.net>**20120119125333
 Ignore-this: 9b4f1635a42a1addca581e259761bb79
] move ./lib/base/base.cabal ./lib/base/base.yaml
move ./lib/jhc-prim/jhc-prim.cabal ./lib/jhc-prim/jhc-prim.yaml
move ./lib/jhc/jhc.cabal ./lib/jhc/jhc.yaml
hunk ./Makefile.am 50
-	  -package unix -package haskell98 -package utf8-string -package zlib
+	  -package unix -package haskell98 -package utf8-string -package zlib -package HsSyck \
+	  -package filepath
hunk ./Makefile.am 61
-	     src/StringTable/Atom.hsc jhc.spec lib/applicative/applicative.cabal \
+	     src/StringTable/Atom.hsc jhc.spec lib/applicative/applicative.yaml \
hunk ./Makefile.am 220
-jhc-prim-0.7.0.hl: lib/jhc-prim/jhc-prim.cabal
+jhc-prim-0.7.0.hl: lib/jhc-prim/jhc-prim.yaml
hunk ./Makefile.am 222
-jhc-1.0.hl: lib/jhc/jhc.cabal
+jhc-1.0.hl: lib/jhc/jhc.yaml
hunk ./Makefile.am 224
-base-1.0.hl: lib/base/base.cabal jhc-1.0.hl
+base-1.0.hl: lib/base/base.yaml jhc-1.0.hl
hunk ./Makefile.am 279
-show_elibs: lib/ext/*.cabal
+show_elibs: lib/ext/*.cabal  lib/ext/*.yaml
hunk ./Makefile.am 289
-base-1.0.hl: lib/base/base.cabal lib/base/Debug/Trace.hs lib/base/Data/Array.hs \
+base-1.0.hl: lib/base/base.yaml lib/base/Debug/Trace.hs lib/base/Data/Array.hs \
hunk ./Makefile.am 311
-jhc-1.0.hl: lib/jhc/jhc.cabal lib/jhc/Jhc/Prim.hs lib/jhc/Jhc/IO.hs lib/jhc/Jhc/Int.hs \
+jhc-1.0.hl: lib/jhc/jhc.yaml lib/jhc/Jhc/Prim.hs lib/jhc/Jhc/IO.hs lib/jhc/Jhc/Int.hs \
hunk ./lib/base/base.yaml 4
-Exposed-Modules: Control.Exception,
-        Control.Monad,
-        Data.Array,
-        Data.Char,
-        Data.Complex,
-        Data.List,
-        Data.Word,
-        Data.Monoid,
-        Data.Bits,
-        Data.Int,
-        Data.Functor,
-        Data.IORef,
-        Data.Ix,
-        Data.Maybe,
-        Data.Ratio,
-        Data.Unicode,
-        Debug.Trace,
-        Foreign,
-        Foreign.C,
-        Foreign.C.Types,
-        Foreign.C.String,
-        Foreign.C.Error,
-        Foreign.ForeignPtr,
-        Foreign.Marshal
-        Foreign.Marshal.Alloc,
-        Foreign.Marshal.Array,
-        Foreign.Marshal.Error,
-        Foreign.Marshal.Pool,
-        Foreign.Marshal.Utils,
-        Foreign.Ptr,
-        Foreign.StablePtr,
-        Foreign.Storable,
-        Data.Array.IO,
-        Data.Array.Unboxed,
-        Numeric,
-        Prelude,
-        System.Console.GetOpt,
-        System.CPUTime,
-        System.Directory,
-        System.Info,
-        System.IO,
-        System.IO.Error,
-        System.IO.Unsafe,
-        System.IO.Binary,
-        System.IO.Pipe,
-        System.Locale,
-        System.Random,
-        System.Time,
-        System.Environment,
-	System.Exit
-	System.Cmd
-        Control.Monad.Fix,
-        Data.Function,
-        Text.Show.Functions,
-        Data.Typeable,
-	Data.Version,
-        Control.Monad.Instances,
-        Text.Printf
-
+Exposed-Modules: 
+        - Control.Exception
+        - Control.Monad
+        - Data.Array
+        - Data.Char
+        - Data.Complex
+        - Data.List
+        - Data.Word
+        - Data.Monoid
+        - Data.Bits
+        - Data.Int
+        - Data.Functor
+        - Data.IORef
+        - Data.Ix
+        - Data.Maybe
+        - Data.Ratio
+        - Data.Unicode
+        - Debug.Trace
+        - Foreign
+        - Foreign.C
+        - Foreign.C.Types
+        - Foreign.C.String
+        - Foreign.C.Error
+        - Foreign.ForeignPtr
+        - Foreign.Marshal
+        - Foreign.Marshal.Alloc
+        - Foreign.Marshal.Array
+        - Foreign.Marshal.Error
+        - Foreign.Marshal.Pool
+        - Foreign.Marshal.Utils
+        - Foreign.Ptr
+        - Foreign.StablePtr
+        - Foreign.Storable
+        - Data.Array.IO
+        - Data.Array.Unboxed
+        - Numeric
+        - Prelude
+        - System.Console.GetOpt
+        - System.CPUTime
+        - System.Directory
+        - System.Info
+        - System.IO
+        - System.IO.Error
+        - System.IO.Unsafe
+        - System.IO.Binary
+        - System.IO.Pipe
+        - System.Locale
+        - System.Random
+        - System.Time
+        - System.Environment
+        - System.Exit
+        - System.Cmd
+        - Control.Monad.Fix
+        - Data.Function
+        - Text.Show.Functions
+        - Data.Typeable
+        - Data.Version
+        - Control.Monad.Instances
+        - Text.Printf
hunk ./lib/jhc-prim/jhc-prim.yaml 3
-
hunk ./lib/jhc-prim/jhc-prim.yaml 4
-        Jhc.Prim.Bits
-        Jhc.Prim.Words
-        Jhc.Prim.IO
-        Jhc.Prim
-
+        - Jhc.Prim.Bits
+        - Jhc.Prim.Words
+        - Jhc.Prim.IO
+        - Jhc.Prim
hunk ./lib/jhc/jhc.yaml 5
-    Jhc.Int,
-    Jhc.Inst.Enum,
-    Jhc.Inst.PrimEnum,
-    Jhc.Inst.Read,
-    Jhc.Inst.Show,
-    Jhc.Inst.Storable
+        - Jhc.Int
+        - Jhc.Inst.Enum
+        - Jhc.Inst.PrimEnum
+        - Jhc.Inst.Read
+        - Jhc.Inst.Show
+        - Jhc.Inst.Storable
hunk ./lib/jhc/jhc.yaml 13
-	Data.Char,
-	Data.Int,
-	Data.Ratio,
-	Data.Word,
-        Foreign.C.Error,
-	Foreign.C.String,
-	Foreign.C.Types,
-	Foreign.Marshal.Alloc,
-	Foreign.Marshal.Array,
-	Foreign.Marshal.Utils,
-	Foreign.Ptr,
-	Foreign.Storable,
-        Jhc.Addr,
-        Jhc.Array,
-	Jhc.Basics,
-	Jhc.Enum,
-	Jhc.Float,
-        Jhc.Handle,
-        Jhc.Hole,
-        Jhc.IO,
-        Jhc.JumpPoint,
-        Jhc.List,
-	Jhc.Maybe,
-	Jhc.Monad,
-	Jhc.Num,
-	Jhc.Options,
-	Jhc.Order,
-	Jhc.Prim,
-	Jhc.Show,
-	Jhc.String,
-	Jhc.Text.Read,
-        Jhc.Tuples
-	Jhc.Types,
-	Numeric,
-	Prelude,
-	Prelude.CType,
-	Prelude.Float,
-	Prelude.IO,
-	Prelude.Text,
-        System.C.Stdio,
-        System.IO.Unsafe,
-        System.Mem,
-        System.Mem.StableName
+        - Data.Char
+        - Data.Int
+        - Data.Ratio
+        - Data.Word
+        - Foreign.C.Error
+        - Foreign.C.String
+        - Foreign.C.Types
+        - Foreign.Marshal.Alloc
+        - Foreign.Marshal.Array
+        - Foreign.Marshal.Utils
+        - Foreign.Ptr
+        - Foreign.Storable
+        - Jhc.Addr
+        - Jhc.Array
+        - Jhc.Basics
+        - Jhc.Enum
+        - Jhc.Float
+        - Jhc.Handle
+        - Jhc.Hole
+        - Jhc.IO
+        - Jhc.JumpPoint
+        - Jhc.List
+        - Jhc.Maybe
+        - Jhc.Monad
+        - Jhc.Num
+        - Jhc.Options
+        - Jhc.Order
+        - Jhc.Prim
+        - Jhc.Show
+        - Jhc.String
+        - Jhc.Text.Read
+        - Jhc.Tuples
+        - Jhc.Types
+        - Numeric
+        - Prelude
+        - Prelude.CType
+        - Prelude.Float
+        - Prelude.IO
+        - Prelude.Text
+        - System.C.Stdio
+        - System.IO.Unsafe
+        - System.Mem
+        - System.Mem.StableName
hunk ./src/Ho/Build.hs 11
-
hunk ./src/Ho/Build.hs 19
+import Data.Yaml.Syck
hunk ./src/Ho/Build.hs 21
-import System.Mem
hunk ./src/Ho/Build.hs 22
+import System.Mem
hunk ./src/Ho/Build.hs 58
-import RawFiles(prelude_m4)
+import Support.Yaml
hunk ./src/Ho/Build.hs 70
-
---
hunk ./src/Ho/Build.hs 138
-    onErr (return (False,honame)) (readHoFile honame) $ \ (hoh,hidep,ho) -> do
+    onErr (return (False,honame)) (readHoFile honame) $ \ (hoh,hidep,ho) ->
hunk ./src/Ho/Build.hs 148
-onErr err good cont = catch (good >>= \c -> return (cont c)) (\_ -> return err) >>= id
+onErr err good cont = join $ catch (good >>= return . cont) (\_ -> return err)
hunk ./src/Ho/Build.hs 162
-        Just (m,ds) -> do return (Left lbs,m,ds)
+        Just (m,ds) -> return (Left lbs,m,ds)
hunk ./src/Ho/Build.hs 182
-            case foundho of
-                False -> putProgressLn $ printf "%-23s [%s]" (show m) fn'
-                True -> putProgressLn $ printf "%-23s [%s] <%s>" (show m) fn' mho'
+            putProgressLn $ if foundho
+                then printf "%-23s [%s] <%s>" (show m) fn' mho'
+                else printf "%-23s [%s]" (show m) fn'
hunk ./src/Ho/Build.hs 221
-                ("LibraryDesc",toNode $ [ fp | BuildHl fp  <- [optMode options]]),
-                ("LibraryDeps",toNode $ ls),
+                ("LibraryDesc",toNode [ fp | BuildHl fp  <- [optMode options]]),
+                ("LibraryDeps",toNode ls),
hunk ./src/Ho/Build.hs 224
-                ("ModuleDeps",toNode $ sdps)
+                ("ModuleDeps",toNode sdps)
hunk ./src/Ho/Build.hs 245
-    showsPrec _ cu = shows $ providesModules cu
+    showsPrec _ = shows . providesModules
hunk ./src/Ho/Build.hs 259
-sourceIdent sp = show . sourceModName $ sourceInfo sp
+sourceIdent = show . sourceModName . sourceInfo
hunk ./src/Ho/Build.hs 266
-    providesModules hoh = fsts $ hoDepends hoh
+    providesModules = fsts . hoDepends
hunk ./src/Ho/Build.hs 269
-    providesModules hl = Map.keys (hoModuleMap hl)
+    providesModules = Map.keys . hoModuleMap
hunk ./src/Ho/Build.hs 285
-
hunk ./src/Ho/Build.hs 384
-
hunk ./src/Ho/Build.hs 395
-    when (optMode options == StopParse) $
-        exitSuccess
+    when (optMode options == StopParse) exitSuccess
hunk ./src/Ho/Build.hs 400
-    when (optMode options  == StopTypeCheck) $
-        exitSuccess
+    when (optMode options  == StopTypeCheck) exitSuccess
hunk ./src/Ho/Build.hs 406
-
hunk ./src/Ho/Build.hs 453
-
-
hunk ./src/Ho/Build.hs 470
-
hunk ./src/Ho/Build.hs 481
-
hunk ./src/Ho/Build.hs 500
-
hunk ./src/Ho/Build.hs 617
-
-
-
-
hunk ./src/Ho/Build.hs 627
-
-m4Prelude :: IO FilePath
-m4Prelude = (randomIO :: IO Integer) >>= \salt ->
-    let m4p_filename = "/tmp/jhc_prelude-" ++ show salt ++ ".m4"
-    in BS.writeFile m4p_filename prelude_m4 >> return m4p_filename
-
hunk ./src/Ho/Build.hs 645
-preprocess :: Opt -> FilePath -> LBS.ByteString -> IO LBS.ByteString
-preprocess opt fn lbs = do
-    let fopts s = s `member` optFOptsSet opt
-        incFlags = [ "-I" ++ d | d <- optIncdirs options ++ optIncs opt]
-        defFlags = ("-D__JHC__=" ++ revision):("-D__JHC_VERSION__=" ++ version):[ "-D" ++ d | d <- optDefs opt]
-    lbs' <- case () of
-        _ | fopts FO.Cpp -> readSystem "cpp" $ ["-CC","-traditional"] ++ incFlags ++ defFlags ++ [fn]
-          | fopts FO.M4 -> do
-            m4p <- m4Prelude
-            result <- readSystem "m4" $ ["-s", "-P"] ++ incFlags ++ defFlags ++ [m4p,fn]
-            removeFile m4p >> return result
-          | otherwise -> return lbs
-    return lbs'
-
-
hunk ./src/Ho/Build.hs 663
-
hunk ./src/Ho/Build.hs 668
-
hunk ./src/Ho/Build.hs 673
-
-
hunk ./src/Ho/Build.hs 677
-
-
hunk ./src/Ho/Build.hs 739
-        desc <- readDescFile fp
-        when verbose2 $ mapM_ print desc
-        let field x = lookup x desc
-            jfield x = maybe (fail $ "createLibrary: description lacks required field " ++ show x) return $ field x
-            mfield x = maybe [] (words . map (\c -> if c == ',' then ' ' else c)) $ field x
+        LibDesc dlist dsing <- readDescFile fp
+        when verbose2 $ do
+            mapM_ print (Map.toList dlist)
+            mapM_ print (Map.toList dsing)
+        let jfield x = maybe (fail $ "createLibrary: description lacks required field " ++ show x) return $ Map.lookup x dsing
+            mfield x = maybe [] id $ Map.lookup x dlist
+            --mfield x = maybe [] (words . map (\c -> if c == ',' then ' ' else c)) $ Map.lookup x dlist
hunk ./src/Ho/Build.hs 750
-        return (desc,name,vers,hmods,emods)
-
+        return (Map.toList dsing,name,vers,hmods,emods)
hunk ./src/Ho/Build.hs 850
-
hunk ./src/Ho/Library.hs 2
+    LibDesc(..),
hunk ./src/Ho/Library.hs 12
+    preprocess,
hunk ./src/Ho/Library.hs 16
-import Char
hunk ./src/Ho/Library.hs 17
+import Data.Char
hunk ./src/Ho/Library.hs 22
+import Data.Yaml.Syck
hunk ./src/Ho/Library.hs 24
+import System.Random (randomIO)
hunk ./src/Ho/Library.hs 26
+import qualified Data.ByteString as BS
+import qualified Data.ByteString.Lazy as LBS
hunk ./src/Ho/Library.hs 30
+import qualified System.FilePath as FP
hunk ./src/Ho/Library.hs 32
-import Name.Name(Module)
-import Util.Gen hiding(intercalate)
hunk ./src/Ho/Library.hs 34
+import Name.Name(Module)
hunk ./src/Ho/Library.hs 37
+import RawFiles(prelude_m4)
+import Support.Yaml
+import Util.FilterInput
+import Util.Gen hiding(intercalate)
hunk ./src/Ho/Library.hs 42
+import Version.Config(revision,version)
hunk ./src/Ho/Library.hs 44
+import qualified FlagOpts as FO
hunk ./src/Ho/Library.hs 58
-
----------------------------------------
--- parse description file (.cabal file)
----------------------------------------
-
-readDescFile :: FilePath -> IO [(String,String)]
-readDescFile fp = do
-    wdump FD.Progress $ putErrLn $ "Reading: " ++ show fp
-    fc <- readFile fp
-    case parseLibraryDescription fc of
-        Left err -> fail $ "Error reading library description file: " ++ show fp ++ " " ++ err
-        Right ps -> return ps
-
-parseLibraryDescription :: Monad m => String -> m [(String,String)]
-parseLibraryDescription fs =  g [] (lines (f [] fs)) where
-    --f rs ('\n':s:xs) | isSpace s = f rs (dropWhile isSpace xs)
-    f rs ('-':'-':xs) = f rs (dropWhile (/= '\n') xs)
-    f rs ('{':'-':xs) = eatCom rs xs
-    f rs (x:xs) = f (x:rs) xs
-    f rs [] = reverse rs
-    eatCom rs ('\n':xs) = eatCom ('\n':rs) xs
-    eatCom rs ('-':'}':xs) = f rs xs
-    eatCom rs (_:xs) = eatCom rs xs
-    eatCom rs [] = f rs []
-    g rs (s:ss) | all isSpace s = g rs ss
-    g rs (s:s':ss) | all isSpace s' = g rs (s:ss)
-    g rs (s:(h:cl):ss) | isSpace h = g rs ((s ++ h:cl):ss)
-    g rs (r:ss) | (':':bd') <- bd = g ((map toLower $ condenseWhitespace nm,condenseWhitespace bd'):rs) ss
-         | otherwise = fail $ "could not find ':' marker: " ++ show (rs,(r:ss)) where
-            (nm,bd) = break (== ':') r
-    g rs [] = return rs
-
-condenseWhitespace xs =  reverse $ dropWhile isSpace (reverse (dropWhile isSpace (cw xs))) where
-    cw (x:y:zs) | isSpace x && isSpace y = cw (' ':zs)
-    cw (x:xs) = x:cw xs
-    cw [] = []
-
-
hunk ./src/Ho/Library.hs 62
-
-
-
-
hunk ./src/Ho/Library.hs 85
-
-
-
---maxBy c x1 x2 = case x1 `c` x2 of
---    LT -> x2
---    _ -> x1
-
hunk ./src/Ho/Library.hs 106
---
hunk ./src/Ho/Library.hs 114
-
hunk ./src/Ho/Library.hs 116
-        flip mapM fs $ \e -> case reverse e of
-            ('l':'h':'.':r)  -> do
-                flip catch (\_ -> return mempty) $ do
-                    lib <- readHlFile  (fp ++ "/" ++ e)
-                    return (Map.singleton (libBaseName lib) [lib], Map.singleton (libHash lib) lib)
+        forM fs $ \e -> case reverse e of
+            ('l':'h':'.':r)  -> flip catch (\_ -> return mempty) $ do
+                lib <- readHlFile  (fp ++ "/" ++ e)
+                return (Map.singleton (libBaseName lib) [lib], Map.singleton (libHash lib) lib)
hunk ./src/Ho/Library.hs 122
-
hunk ./src/Ho/Library.hs 125
-          (chunk,[])     -> chunk : []
+          (chunk,[])     -> [chunk]
hunk ./src/Ho/Library.hs 128
-
hunk ./src/Ho/Library.hs 147
-            byhashes' = Map.fromList $ [ (show x,y) | (x,y) <- Map.toList byhashes]
+            byhashes' = Map.fromList [ (show x,y) | (x,y) <- Map.toList byhashes]
hunk ./src/Ho/Library.hs 167
-        when verbose $ forM_ (Map.toList finalmap) $ \ (n,(e,l)) -> do
+        when verbose $ forM_ (Map.toList finalmap) $ \ (n,(e,l)) ->
hunk ./src/Ho/Library.hs 177
+parseLibraryDescription :: Monad m => String -> m [(String,String)]
+parseLibraryDescription fs =  g [] (lines (f [] fs)) where
+    --f rs ('\n':s:xs) | isSpace s = f rs (dropWhile isSpace xs)
+    f rs ('-':'-':xs) = f rs (dropWhile (/= '\n') xs)
+    f rs ('{':'-':xs) = eatCom rs xs
+    f rs (x:xs) = f (x:rs) xs
+    f rs [] = reverse rs
+    eatCom rs ('\n':xs) = eatCom ('\n':rs) xs
+    eatCom rs ('-':'}':xs) = f rs xs
+    eatCom rs (_:xs) = eatCom rs xs
+    eatCom rs [] = f rs []
+    g rs (s:ss) | all isSpace s = g rs ss
+    g rs (s:s':ss) | all isSpace s' = g rs (s:ss)
+    g rs (s:(h:cl):ss) | isSpace h = g rs ((s ++ h:cl):ss)
+    g rs (r:ss) | (':':bd') <- bd = g ((map toLower $ condenseWhitespace nm,condenseWhitespace bd'):rs) ss
+         | otherwise = fail $ "could not find ':' marker: " ++ show (rs,r:ss) where
+            (nm,bd) = break (== ':') r
+    g rs [] = return rs
+
+condenseWhitespace xs =  reverse $ dropWhile isSpace (reverse (dropWhile isSpace (cw xs))) where
+    cw (x:y:zs) | isSpace x && isSpace y = cw (' ':zs)
+    cw (x:xs) = x:cw xs
+    cw [] = []
+
+procCabal :: [(String,String)] -> LibDesc
+procCabal xs = f xs mempty mempty where
+    f [] dlm dsm = LibDesc (combineAliases dlm) dsm
+    f ((map toLower -> x,y):rs) dlm dsm | x `Set.member` list_fields = f rs (Map.insert x (spit y) dlm) dsm
+                                        | otherwise = f rs dlm (Map.insert x y dsm)
+    spit = words . map (\c -> if c == ',' then ' ' else c)
+
+
+procYaml :: YamlNode -> LibDesc
+procYaml MkNode { n_elem = EMap ms } = f ms mempty mempty where
+    f [] dlm dsm = LibDesc (combineAliases dlm) dsm
+    f ((n_elem -> EStr (map toLower . unpackBuf -> x),y):rs) dlm dsm = if x `Set.member` list_fields then dlist y else dsing y where
+        dlist (n_elem -> EStr y)  = f rs (Map.insert x [unpackBuf y] dlm) dsm
+        dlist (n_elem -> ESeq ss) = f rs (Map.insert x [ unpackBuf y | (n_elem -> EStr y) <- ss ] dlm) dsm
+        dlist _ = f rs dlm dsm
+        dsing (n_elem -> EStr y) = f rs dlm (Map.insert x (unpackBuf y) dsm)
+        dsing _ = f rs dlm dsm
+procYaml _ = LibDesc mempty mempty
+
+ypath' :: FromNode r => String -> YamlNode -> r
+ypath' s n = case ypath s n of
+    Nothing -> error $ "Ypath lookup failed: " ++ s
+    Just n -> n
+
+list_fields = Set.fromList $ [
+    "exposed-modules",
+    "include-dirs",
+    "extensions",
+    "options",
+    "build-depends"
+    ] ++ map fst alias_fields
+      ++ map snd alias_fields
+
+alias_fields = [
+   ("other-modules","hidden-modules"),
+   ("hs-source-dir","hs-source-dirs")
+   ]
+
+combineAliases mp = f alias_fields mp where
+    f [] mp = mp
+    f ((x,y):rs) mp = case Map.lookup x mp of
+        Nothing -> f rs mp
+        Just ys -> f rs $ Map.delete x $ Map.insertWith (++) y ys mp
+
+
+data LibDesc = LibDesc (Map.Map String [String]) (Map.Map String String)
+
+readDescFile :: FilePath -> IO LibDesc
+readDescFile fp = do
+    wdump FD.Progress $ putErrLn $ "Reading: " ++ show fp
+    let doYaml opt = do
+            lbs <- LBS.readFile fp
+            dt <- preprocess opt fp lbs
+            desc <- catch (parseYamlBytes $ BS.concat (LBS.toChunks dt))
+                (\e -> putErrDie $ "Error parsing desc file '" ++ fp ++ "'\n" ++ show e)
+            when verbose2 $ do
+                yaml <- emitYaml desc
+                putStrLn yaml
+            return $ procYaml desc
+        doCabal = do
+            fc <- readFile fp
+            case parseLibraryDescription fc of
+                Left err -> fail $ "Error reading library description file: " ++ show fp ++ " " ++ err
+                Right ps -> return $ procCabal ps
+    case FP.splitExtension fp of
+        (_,".cabal") -> doCabal
+        (_,".yaml") -> doYaml options
+        (FP.takeExtension -> ".yaml",".m4") -> doYaml options { optFOptsSet = FO.M4 `Set.insert` optFOptsSet options }
+        _ -> putErrDie $ "Do not recoginize description file type: " ++ fp
+
+preprocess :: Opt -> FilePath -> LBS.ByteString -> IO LBS.ByteString
+preprocess opt fn lbs = do
+    let fopts s = s `Set.member` optFOptsSet opt
+        incFlags = [ "-I" ++ d | d <- optIncdirs options ++ optIncs opt]
+        defFlags = ("-D__JHC__=" ++ revision):("-D__JHC_VERSION__=" ++ version):[ "-D" ++ d | d <- optDefs opt]
+    case () of
+        _ | fopts FO.Cpp -> readSystem "cpp" $ ["-CC","-traditional"] ++ incFlags ++ defFlags ++ [fn]
+          | fopts FO.M4 -> do
+            m4p <- m4Prelude
+            result <- readSystem "m4" $ ["-s", "-P"] ++ incFlags ++ defFlags ++ [m4p,fn]
+            removeFile m4p >> return result
+          | otherwise -> return lbs
hunk ./src/Ho/Library.hs 284
+m4Prelude :: IO FilePath
+m4Prelude = (randomIO :: IO Integer) >>= \salt ->
+    let m4p_filename = "/tmp/jhc_prelude-" ++ show salt ++ ".m4"
+    in BS.writeFile m4p_filename prelude_m4 >> return m4p_filename
hunk ./utils/build_extlibs.prl 25
-    print( (join " ", @_), '\n');
+    print( (join " ", @_), "\n");
hunk ./utils/build_extlibs.prl 30
-    next unless $fn =~ /\.cabal$/;
+    next unless $fn =~ /\.(cabal|yaml)$/;
hunk ./utils/build_extlibs.prl 32
-    $patch =~ s/\.cabal$/.patch/;
+    $patch =~ s/\.(cabal|yaml)$/.patch/;
hunk ./utils/build_extlibs.prl 58
-    mysystem "./jhc $options $ENV{JHC_TEST} --build-hl $fn -L- -L. -i$tmpdir/$name-$version$src" and die "$!: jhc";
+    mysystem("./jhc $options " . ($ENV{JHC_TEST} || "") . " --build-hl $fn -L- -L. -i- '-i$tmpdir/$name-$version$src'") and die "$!: jhc";