[project @ 2003-06-10 17:54:56 by sof]
[ghc-hetmet.git] / ghc / compiler / main / Main.hs
index 23bbec1..f6175e7 100644 (file)
@@ -1,7 +1,7 @@
 {-# OPTIONS -fno-warn-incomplete-patterns -optc-DNON_POSIX_SOURCE #-}
 
 -----------------------------------------------------------------------------
--- $Id: Main.hs,v 1.122 2003/05/21 12:38:36 simonmar Exp $
+-- $Id: Main.hs,v 1.125 2003/06/10 17:54:56 sof Exp $
 --
 -- GHC Driver program
 --
@@ -25,11 +25,12 @@ import InteractiveUI( ghciWelcomeMsg, interactiveUI )
 import CompManager     ( cmInit, cmLoadModules, cmDepAnal )
 import HscTypes                ( GhciMode(..) )
 import Config          ( cBooterVersion, cGhcUnregisterised, cProjectVersion )
-import SysTools                ( getPackageConfigPath, initSysTools, cleanTempFiles )
+import SysTools                ( getPackageConfigPath, initSysTools, cleanTempFiles,
+                         normalisePath )
 import Packages                ( showPackages, getPackageConfigMap, basePackage,
                          haskell98Package
                        )
-import DriverPipeline  ( staticLink, doMkDLL, genPipeline, pipeLoop )
+import DriverPipeline  ( staticLink, doMkDLL, runPipeline )
 import DriverState     ( buildCoreToDo, buildStgToDo,
                          findBuildTag, 
                          getPackageExtraGhcOpts, unregFlags, 
@@ -43,14 +44,12 @@ 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    ( isSourceFile )
 
-import DriverUtil      ( add, handle, handleDyn, later, splitFilename,
-                         unknownFlagsErr, getFileSuffix )
+import DriverUtil      ( add, handle, handleDyn, later, unknownFlagsErr )
 import CmdLineOpts     ( dynFlag, restoreDynFlags,
                          saveDynFlags, setDynFlags, getDynFlags, dynFlag,
-                         DynFlags(..), HscLang(..), v_Static_hsc_opts,
-                         defaultHscLang
+                         DynFlags(..), HscLang(..), v_Static_hsc_opts
                        )
 import BasicTypes      ( failed )
 import Outputable
@@ -198,9 +197,35 @@ main =
        -- save the "initial DynFlags" away
    saveDynFlags
 
-       -- We split out the object files (.o, .dll) and add them
-       -- to v_Ld_inputs for use by the linker
-   let (objs, srcs) = partition objish_file fileish_args
+   let
+    {-
+      We split out the object files (.o, .dll) and add them
+      to v_Ld_inputs for use by the linker.
+
+      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 =  isSourceFile m 
+                         || looksLikeModuleName m
+                         || '.' `notElem` m
+
+    (raw_srcs, objs) = partition looks_like_an_input fileish_args
+
+     -- To simplify the handling of filepaths, we normalise all source file
+     -- paths right away - e.g., for win32 platforms, backslashes are converted
+     -- into forward slashes.
+    srcs             = map normalisePath raw_srcs
+
    mapM_ (add v_Ld_inputs) objs
 
        ---------------- Display banners and configuration -----------
@@ -286,27 +311,14 @@ compileFile mode stop_flag src = do
    when (not exists) $ 
        throwDyn (CmdLineError ("file `" ++ src ++ "' does not exist"))
    
-   -- We compile in two stages, because the file may have an
-   -- OPTIONS pragma that affects the compilation pipeline (eg. -fvia-C)
-   let (basename, suffix) = splitFilename src
-
-   -- just preprocess (Haskell source only)
-   let src_and_suff = (src, getFileSuffix src)
-   let not_hs_file  = not (haskellish_src_file src)
-   pp <- if not_hs_file || mode == StopBefore Hsc || mode == StopBefore HsPp
-               then return src_and_suff else do
-       phases <- genPipeline (StopBefore Hsc) stop_flag
-                             False{-not persistent-} defaultHscLang
-                             src_and_suff
-       pipeLoop phases src_and_suff False{-no linking-} False{-no -o flag-}
-               basename suffix
-   
-   -- rest of compilation
-   hsc_lang <- dynFlag hscLang
-   phases   <- genPipeline mode stop_flag True hsc_lang pp
-   (r,_)    <- pipeLoop phases pp (mode==DoLink || mode==DoMkDLL)
-                             True{-use -o flag-} basename suffix
-   return r
+   o_file   <- readIORef v_Output_file
+       -- when linking, the -o argument refers to the linker's output. 
+       -- otherwise, we use it as the name for the pipeline's output.
+   let maybe_o_file
+         | mode==DoLink || mode==DoMkDLL  = Nothing
+         | otherwise                      = o_file
+
+   runPipeline mode stop_flag True maybe_o_file src
 
 
 -- ----------------------------------------------------------------------------