----------------------------------------------------------------------------- -- | -- Module : PreProcessor -- Copyright : Malcolm Wallace -- -- Maintainer : Malcolm Wallace -- Stability : Stable -- Portability : All -- -- This module describes various preprocessors for the Haskell language. -- If you write a new preprocessor, please add details here. ----------------------------------------------------------------------------- module PreProcessor where import Argv import Compiler import Config import Unlit (unlit,plain) data PreProcessor = PreProcessor { ppExecutableName :: String , ppDefaultOptions :: DecodedArgs -> [String] , ppOutputFileOption :: String -> String , ppSuitable :: HC -> Bool } -- | * input file suffix -- -- * unliterate the file? -- -- * PP info type PPSuffixHandler = (String , (String->String->String) , PreProcessor) knownSuffixes :: [ PPSuffixHandler ] knownSuffixes = [ ("gc", plain, ppGreenCard) , ("chs", plain, ppC2hs) , ("hsc", plain, ppHsc2hs) , ("y", plain, ppHappy) , ("ly", unlit, ppHappy) , ("x", plain, ppAlex) , ("lx", unlit, ppAlex) , ("hs.cpp", plain, ppCpp) , ("ghs", plain, ppGH) , ("gc", plain, ppNone) -- note, for nhc98 only , ("hsc", plain, ppNone) -- note, for nhc98 only , ("hs", plain, ppNone) , ("lhs", unlit, ppNone) ] ppCpp, ppGreenCard, ppHsc2hs, ppC2hs, ppHappy, ppNone :: PreProcessor ppCpp = PreProcessor { ppExecutableName = "gcc -E -traditional" , ppDefaultOptions = \d-> "-x c" : map ("-D"++) (defs d++zdefs d) ++ map ("-I"++) (pathSrc d) , ppOutputFileOption = \f-> "> "++f , ppSuitable = \hc-> True } ppGreenCard = PreProcessor { ppExecutableName = "green-card" , ppDefaultOptions = \d-> ["-tffi"] -- + includePath of compiler? , ppOutputFileOption = \f-> "-o "++f , ppSuitable = \hc-> hc == Ghc } ppHsc2hs = PreProcessor { ppExecutableName = "hsc2hs" , ppDefaultOptions = \d-> map ("-I"++) (pathSrc d) , ppOutputFileOption = \_-> "" , ppSuitable = \hc-> hc == Ghc } ppC2hs = PreProcessor { ppExecutableName = "c2hs" , ppDefaultOptions = \_-> [] , ppOutputFileOption = \_-> "" , ppSuitable = \hc-> hc `elem` [Ghc,Nhc98] } ppHappy = PreProcessor { ppExecutableName = "happy" , ppDefaultOptions = \_-> [] , ppOutputFileOption = \_-> "" , ppSuitable = \hc-> True } ppAlex = PreProcessor { ppExecutableName = "alex" , ppDefaultOptions = \_-> [] , ppOutputFileOption = \f-> "-o "++f , ppSuitable = \hc-> True } ppGH = PreProcessor -- see www.Generic-Haskell.org { ppExecutableName = "gh" , ppDefaultOptions = \_-> [] , ppOutputFileOption = \_-> "" , ppSuitable = \hc-> hc == Ghc } ppNone = PreProcessor { ppExecutableName = "" , ppDefaultOptions = \_-> [] , ppOutputFileOption = \_-> "" , ppSuitable = \hc-> True }