-- Known Haskell compilers and their locations are all stored in an -- hmakerc file which is maintained with the hmake-config utility. -- This module no longer deals with that side of things. -- Here, we just need to read read a single environment variable, -- and determine some properties of the different compilers that relate -- specifically to the interpreter. module HiConfig where import Compiler import Config import Platform (getProcessID,unsafePerformIO,withDefault,windows,escape) import System -- Generate a temporary filename unique to this process. tmpfile :: String tmpfile = let tmp = "TEMP" `withDefault` "/tmp" in if windows then (escape tmp++"/Main") else unsafePerformIO $ do p <- getProcessID return (tmp++"/Main"++show p) -- Ensure that a string has a fixed length by truncating or padding with space fixlength n s | len > n = take n s | otherwise = s ++ replicate (n-len) ' ' where len = length s -- Definitions imported from the environment hmakeVersion = fixlength 18 ("INSTALLVER" `withDefault` "1.8 or better") hmake = unsafePerformIO $ do script <- getEnv "SCRIPTDIR" return (script++"/hmake") -- What are the differences between compilers? nonstdCoerceImport c = case c of Nhc98 -> "import NonStdUnsafeCoerce" Hbc -> "" Ghc -> "#if __GLASGOW_HASKELL__ <= 502\n\ \import PrelGHC (unsafeCoerce#)\n#else\n\ \import GHC.Base(unsafeCoerce#)\n#endif" _ -> "" nonstdCoerce c = case c of Nhc98 -> "\ncoerce=unsafeCoerce\n" Hbc -> "\ncoerce = id\t-- wrong\n" Ghc -> "\ncoerce :: a -> b\ncoerce = unsafeCoerce#\n" _ -> "" nonstdShow c = case c of Nhc98 -> "" Hbc -> "instance Show (IO a) where\n\ \ showsPrec p x = showString \"<>\"" Ghc -> "instance Show (IO a) where\n\ \ showsPrec p x = showString \"<>\"" _ -> "" nonstdShowsType c = case c of Nhc98 -> "showsType" Hbc -> "Operation'showsType'Unknown" Ghc -> "Operation'showsType'Unknown" _ -> "" extraHiOptions c = case compilerStyle c of Nhc98 -> extraCompilerFlags c Hbc -> extraCompilerFlags c Ghc -> "-fglasgow-exts": "-package lang": extraCompilerFlags c _ -> []