[project @ 2001-06-29 15:30:49 by simonmar]
[ghc-hetmet.git] / ghc / compiler / main / DriverState.hs
index 62a7976..e7bc5fc 100644 (file)
@@ -1,5 +1,5 @@
 -----------------------------------------------------------------------------
--- $Id: DriverState.hs,v 1.34 2001/03/22 03:51:08 hwloidl Exp $
+-- $Id: DriverState.hs,v 1.47 2001/06/28 10:19:48 sewardj Exp $
 --
 -- Settings for the driver
 --
@@ -9,19 +9,17 @@
 
 module DriverState where
 
+#include "../includes/config.h"
 #include "HsVersions.h"
 
-import CmStaticInfo
+import Packages                ( PackageConfig(..) )
 import CmdLineOpts
+import DriverPhases
 import DriverUtil
 import Util
 import Config
 import Exception
 import IOExts
-#ifdef mingw32_TARGET_OS
-import TmpFiles        ( newTempName )
-import Directory ( removeFile )
-#endif
 import Panic
 
 import List
@@ -34,10 +32,21 @@ import Monad
 cHaskell1Version = "5" -- i.e., Haskell 98
 
 -----------------------------------------------------------------------------
--- Global compilation flags
+-- GHC modes of operation
+
+data GhcMode
+  = DoMkDependHS                       -- ghc -M
+  | DoMkDLL                            -- ghc --mk-dll
+  | StopBefore Phase                   -- ghc -E | -C | -S | -c
+  | DoMake                             -- ghc --make
+  | DoInteractive                      -- ghc --interactive
+  | DoLink                             -- [ the default ]
+  deriving (Eq)
 
--- location of compiler-related files
-GLOBAL_VAR(v_TopDir,  clibdir, String)
+GLOBAL_VAR(v_GhcMode, error "mode not set", GhcMode)
+
+-----------------------------------------------------------------------------
+-- Global compilation flags
 
 -- Cpp-related flags
 v_Hs_source_cpp_opts = global
@@ -57,7 +66,6 @@ GLOBAL_VAR(v_Keep_tmp_files,          False,          Bool)
 
 -- Misc
 GLOBAL_VAR(v_Scale_sizes_by,           1.0,            Double)
-GLOBAL_VAR(v_Dry_run,                  False,          Bool)
 GLOBAL_VAR(v_Static,                   True,           Bool)
 GLOBAL_VAR(v_NoHsMain,                         False,          Bool)
 GLOBAL_VAR(v_Recomp,                   True,           Bool)
@@ -69,8 +77,9 @@ GLOBAL_VAR(v_Excess_precision,                False,          Bool)
 -- Splitting object files (for libraries)
 
 GLOBAL_VAR(v_Split_object_files,       False,          Bool)
-GLOBAL_VAR(v_Split_prefix,             "",             String)
-GLOBAL_VAR(v_N_split_files,            0,              Int)
+GLOBAL_VAR(v_Split_info,               ("",0),         (String,Int))
+       -- The split prefix and number of files
+
        
 can_split :: Bool
 can_split =  prefixMatch "i386"    cTARGETPLATFORM
@@ -92,10 +101,14 @@ defaultHscLang
   | otherwise                                  =  HscC
 
 GLOBAL_VAR(v_Output_dir,  Nothing, Maybe String)
-GLOBAL_VAR(v_Object_suf,  Nothing, Maybe String)
 GLOBAL_VAR(v_Output_file, Nothing, Maybe String)
 GLOBAL_VAR(v_Output_hi,   Nothing, Maybe String)
 
+GLOBAL_VAR(v_Object_suf,  Nothing, Maybe String)
+GLOBAL_VAR(v_HC_suf,     Nothing, Maybe String)
+GLOBAL_VAR(v_Hi_dir,      Nothing, Maybe String)
+GLOBAL_VAR(v_Hi_suf,      "hi",           String)
+
 GLOBAL_VAR(v_Ld_inputs,        [],      [String])
 
 odir_ify :: String -> IO String
@@ -113,12 +126,6 @@ osuf_ify f = do
        Just s  -> return (newsuf s f)
 
 -----------------------------------------------------------------------------
--- Hi Files
-
-GLOBAL_VAR(v_Hi_on_stdout,     False,  Bool)
-GLOBAL_VAR(v_Hi_suf,           "hi",   String)
-
------------------------------------------------------------------------------
 -- Compiler optimisation options
 
 GLOBAL_VAR(v_OptLevel, 0, Int)
@@ -322,11 +329,11 @@ addToDirList ref path
   = do paths <- readIORef ref
        writeIORef ref (paths ++ split split_marker path)
 
+GLOBAL_VAR(v_HCHeader, "", String)
+
 -----------------------------------------------------------------------------
 -- Packages
 
-GLOBAL_VAR(v_Path_package_config, error "path_package_config", String)
-
 -- package list is maintained in dependency order
 GLOBAL_VAR(v_Packages, ("std":"rts":"gmp":[]), [String])
 
@@ -334,7 +341,7 @@ addPackage :: String -> IO ()
 addPackage package
   = do pkg_details <- readIORef v_Package_details
        case lookupPkg package pkg_details of
-         Nothing -> throwDyn (OtherError ("unknown package name: " ++ package))
+         Nothing -> throwDyn (CmdLineError ("unknown package name: " ++ package))
          Just details -> do
            ps <- readIORef v_Packages
            unless (package `elem` ps) $ do
@@ -345,7 +352,7 @@ addPackage package
 getPackageImportPath   :: IO [String]
 getPackageImportPath = do
   ps <- getPackageInfo
-  return (nub (concat (map import_dirs ps)))
+  return (nub (filter (not.null) (concatMap import_dirs ps)))
 
 getPackageIncludePath   :: IO [String]
 getPackageIncludePath = do
@@ -361,7 +368,7 @@ getPackageCIncludes = do
 getPackageLibraryPath  :: IO [String]
 getPackageLibraryPath = do
   ps <- getPackageInfo
-  return (nub (concat (map library_dirs ps)))
+  return (nub (filter (not.null) (concatMap library_dirs ps)))
 
 getPackageLibraries    :: IO [String]
 getPackageLibraries = do
@@ -369,8 +376,29 @@ getPackageLibraries = do
   tag <- readIORef v_Build_tag
   let suffix = if null tag then "" else '_':tag
   return (concat (
-       map (\p -> map (++suffix) (hs_libraries p) ++ extra_libraries p) ps
+       map (\p -> map (++suffix) (hACK (hs_libraries p)) ++ extra_libraries p) ps
      ))
+  where
+     -- This is a totally horrible (temporary) hack, for Win32.  Problem is
+     -- that package.conf for Win32 says that the main prelude lib is 
+     -- split into HSstd1 and HSstd2, which is needed due to limitations in
+     -- the PEi386 file format, to make GHCi work.  However, we still only
+     -- have HSstd.a for static linking, not HSstd1.a and HSstd2.a.  
+     -- getPackageLibraries is called to find the .a's to add to the static
+     -- link line.  On Win32, this hACK detects HSstd1 and HSstd2 and 
+     -- replaces them with HSstd, so static linking still works.
+     -- Libraries needed for dynamic (GHCi) linking are discovered via
+     -- different route (in InteractiveUI.linkPackage).
+     -- See driver/PackageSrc.hs for the HSstd1/HSstd2 split definition.
+     -- THIS IS A STRICTLY TEMPORARY HACK (famous last words ...)
+     hACK libs
+#      ifndef mingw32_TARGET_OS
+       = libs
+#      else
+       = if   "HSstd1" `elem` libs && "HSstd2" `elem` libs
+         then "HSstd" : filter ((/= "HSstd").(take 5)) libs
+         else libs
+#      endif
 
 getPackageExtraGhcOpts :: IO [String]
 getPackageExtraGhcOpts = do
@@ -404,6 +432,7 @@ lookupPkg nm ps
    = case [p | p <- ps, name p == nm] of
         []    -> Nothing
         (p:_) -> Just p
+
 -----------------------------------------------------------------------------
 -- Ways
 
@@ -460,7 +489,7 @@ findBuildTag :: IO [String]  -- new options
 findBuildTag = do
   way_names <- readIORef v_Ways
   case sort way_names of
-     []  -> do  writeIORef v_Build_tag ""
+     []  -> do  -- writeIORef v_Build_tag ""
                return []
 
      [w] -> do let details = lkupWay w
@@ -468,7 +497,7 @@ findBuildTag = do
               return (wayOpts details)
 
      ws  -> if not (allowed_combination ws)
-               then throwDyn (OtherError $
+               then throwDyn (CmdLineError $
                                "combination not supported: "  ++
                                foldr1 (\a b -> a ++ '/':b) 
                                (map (wayName . lkupWay) ws))
@@ -588,15 +617,6 @@ unregFlags =
 -----------------------------------------------------------------------------
 -- Programs for particular phases
 
-GLOBAL_VAR(v_Pgm_L,   error "pgm_L", String)
-GLOBAL_VAR(v_Pgm_P,   cRAWCPP,       String)
-GLOBAL_VAR(v_Pgm_c,   cGCC,          String)
-GLOBAL_VAR(v_Pgm_m,   error "pgm_m", String)
-GLOBAL_VAR(v_Pgm_s,   error "pgm_s", String)
-GLOBAL_VAR(v_Pgm_a,   cGCC,          String)
-GLOBAL_VAR(v_Pgm_l,   cGCC,          String)
-GLOBAL_VAR(v_Pgm_dll, cMkDLL,        String)
-
 GLOBAL_VAR(v_Opt_dep,    [], [String])
 GLOBAL_VAR(v_Anti_opt_C, [], [String])
 GLOBAL_VAR(v_Opt_C,      [], [String])