{-# 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
--
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,
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
-- 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 -----------
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
-- ----------------------------------------------------------------------------