[project @ 2003-01-09 16:15:51 by simonpj]
[ghc-hetmet.git] / ghc / compiler / main / Main.hs
index a4f8255..abe7c01 100644 (file)
@@ -1,7 +1,7 @@
 {-# OPTIONS -fno-warn-incomplete-patterns -optc-DNON_POSIX_SOURCE #-}
 
 -----------------------------------------------------------------------------
--- $Id: Main.hs,v 1.113 2002/10/24 13:08:35 simonmar Exp $
+-- $Id: Main.hs,v 1.118 2003/01/09 10:49:21 simonmar Exp $
 --
 -- GHC Driver program
 --
@@ -19,31 +19,32 @@ module Main (main) where
 
 #ifdef GHCI
 import InteractiveUI
+import DriverPhases( objish_file )
 #endif
 
 
-import Finder          ( initFinder )
 import CompManager     ( cmInit, cmLoadModules, cmDepAnal )
 import HscTypes                ( GhciMode(..) )
 import Config          ( cBooterVersion, cGhcUnregisterised, cProjectVersion )
 import SysTools                ( getPackageConfigPath, initSysTools, cleanTempFiles )
-import Packages                ( showPackages )
-
+import Packages                ( showPackages, getPackageConfigMap, basePackage,
+                         haskell98Package
+                       )
 import DriverPipeline  ( staticLink, doMkDLL, genPipeline, pipeLoop )
 import DriverState     ( buildCoreToDo, buildStgToDo,
-                         findBuildTag, getPackageInfo, getPackageConfigMap,
+                         findBuildTag, 
                          getPackageExtraGhcOpts, unregFlags, 
                          v_GhcMode, v_GhcModeFlag, GhcMode(..),
                          v_Keep_tmp_files, v_Ld_inputs, v_Ways, 
                          v_OptLevel, v_Output_file, v_Output_hi, 
-                         readPackageConf, verifyOutputFiles
+                         readPackageConf, verifyOutputFiles, v_NoLink,
+                         v_Build_tag
                        )
 import DriverFlags     ( buildStaticHscOpts,
                          dynamic_flags, processArgs, static_flags)
 
 import DriverMkDepend  ( beginMkDependHS, endMkDependHS )
-import DriverPhases    ( Phase(HsPp, Hsc), haskellish_src_file, objish_file,
-                         isSourceFile )
+import DriverPhases    ( Phase(HsPp, Hsc), haskellish_src_file, isSourceFile )
 
 import DriverUtil      ( add, handle, handleDyn, later, splitFilename,
                          unknownFlagsErr, getFileSuffix )
@@ -201,9 +202,13 @@ main =
    -- by module basis, using only the -fvia-C and -fasm flags.  If the global
    -- HscLang is not HscC or HscAsm, -fvia-C and -fasm have no effect.
    dyn_flags <- getDynFlags
+   build_tag <- readIORef v_Build_tag
    let lang = case mode of 
                 DoInteractive  -> HscInterpreted
-                _other         -> hscLang dyn_flags
+                _other | build_tag /= "" -> HscC
+                       | otherwise       -> hscLang dyn_flags
+               -- for ways other that the normal way, we must 
+               -- compile via C.
 
    setDynFlags (dyn_flags{ coreToDo = core_todo,
                           stgToDo  = stg_todo,
@@ -246,10 +251,6 @@ main =
    when (verb >= 3) 
        (hPutStrLn stderr ("Hsc static flags: " ++ unwords static_opts))
 
-       -- initialise the finder
-   pkg_avails <- getPackageInfo
-   initFinder pkg_avails
-
        -- mkdependHS is special
    when (mode == DoMkDependHS) beginMkDependHS
 
@@ -305,7 +306,14 @@ main =
    o_files <- mapM compileFile srcs
 
    when (mode == DoMkDependHS) endMkDependHS
-   when (mode == DoLink) (staticLink o_files)
+
+   omit_linking <- readIORef v_NoLink
+   when (mode == DoLink && not omit_linking) 
+       (staticLink o_files [basePackage, haskell98Package])
+               -- we always link in the base package in one-shot linking.
+               -- any other packages required must be given using -package
+               -- options on the command-line.
+
    when (mode == DoMkDLL) (doMkDLL o_files)
 
 
@@ -326,7 +334,23 @@ beginMake fileish_args  = do
                    when (failed ok_flag) (exitWith (ExitFailure 1))
                    return ()
   where
-    looks_like_an_input m = haskellish_src_file m || '.' `notElem` m
+    {-
+      The following things should be considered compilation manager inputs:
+
+       - haskell source files (strings ending in .hs, .lhs or other 
+         haskellish extension),
+
+       - module names (not forgetting hierarchical module names),
+
+       - and finally we consider everything not containing a '.' to be
+         a comp manager input, as shorthand for a .hs or .lhs filename.
+
+      Everything else is considered to be a linker object, and passed
+      straight through to the linker.
+    -}
+    looks_like_an_input m =  haskellish_src_file m 
+                         || looksLikeModuleName m
+                         || '.' `notElem` m
 
 
 beginInteractive :: [String] -> IO ()