diff --git a/Distribution/Simple/Compiler.hs b/Distribution/Simple/Compiler.hs index 9db97daa76797a233a34a3af94c473a0cf4b506c..f6cdb25e763bffb46874ed0dee9d8320ede1981e 100644 --- a/Distribution/Simple/Compiler.hs +++ b/Distribution/Simple/Compiler.hs @@ -64,6 +64,8 @@ module Distribution.Simple.Compiler ( -- * Support for language extensions Flag, + languageToFlags, + unsupportedLanguages, extensionsToFlags, unsupportedExtensions ) where @@ -71,13 +73,14 @@ module Distribution.Simple.Compiler ( import Distribution.Compiler import Distribution.Version (Version(..)) import Distribution.Text (display) -import Language.Haskell.Extension (Extension(..)) +import Language.Haskell.Extension (Language(Haskell98), Extension) import Data.List (nub) import Data.Maybe (catMaybes, isNothing) data Compiler = Compiler { compilerId :: CompilerId, + compilerLanguages :: [(Language, String)], compilerExtensions :: [(Extension, String)] } deriving (Show, Read) @@ -157,9 +160,23 @@ flagToOptimisationLevel (Just s) = case reads s of _ -> error $ "Can't parse optimisation level " ++ s -- ------------------------------------------------------------ --- * Extensions +-- * Languages and Extensions -- ------------------------------------------------------------ +unsupportedLanguages :: Compiler -> [Language] -> [Language] +unsupportedLanguages comp langs = + [ lang | lang <- langs + , isNothing (languageToFlag comp lang) ] + +languageToFlags :: Compiler -> Maybe Language -> [Flag] +languageToFlags comp = filter (not . null) + . catMaybes . map (languageToFlag comp) + . maybe [Haskell98] (\x->[x]) + +languageToFlag :: Compiler -> Language -> Maybe Flag +languageToFlag comp ext = lookup ext (compilerLanguages comp) + + -- |For the given compiler, return the extensions it does not support. unsupportedExtensions :: Compiler -> [Extension] -> [Extension] unsupportedExtensions comp exts = diff --git a/Distribution/Simple/GHC.hs b/Distribution/Simple/GHC.hs index b2777cc606e241cb7d53584b6ffb6e4e21589e43..7fc7100583b85e34936c95355504c074ce8f2a6b 100644 --- a/Distribution/Simple/GHC.hs +++ b/Distribution/Simple/GHC.hs @@ -114,7 +114,7 @@ import Distribution.System import Distribution.Verbosity import Distribution.Text ( display, simpleParse ) -import Language.Haskell.Extension (Extension(..)) +import Language.Haskell.Extension (Language(..), Extension(..)) import Control.Monad ( unless, when ) import Data.Char ( isSpace ) @@ -155,11 +155,13 @@ configure verbosity hcPath hcPkgPath conf = do ++ programPath ghcProg ++ " is version " ++ display ghcVersion ++ " " ++ programPath ghcPkgProg ++ " is version " ++ display ghcPkgVersion - languageExtensions <- getLanguageExtensions verbosity ghcProg + languages <- getLanguages verbosity ghcProg + extensions <- getExtensions verbosity ghcProg let comp = Compiler { compilerId = CompilerId GHC ghcVersion, - compilerExtensions = languageExtensions + compilerLanguages = languages, + compilerExtensions = extensions } conf''' = configureToolchain ghcProg conf'' -- configure gcc and ld return (comp, conf''') @@ -280,8 +282,17 @@ configureToolchain ghcProg = then return ["-x"] else return [] -getLanguageExtensions :: Verbosity -> ConfiguredProgram -> IO [(Extension, Flag)] -getLanguageExtensions verbosity ghcProg +getLanguages :: Verbosity -> ConfiguredProgram -> IO [(Language, Flag)] +getLanguages _ ghcProg + -- TODO: should be using --supported-languages rather than hard coding + | ghcVersion >= Version [7] [] = return [(Haskell98, "-XHaskell98") + ,(Haskell2010, "-XHaskell2010")] + | otherwise = return [(Haskell98, "")] + where + Just ghcVersion = programVersion ghcProg + +getExtensions :: Verbosity -> ConfiguredProgram -> IO [(Extension, Flag)] +getExtensions verbosity ghcProg | ghcVersion >= Version [6,7] [] = do exts <- rawSystemStdout verbosity (programPath ghcProg) diff --git a/Distribution/Simple/Hugs.hs b/Distribution/Simple/Hugs.hs index 3e5535cd527ec850790f3b4e4ab1db4e80f9456e..5c2757fc8b7e2e8eb491e9365878db260a905963 100644 --- a/Distribution/Simple/Hugs.hs +++ b/Distribution/Simple/Hugs.hs @@ -94,7 +94,7 @@ import Distribution.Simple.Utils , rawSystemStdInOut , die, info, notice ) import Language.Haskell.Extension - ( Extension(..) ) + ( Language(Haskell98), Extension(..) ) import System.FilePath ( (</>), takeExtension, (<.>), searchPathSeparator, normalise, takeDirectory ) import Distribution.System @@ -134,6 +134,7 @@ configure verbosity hcPath _hcPkgPath conf = do let comp = Compiler { compilerId = CompilerId Hugs version, + compilerLanguages = hugsLanguages, compilerExtensions = hugsLanguageExtensions } return (comp, conf'') @@ -168,6 +169,9 @@ getVersion verbosity hugsPath = do months = [ "January", "February", "March", "April", "May", "June", "July" , "August", "September", "October", "November", "December" ] +hugsLanguages :: [(Language, Flag)] +hugsLanguages = [(Haskell98, "")] --default is 98 mode + -- | The flags for the supported extensions hugsLanguageExtensions :: [(Extension, Flag)] hugsLanguageExtensions = diff --git a/Distribution/Simple/JHC.hs b/Distribution/Simple/JHC.hs index 9b355e8912169852dd1ce3d6de0ab4a37852e802..c7dfd6561cf8e567224fdcf44e2bc6822cc33c51 100644 --- a/Distribution/Simple/JHC.hs +++ b/Distribution/Simple/JHC.hs @@ -62,8 +62,9 @@ import Distribution.Simple.BuildPaths ( autogenModulesDir, exeExtension ) import Distribution.Simple.Compiler ( CompilerFlavor(..), CompilerId(..), Compiler(..) - , PackageDBStack, Flag, extensionsToFlags ) -import Language.Haskell.Extension (Extension(..)) + , PackageDBStack, Flag, languageToFlags, extensionsToFlags ) +import Language.Haskell.Extension + ( Language(Haskell98), Extension(..)) import Distribution.Simple.Program ( ConfiguredProgram(..), jhcProgram, ProgramConfiguration , userMaybeSpecifyPath, requireProgramVersion, lookupProgram @@ -103,10 +104,14 @@ configure verbosity hcPath _hcPkgPath conf = do let Just version = programVersion jhcProg comp = Compiler { compilerId = CompilerId JHC version, + compilerLanguages = jhcLanguages, compilerExtensions = jhcLanguageExtensions } return (comp, conf') +jhcLanguages :: [(Language, Flag)] +jhcLanguages = [(Haskell98, "")] + -- | The flags for the supported extensions jhcLanguageExtensions :: [(Extension, Flag)] jhcLanguageExtensions = diff --git a/Distribution/Simple/LHC.hs b/Distribution/Simple/LHC.hs index a40b386b90b44d53eac92c34be566d266582a677..019164d86e35d42d2d4f3cd456ed53d3cf96de37 100644 --- a/Distribution/Simple/LHC.hs +++ b/Distribution/Simple/LHC.hs @@ -109,7 +109,8 @@ import Distribution.System import Distribution.Verbosity import Distribution.Text ( display, simpleParse ) -import Language.Haskell.Extension (Extension(..)) +import Language.Haskell.Extension + ( Language(Haskell98), Extension(..) ) import Control.Monad ( unless, when ) import Data.List @@ -145,11 +146,13 @@ configure verbosity hcPath hcPkgPath conf = do ++ programPath lhcProg ++ " is version " ++ display lhcVersion ++ " " ++ programPath lhcPkgProg ++ " is version " ++ display lhcPkgVersion - languageExtensions <- getLanguageExtensions verbosity lhcProg + languages <- getLanguages verbosity lhcProg + extensions <- getExtensions verbosity lhcProg let comp = Compiler { compilerId = CompilerId LHC lhcVersion, - compilerExtensions = languageExtensions + compilerLanguages = languages, + compilerExtensions = extensions } conf''' = configureToolchain lhcProg conf'' -- configure gcc and ld return (comp, conf''') @@ -216,8 +219,12 @@ configureToolchain lhcProg = then return ["-x"] else return [] -getLanguageExtensions :: Verbosity -> ConfiguredProgram -> IO [(Extension, Flag)] -getLanguageExtensions verbosity lhcProg = do +getLanguages :: Verbosity -> ConfiguredProgram -> IO [(Language, Flag)] +getLanguages _ _ = return [(Haskell98, "")] +--FIXME: does lhc support -XHaskell98 flag? from what version? + +getExtensions :: Verbosity -> ConfiguredProgram -> IO [(Extension, Flag)] +getExtensions verbosity lhcProg = do exts <- rawSystemStdout verbosity (programPath lhcProg) ["--supported-languages"] -- GHC has the annoying habit of inverting some of the extensions diff --git a/Distribution/Simple/NHC.hs b/Distribution/Simple/NHC.hs index 3fc4d0b6f845a3bb04421358237f422a51f94fa6..987bb912fab8189e9f4b0db9b1e28aeb36b67990 100644 --- a/Distribution/Simple/NHC.hs +++ b/Distribution/Simple/NHC.hs @@ -73,7 +73,7 @@ import Distribution.Simple.Compiler import qualified Distribution.Simple.PackageIndex as PackageIndex import Distribution.Simple.PackageIndex (PackageIndex) import Language.Haskell.Extension - ( Extension(..) ) + ( Language(Haskell98), Extension(..) ) import Distribution.Simple.Program ( ProgramConfiguration, userMaybeSpecifyPath, programPath , requireProgram, requireProgramVersion, lookupProgram @@ -130,10 +130,14 @@ configure verbosity hcPath _hcPkgPath conf = do let comp = Compiler { compilerId = CompilerId NHC nhcVersion, + compilerLanguages = nhcLanguages, compilerExtensions = nhcLanguageExtensions } return (comp, conf'''') +nhcLanguages :: [(Language, Flag)] +nhcLanguages = [(Haskell98, "-98")] + -- | The flags for the supported extensions nhcLanguageExtensions :: [(Extension, Flag)] nhcLanguageExtensions = diff --git a/Distribution/Simple/UHC.hs b/Distribution/Simple/UHC.hs index 8ad021f9a028aaf5ef45f6f4fcaa3b9761939ed5..024a5e787989ad825383cdd867bd0ef00679daef 100644 --- a/Distribution/Simple/UHC.hs +++ b/Distribution/Simple/UHC.hs @@ -84,10 +84,14 @@ configure verbosity hcPath _hcPkgPath conf = do let comp = Compiler { compilerId = CompilerId UHC uhcVersion, + compilerLanguages = uhcLanguages, compilerExtensions = uhcLanguageExtensions } return (comp, conf') +uhcLanguages :: [(Language, C.Flag)] +uhcLanguages = [(Haskell98, "")] + -- | The flags for the supported extensions. uhcLanguageExtensions :: [(Extension, C.Flag)] uhcLanguageExtensions =