lots of portability changes (#1405)
[ghc-hetmet.git] / compiler / main / Main.hs
index 964b488..7c77caf 100644 (file)
@@ -1,4 +1,11 @@
 {-# OPTIONS -fno-warn-incomplete-patterns -optc-DNON_POSIX_SOURCE #-}
+{-# OPTIONS -w #-}
+-- The above warning supression flag is a temporary kludge.
+-- While working on this module you are encouraged to remove it and fix
+-- any warnings in the module. See
+--     http://hackage.haskell.org/trac/ghc/wiki/Commentary/CodingStyle#Warnings
+-- for details
+
 -----------------------------------------------------------------------------
 --
 -- GHC Driver program
@@ -33,7 +40,7 @@ import Packages               ( dumpPackages )
 import DriverPhases    ( Phase(..), isSourceFilename, anyHsc,
                          startPhase, isHaskellSrcFilename )
 import StaticFlags
-import DynFlags         ( defaultDynFlags )
+import DynFlags
 import BasicTypes      ( failed )
 import ErrUtils                ( putMsg )
 import FastString      ( getFastStringTable, isZEncoded, hasZEncoding )
@@ -47,6 +54,7 @@ import System.IO
 import System.Directory        ( doesDirectoryExist )
 import System.Environment
 import System.Exit
+import System.FilePath
 import Control.Monad
 import Data.List
 import Data.Maybe
@@ -85,11 +93,15 @@ main =
   -- to find out what version of GHC it's using before package.conf
   -- exists, so starting the session fails.
   case cli_mode of
-    ShowVersion     -> do showVersion
-                          exitWith ExitSuccess
-    ShowNumVersion  -> do putStrLn cProjectVersion
-                          exitWith ExitSuccess
-    _               -> return ()
+    ShowInfo                -> do showInfo
+                                  exitWith ExitSuccess
+    ShowSupportedLanguages  -> do showSupportedLanguages
+                                  exitWith ExitSuccess
+    ShowVersion             -> do showVersion
+                                  exitWith ExitSuccess
+    ShowNumVersion          -> do putStrLn cProjectVersion
+                                  exitWith ExitSuccess
+    _                       -> return ()
 
   -- start our GHC session
   session <- GHC.newSession mbMinusB
@@ -136,7 +148,7 @@ main =
      -- To simplify the handling of filepaths, we normalise all filepaths right 
      -- away - e.g., for win32 platforms, backslashes are converted
      -- into forward slashes.
-    normal_fileish_paths = map normalisePath fileish_args
+    normal_fileish_paths = map normalise fileish_args
     (srcs, objs)         = partition_args normal_fileish_paths [] []
 
   -- Note: have v_Ld_inputs maintain the order in which 'objs' occurred on 
@@ -153,18 +165,21 @@ main =
        ---------------- Final sanity checking -----------
   checkOptions cli_mode dflags srcs objs
 
-       ---------------- Do the business -----------
+  ---------------- Do the business -----------
+  let alreadyHandled = panic (show cli_mode ++
+                              " should already have been handled")
   case cli_mode of
-    ShowUsage       -> showGhcUsage dflags cli_mode
-    PrintLibdir     -> putStrLn (topDir dflags)
-    ShowVersion     -> panic "ShowVersion should already have been handled"
-    ShowNumVersion  -> panic "ShowNumVersion should already have been handled"
-    ShowInterface f -> doShowIface dflags f
-    DoMake          -> doMake session srcs
-    DoMkDependHS    -> doMkDependHS session (map fst srcs)
-    StopBefore p    -> oneShot dflags p srcs
-    DoInteractive   -> interactiveUI session srcs Nothing
-    DoEval expr     -> interactiveUI session srcs (Just expr)
+    ShowUsage              -> showGhcUsage dflags cli_mode
+    PrintLibdir            -> putStrLn (topDir dflags)
+    ShowSupportedLanguages -> alreadyHandled
+    ShowVersion            -> alreadyHandled
+    ShowNumVersion         -> alreadyHandled
+    ShowInterface f        -> doShowIface dflags f
+    DoMake                 -> doMake session srcs
+    DoMkDependHS           -> doMkDependHS session (map fst srcs)
+    StopBefore p           -> oneShot dflags p srcs
+    DoInteractive          -> interactiveUI session srcs Nothing
+    DoEval expr            -> interactiveUI session srcs (Just expr)
 
   dumpFinalStats dflags
   exitWith ExitSuccess
@@ -291,6 +306,8 @@ verifyOutputFiles dflags = do
 data CmdLineMode
   = ShowUsage               -- ghc -?
   | PrintLibdir             -- ghc --print-libdir
+  | ShowInfo                -- ghc --info
+  | ShowSupportedLanguages  -- ghc --supported-languages
   | ShowVersion             -- ghc -V/--version
   | ShowNumVersion          -- ghc --numeric-version
   | ShowInterface String    -- ghc --show-iface
@@ -348,12 +365,14 @@ type ModeM a = CmdLineP (CmdLineMode, String, [String]) a
 mode_flags :: [(String, OptKind (CmdLineP (CmdLineMode, String, [String])))]
 mode_flags =
   [  ------- help / version ----------------------------------------------
-     ( "?"              , PassFlag (setMode ShowUsage))
-  ,  ( "-help"          , PassFlag (setMode ShowUsage))
-  ,  ( "-print-libdir"   , PassFlag (setMode PrintLibdir))
-  ,  ( "V"              , PassFlag (setMode ShowVersion))
-  ,  ( "-version"       , PassFlag (setMode ShowVersion))
-  ,  ( "-numeric-version", PassFlag (setMode ShowNumVersion))
+     ( "?"                   , PassFlag (setMode ShowUsage))
+  ,  ( "-help"               , PassFlag (setMode ShowUsage))
+  ,  ( "-print-libdir"       , PassFlag (setMode PrintLibdir))
+  ,  ( "V"                   , PassFlag (setMode ShowVersion))
+  ,  ( "-version"            , PassFlag (setMode ShowVersion))
+  ,  ( "-numeric-version"    , PassFlag (setMode ShowNumVersion))
+  ,  ( "-info"               , PassFlag (setMode ShowInfo))
+  ,  ( "-supported-languages", PassFlag (setMode ShowSupportedLanguages))
 
       ------- interfaces ----------------------------------------------------
   ,  ( "-show-iface"     , HasArg (\f -> setMode (ShowInterface f)
@@ -442,6 +461,18 @@ showBanner cli_mode dflags = do
        hPutStr stderr " booted by GHC version "
        hPutStrLn stderr cBooterVersion
 
+-- We print out a Read-friendly string, but a prettier one than the
+-- Show instance gives us
+showInfo :: IO ()
+showInfo = do
+    let sq x = " [" ++ x ++ "\n ]"
+    putStrLn $ sq $ concat $ intersperse "\n ," $ map show compilerInfo
+    exitWith ExitSuccess
+
+showSupportedLanguages :: IO ()
+showSupportedLanguages = do mapM_ putStrLn supportedLanguages
+                            exitWith ExitSuccess
+
 showVersion :: IO ()
 showVersion = do
   putStrLn (cProjectName ++ ", version " ++ cProjectVersion)