[project @ 2000-10-27 11:48:54 by sewardj]
[ghc-hetmet.git] / ghc / compiler / main / CmdLineOpts.lhs
index 4fc8240..d254ab1 100644 (file)
@@ -14,6 +14,8 @@ module CmdLineOpts (
        DynFlag(..),    -- needed non-abstractly by DriverFlags
        DynFlags(..),
 
+       v_Static_hsc_opts,
+
        intSwitchSet,
        switchIsOn,
        isStaticHscFlag,
@@ -27,6 +29,8 @@ module CmdLineOpts (
        -- other dynamic flags
        dopt_CoreToDo,
        dopt_StgToDo,
+       dopt_HscLang,
+       dopt_OutName,
 
        -- profiling opts
        opt_AutoSccsOnAllToplevs,
@@ -95,7 +99,7 @@ module CmdLineOpts (
 
 import Array   ( array, (//) )
 import GlaExts
-import Argv
+import IOExts  ( IORef, readIORef )
 import Constants       -- Default values for some flags
 import Util
 import FastTypes
@@ -275,27 +279,31 @@ data DynFlag
    deriving (Eq)
 
 data DynFlags = DynFlags {
-  coreToDo :: CoreToDo,
-  stgToDo  :: StgToDo,
-  hscLang  :: HscLang,
-  flags    :: [DynFlag]
+  coreToDo   :: [CoreToDo],
+  stgToDo    :: [StgToDo],
+  hscLang    :: HscLang,
+  hscOutName :: String,  -- name of the file in which to place output
+  flags      :: [DynFlag]
  }
 
 dopt :: DynFlag -> DynFlags -> Bool
 dopt f dflags  = f `elem` (flags dflags)
 
-dopt_CoreToDo :: DynFlags -> CoreToDo
+dopt_CoreToDo :: DynFlags -> [CoreToDo]
 dopt_CoreToDo = coreToDo
 
-dopt_StgToDo :: DynFlags -> StgToDo
+dopt_StgToDo :: DynFlags -> [StgToDo]
 dopt_StgToDo = stgToDo
 
+dopt_OutName :: DynFlags -> String
+dopt_OutName = hscOutName
+
 data HscLang
   = HscC
   | HscAsm
   | HscJava
-  | HscInterpreter
-  deriving Eq
+  | HscInterpreted
+    deriving Eq
 
 dopt_HscLang :: DynFlags -> HscLang
 dopt_HscLang = hscLang
@@ -308,15 +316,22 @@ dopt_HscLang = hscLang
 %************************************************************************
 
 \begin{code}
+-- v_Statis_hsc_opts is here to avoid a circular dependency with
+-- main/DriverState.
+GLOBAL_VAR(v_Static_hsc_opts, [], [String])
+
 lookUp          :: FAST_STRING -> Bool
 lookup_int              :: String -> Maybe Int
 lookup_def_int   :: String -> Int -> Int
 lookup_def_float :: String -> Float -> Float
 lookup_str       :: String -> Maybe String
 
-lookUp     sw = sw `elem` argv
+unpacked_static_opts = unsafePerformIO (readIORef v_Static_hsc_opts)
+packed_static_opts   = map _PK_ unpacked_static_opts
+
+lookUp     sw = sw `elem` packed_static_opts
        
-lookup_str sw = firstJust (map (startsWith sw) unpacked_opts)
+lookup_str sw = firstJust (map (startsWith sw) unpacked_static_opts)
 
 lookup_int sw = case (lookup_str sw) of
                  Nothing -> Nothing
@@ -334,7 +349,6 @@ lookup_def_float sw def = case (lookup_str sw) of
                            Nothing -> def              -- Use default
                            Just xx -> read xx
 
-unpacked_opts = map _UNPK_ argv
 
 {-
  Putting the compiler options into temporary at-files
@@ -346,7 +360,7 @@ unpacked_opts :: [String]
 unpacked_opts =
   concat $
   map (expandAts) $
-  map _UNPK_ argv
+  map _UNPK_ argv  -- NOT ARGV any more: v_Static_hsc_opts
   where
    expandAts ('@':fname) = words (unsafePerformIO (readFile fname))
    expandAts l = [l]