[project @ 2005-01-27 10:44:00 by simonpj]
[ghc-hetmet.git] / ghc / compiler / main / DriverFlags.hs
index b3bda23..82c288b 100644 (file)
@@ -7,10 +7,14 @@
 -----------------------------------------------------------------------------
 
 module DriverFlags ( 
-       processArgs, OptKind(..), static_flags, dynamic_flags, 
+       processDynamicFlags,
+       processStaticFlags,
+
        addCmdlineHCInclude,
        buildStaticHscOpts, 
-       machdepCCOpts
+       machdepCCOpts,
+
+       processArgs, OptKind(..), -- for DriverMkDepend only
   ) where
 
 #include "HsVersions.h"
@@ -25,9 +29,10 @@ import CmdLineOpts
 import Config
 import Util
 import Panic
+import FastString      ( mkFastString )
 
 import EXCEPTION
-import DATA_IOREF      ( readIORef, writeIORef )
+import DATA_IOREF      ( IORef, readIORef, writeIORef )
 
 import System          ( exitWith, ExitCode(..) )
 import IO
@@ -57,6 +62,9 @@ import Char
 -----------------------------------------------------------------------------
 -- Process command-line  
 
+processStaticFlags :: [String] -> IO [String]
+processStaticFlags opts = processArgs static_flags opts []
+
 data OptKind
        = NoArg (IO ())                     -- flag with no argument
        | HasArg (String -> IO ())          -- flag has an argument (maybe prefix)
@@ -169,11 +177,10 @@ static_flags =
 
       ------- primary modes ------------------------------------------------
   ,  ( "M"             , PassFlag (setMode DoMkDependHS))
-  ,  ( "E"             , PassFlag (setMode (StopBefore Hsc)))
+  ,  ( "E"             , PassFlag (setMode (StopBefore anyHsc)))
   ,  ( "C"             , PassFlag (\f -> do setMode (StopBefore HCc) f
-                                            setLang HscC))
+                                            setTarget HscC))
   ,  ( "S"             , PassFlag (setMode (StopBefore As)))
-  ,  ( "c"             , PassFlag (setMode (StopBefore Ln)))
   ,  ( "-make"         , PassFlag (setMode DoMake))
   ,  ( "-interactive"  , PassFlag (setMode DoInteractive))
   ,  ( "-mk-dll"       , PassFlag (setMode DoMkDLL))
@@ -181,7 +188,7 @@ static_flags =
 
        -- -fno-code says to stop after Hsc but don't generate any code.
   ,  ( "fno-code"      , PassFlag (\f -> do setMode (StopBefore HCc) f
-                                            setLang HscNothing
+                                            setTarget HscNothing
                                             writeIORef v_Recomp False))
 
        ------- GHCi -------------------------------------------------------
@@ -233,8 +240,8 @@ static_flags =
   ,  ( "odir"          , HasArg (writeIORef v_Output_dir  . Just) )
   ,  ( "o"             , SepArg (writeIORef v_Output_file . Just) )
   ,  ( "osuf"          , HasArg (writeIORef v_Object_suf) )
-  ,  ( "hcsuf"         , HasArg (writeIORef v_HC_suf      . Just) )
-  ,  ( "hisuf"         , HasArg (writeIORef v_Hi_suf) )
+  ,  ( "hcsuf"         , HasArg (writeIORef v_HC_suf    ) )
+  ,  ( "hisuf"         , HasArg (writeIORef v_Hi_suf    ) )
   ,  ( "hidir"         , HasArg (writeIORef v_Hi_dir . Just) )
   ,  ( "buildtag"      , HasArg (writeIORef v_Build_tag) )
   ,  ( "tmpdir"                , HasArg setTmpDir)
@@ -258,7 +265,6 @@ static_flags =
                                ) )
 
        ------- Include/Import Paths ----------------------------------------
-  ,  ( "i"             , OptPrefix (addToOrDeleteDirList v_Import_paths) )
   ,  ( "I"             , Prefix    (addToDirList v_Include_paths) )
 
        ------- Libraries ---------------------------------------------------
@@ -271,13 +277,6 @@ static_flags =
   ,  ( "framework-path" , HasArg (addToDirList v_Framework_paths) )
   ,  ( "framework"     , HasArg (add v_Cmdline_frameworks) )
 #endif
-        ------- Packages ----------------------------------------------------
-  ,  ( "package-name"   , HasArg (\s -> add v_Opt_C ("-inpackage="++s)) )
-
-  ,  ( "package-conf"   , HasArg (readPackageConf) )
-  ,  ( "package"        , HasArg (addPackage) )
-  ,  ( "syslib"         , HasArg (addPackage) )        -- for compatibility w/ old vsns
-
         ------- Specific phases  --------------------------------------------
   ,  ( "pgmL"           , HasArg setPgmL )
   ,  ( "pgmP"           , HasArg setPgmP )
@@ -298,7 +297,8 @@ static_flags =
   ,  ( "optdll"                , HasArg (add v_Opt_dll) )
 
        ----- Linker --------------------------------------------------------
-  ,  ( "no-link"       , NoArg (writeIORef v_NoLink True) )
+  ,  ( "c"             , NoArg (writeIORef v_NoLink True) )
+  ,  ( "no-link"       , NoArg (writeIORef v_NoLink True) )    -- Deprecated
   ,  ( "static"        , NoArg (writeIORef v_Static True) )
   ,  ( "dynamic"        , NoArg (writeIORef v_Static False) )
   ,  ( "rdynamic"       , NoArg (return ()) ) -- ignored for compat w/ gcc
@@ -340,10 +340,22 @@ dynamic_flags = [
   ,  ( "opti",         HasArg (addOpt_i) )
 #endif
 
+        ------- Packages ----------------------------------------------------
+  ,  ( "package-conf"   , HasArg extraPkgConf_ )
+  ,  ( "no-user-package-conf", NoArg noUserPkgConf_ )
+  ,  ( "package-name"   , HasArg ignorePackage ) -- for compatibility
+  ,  ( "package"        , HasArg exposePackage )
+  ,  ( "hide-package"   , HasArg hidePackage )
+  ,  ( "ignore-package" , HasArg ignorePackage )
+  ,  ( "syslib"         , HasArg exposePackage )  -- for compatibility
+
        ------ HsCpp opts ---------------------------------------------------
   ,  ( "D",            AnySuffix addOpt_P )
   ,  ( "U",            AnySuffix addOpt_P )
 
+        ------- Paths & stuff -----------------------------------------------
+  ,  ( "i"             , OptPrefix addImportPath )
+
        ------ Debugging ----------------------------------------------------
   ,  ( "dstg-stats",   NoArg (writeIORef v_StgStats True) )
 
@@ -417,19 +429,14 @@ dynamic_flags = [
 
         ------ Compiler flags -----------------------------------------------
 
-  ,  ( "fasm",         AnySuffix (\_ -> setLang HscAsm) )
-  ,  ( "fvia-c",       NoArg (setLang HscC) )
-  ,  ( "fvia-C",       NoArg (setLang HscC) )
-  ,  ( "filx",         NoArg (setLang HscILX) )
+  ,  ( "fasm",         AnySuffix (\_ -> setTarget HscAsm) )
+  ,  ( "fvia-c",       NoArg (setTarget HscC) )
+  ,  ( "fvia-C",       NoArg (setTarget HscC) )
+  ,  ( "filx",         NoArg (setTarget HscILX) )
 
   ,  ( "fglasgow-exts",    NoArg (mapM_ setDynFlag   glasgowExtsFlags) )
   ,  ( "fno-glasgow-exts", NoArg (mapM_ unSetDynFlag glasgowExtsFlags) )
 
-       -- "active negatives"
-  ,  ( "fno-implicit-prelude",  NoArg (setDynFlag Opt_NoImplicitPrelude) )
-  ,  ( "fno-monomorphism-restriction", 
-                       NoArg (setDynFlag Opt_NoMonomorphismRestriction) )
-
        -- the rest of the -f* and -fno-* flags
   ,  ( "fno-",                 PrefixPred (\f -> isFFlag f) (\f -> unSetDynFlag (getFFlag f)) )
   ,  ( "f",            PrefixPred (\f -> isFFlag f) (\f -> setDynFlag (getFFlag f)) )
@@ -441,6 +448,7 @@ fFlags = [
   ( "warn-duplicate-exports",          Opt_WarnDuplicateExports ),
   ( "warn-hi-shadowing",               Opt_WarnHiShadows ),
   ( "warn-incomplete-patterns",        Opt_WarnIncompletePatterns ),
+  ( "warn-incomplete-record-updates",          Opt_WarnIncompletePatternsRecUpd ),
   ( "warn-missing-fields",             Opt_WarnMissingFields ),
   ( "warn-missing-methods",            Opt_WarnMissingMethods ),
   ( "warn-missing-signatures",         Opt_WarnMissingSigs ),
@@ -452,11 +460,15 @@ fFlags = [
   ( "warn-unused-imports",             Opt_WarnUnusedImports ),
   ( "warn-unused-matches",             Opt_WarnUnusedMatches ),
   ( "warn-deprecations",               Opt_WarnDeprecations ),
+  ( "warn-orphans",                    Opt_WarnOrphans ),
   ( "fi",                              Opt_FFI ),  -- support `-ffi'...
   ( "ffi",                             Opt_FFI ),  -- ...and also `-fffi'
   ( "arrows",                          Opt_Arrows ), -- arrow syntax
   ( "parr",                            Opt_PArr ),
   ( "th",                              Opt_TH ),
+  ( "implicit-prelude",                Opt_ImplicitPrelude ),
+  ( "scoped-type-variables",           Opt_ScopedTypeVariables ),
+  ( "monomorphism-restriction",                Opt_MonomorphismRestriction ),
   ( "implicit-params",                 Opt_ImplicitParams ),
   ( "allow-overlapping-instances",     Opt_AllowOverlappingInstances ),
   ( "allow-undecidable-instances",     Opt_AllowUndecidableInstances ),
@@ -474,11 +486,82 @@ fFlags = [
   ( "unbox-strict-fields",             Opt_UnboxStrictFields )
   ]
 
-glasgowExtsFlags = [ Opt_GlasgowExts, Opt_FFI, Opt_TH, Opt_ImplicitParams ]
+glasgowExtsFlags = [ Opt_GlasgowExts, Opt_FFI, Opt_TH, Opt_ImplicitParams, Opt_ScopedTypeVariables ]
 
 isFFlag f = f `elem` (map fst fFlags)
 getFFlag f = fromJust (lookup f fFlags)
 
+-- -----------------------------------------------------------------------------
+-- Parsing the dynamic flags.
+
+-- we use a temporary global variable, for convenience
+
+GLOBAL_VAR(v_DynFlags, defaultDynFlags, DynFlags)
+
+processDynamicFlags :: [String] -> DynFlags -> IO (DynFlags,[String])
+processDynamicFlags args dflags = do
+  writeIORef v_DynFlags dflags
+  spare <- processArgs dynamic_flags args []
+  dflags <- readIORef v_DynFlags
+  return (dflags,spare)
+
+updDynFlags :: (DynFlags -> DynFlags) -> IO ()
+updDynFlags f = do dfs <- readIORef v_DynFlags
+                  writeIORef v_DynFlags (f dfs)
+
+setDynFlag, unSetDynFlag :: DynFlag -> IO ()
+setDynFlag f   = updDynFlags (\dfs -> dopt_set dfs f)
+unSetDynFlag f = updDynFlags (\dfs -> dopt_unset dfs f)
+
+addOpt_L a = updDynFlags (\s -> s{opt_L = a : opt_L s})
+addOpt_P a = updDynFlags (\s -> s{opt_P = a : opt_P s})
+addOpt_F a = updDynFlags (\s -> s{opt_F = a : opt_F s})
+addOpt_c a = updDynFlags (\s -> s{opt_c = a : opt_c s})
+addOpt_a a = updDynFlags (\s -> s{opt_a = a : opt_a s})
+addOpt_m a = updDynFlags (\s -> s{opt_m = a : opt_m s})
+#ifdef ILX
+addOpt_I a = updDynFlags (\s -> s{opt_I = a : opt_I s})
+addOpt_i a = updDynFlags (\s -> s{opt_i = a : opt_i s})
+#endif
+
+setVerbosity "" = updDynFlags (\dfs -> dfs{ verbosity = 3 })
+setVerbosity n 
+  | all isDigit n = updDynFlags (\dfs -> dfs{ verbosity = read n })
+  | otherwise     = throwDyn (UsageError "can't parse verbosity flag (-v<n>)")
+
+addCmdlineHCInclude a = updDynFlags (\s -> s{cmdlineHcIncludes =  a : cmdlineHcIncludes s})
+
+extraPkgConf_  p = updDynFlags (\s -> s{ extraPkgConfs = p : extraPkgConfs s })
+noUserPkgConf_   = updDynFlags (\s -> s{ readUserPkgConf = False })
+
+exposePackage p = 
+  updDynFlags (\s -> s{ packageFlags = ExposePackage p : packageFlags s })
+hidePackage p = 
+  updDynFlags (\s -> s{ packageFlags = HidePackage p : packageFlags s })
+ignorePackage p = 
+  updDynFlags (\s -> s{ packageFlags = IgnorePackage p : packageFlags s })
+
+-- -i on its own deletes the import paths
+addImportPath "" = updDynFlags (\s -> s{importPaths = []})
+addImportPath p  = do
+  paths <- splitPathList p
+  updDynFlags (\s -> s{importPaths = importPaths s ++ paths})
+
+-- we can only switch between HscC, HscAsmm, and HscILX with dynamic flags 
+-- (-fvia-C, -fasm, -filx respectively).
+setTarget l = updDynFlags (\dfs -> case hscTarget dfs of
+                                       HscC   -> dfs{ hscTarget = l }
+                                       HscAsm -> dfs{ hscTarget = l }
+                                       HscILX -> dfs{ hscTarget = l }
+                                       _      -> dfs)
+
+setOptLevel :: Int -> IO ()
+setOptLevel n 
+   = do dflags <- readIORef v_DynFlags
+       if hscTarget dflags == HscInterpreted && n > 0
+         then putStr "warning: -O conflicts with --interactive; -O ignored.\n"
+         else writeIORef v_DynFlags (updOptLevel n dflags)
+
 -----------------------------------------------------------------------------
 -- convert sizes like "3.5M" into integers
 
@@ -546,9 +629,9 @@ setMainIs arg
 --                    , registerised HC compilations
 --                    )
 
-machdepCCOpts 
+machdepCCOpts dflags
    | prefixMatch "alpha"   cTARGETPLATFORM  
-       = return ( ["-static", "-w", "-mieee"
+       = return ( ["-w", "-mieee"
 #ifdef HAVE_THREADED_RTS_SUPPORT
                    , "-D_REENTRANT"
 #endif
@@ -560,7 +643,7 @@ machdepCCOpts
    | prefixMatch "hppa"    cTARGETPLATFORM  
         -- ___HPUX_SOURCE, not _HPUX_SOURCE, is #defined if -ansi!
         -- (very nice, but too bad the HP /usr/include files don't agree.)
-       = return ( ["-static", "-D_HPUX_SOURCE"], [] )
+       = return ( ["-D_HPUX_SOURCE"], [] )
 
    | prefixMatch "m68k"    cTARGETPLATFORM
       -- -fno-defer-pop : for the .hc files, we want all the pushing/
@@ -579,7 +662,7 @@ machdepCCOpts
       --
       -- -fomit-frame-pointer : *must* in .hc files; because we're stealing
       --   the fp (%ebp) for our register maps.
-       = do n_regs <- dynFlag stolen_x86_regs
+       = do let n_regs = stolen_x86_regs dflags
             sta    <- readIORef v_Static
             return ( [ if sta then "-DDONT_WANT_WIN32_DLL_SUPPORT" else ""
 --                    , if suffixMatch "mingw32" cTARGETPLATFORM then "-mno-cygwin" else "" 
@@ -641,24 +724,6 @@ machdepCCOpts
 -----------------------------------------------------------------------------
 -- local utils
 
-addOpt_L a = updDynFlags (\s -> s{opt_L = a : opt_L s})
-addOpt_P a = updDynFlags (\s -> s{opt_P = a : opt_P s})
-addOpt_F a = updDynFlags (\s -> s{opt_F = a : opt_F s})
-addOpt_c a = updDynFlags (\s -> s{opt_c = a : opt_c s})
-addOpt_a a = updDynFlags (\s -> s{opt_a = a : opt_a s})
-addOpt_m a = updDynFlags (\s -> s{opt_m = a : opt_m s})
-#ifdef ILX
-addOpt_I a = updDynFlags (\s -> s{opt_I = a : opt_I s})
-addOpt_i a = updDynFlags (\s -> s{opt_i = a : opt_i s})
-#endif
-
-setVerbosity "" = updDynFlags (\dfs -> dfs{ verbosity = 3 })
-setVerbosity n 
-  | all isDigit n = updDynFlags (\dfs -> dfs{ verbosity = read n })
-  | otherwise     = throwDyn (UsageError "can't parse verbosity flag (-v<n>)")
-
-addCmdlineHCInclude a = updDynFlags (\s -> s{cmdlineHcIncludes =  a : cmdlineHcIncludes s})
-
 -- -----------------------------------------------------------------------------
 -- Version and usage messages
 
@@ -671,8 +736,8 @@ showGhcUsage = do
   (ghc_usage_path,ghci_usage_path) <- getUsageMsgPaths
   mode <- readIORef v_GhcMode
   let usage_path 
-       | mode == DoInteractive  = ghci_usage_path
-       | otherwise              = ghc_usage_path
+       | DoInteractive <- mode = ghci_usage_path
+       | otherwise             = ghc_usage_path
   usage <- readFile usage_path
   dump usage
   exitWith ExitSuccess