X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2FMain.hs;h=519d9cd0759333430bdb32bf754b355266047d80;hb=a19691137898050be08580092ed6f22213f66c27;hp=4c18d268a0854a7859c6a2367d57dac758752084;hpb=c7170e8e18c97527c256469a5ebbc5c724d6a900;p=ghc-hetmet.git diff --git a/ghc/Main.hs b/ghc/Main.hs index 4c18d26..519d9cd 100644 --- a/ghc/Main.hs +++ b/ghc/Main.hs @@ -47,7 +47,6 @@ import Panic -- import MonadUtils ( liftIO ) -- Imports for --abi-hash -import HscTypes ( ModIface(mi_mod_hash) ) import LoadIface ( loadUserInterface ) import Module ( mkModuleName ) import Finder ( findImportedModule, cannotFindInterface ) @@ -209,7 +208,8 @@ main' postLoadMode dflags0 args flagWarnings = do case postLoadMode of ShowInterface f -> liftIO $ doShowIface dflags3 f DoMake -> doMake srcs - DoMkDependHS -> doMkDependHS (map fst srcs) + DoMkDependHS -> do doMkDependHS (map fst srcs) + GHC.printWarnings StopBefore p -> oneShot hsc_env p srcs >> GHC.printWarnings DoInteractive -> interactiveUI srcs Nothing DoEval exprs -> interactiveUI srcs $ Just $ reverse exprs @@ -407,7 +407,7 @@ data PostLoadMode | DoEval [String] -- ghc -e foo -e bar => DoEval ["bar", "foo"] | DoAbiHash -- ghc --abi-hash -doMkDependHSMode, doMakeMode, doInteractiveMode :: Mode +doMkDependHSMode, doMakeMode, doInteractiveMode, doAbiHashMode :: Mode doMkDependHSMode = mkPostLoadMode DoMkDependHS doMakeMode = mkPostLoadMode DoMake doInteractiveMode = mkPostLoadMode DoInteractive @@ -429,6 +429,14 @@ isDoInteractiveMode :: Mode -> Bool isDoInteractiveMode (Right (Right DoInteractive)) = True isDoInteractiveMode _ = False +isStopLnMode :: Mode -> Bool +isStopLnMode (Right (Right (StopBefore StopLn))) = True +isStopLnMode _ = False + +isDoMakeMode :: Mode -> Bool +isDoMakeMode (Right (Right DoMake)) = True +isDoMakeMode _ = False + #ifdef GHCI isInteractiveMode :: PostLoadMode -> Bool isInteractiveMode DoInteractive = True @@ -462,7 +470,6 @@ isCompManagerMode DoInteractive = True isCompManagerMode (DoEval _) = True isCompManagerMode _ = False - -- ----------------------------------------------------------------------------- -- Parsing the mode flag @@ -475,7 +482,7 @@ parseModeFlags args = do runCmdLine (processArgs mode_flags args) (Nothing, [], []) mode = case mModeFlag of - Nothing -> stopBeforeMode StopLn + Nothing -> doMakeMode Just (m, _) -> m errs = errs1 ++ map (mkGeneralLocated "on the commandline") errs2 when (not (null errs)) $ ghcError $ errorsToGhcException errs @@ -519,6 +526,9 @@ mode_flags = Supported ------- primary modes ------------------------------------------------ + , Flag "c" (PassFlag (\f -> do setMode (stopBeforeMode StopLn) f + addFlag "-no-link" f)) + Supported , Flag "M" (PassFlag (setMode doMkDependHSMode)) Supported , Flag "E" (PassFlag (setMode (stopBeforeMode anyHsc))) @@ -534,13 +544,7 @@ mode_flags = Supported , Flag "-abi-hash" (PassFlag (setMode doAbiHashMode)) Supported - , Flag "e" (HasArg (\s -> setMode (doEvalMode s) "-e")) - Supported - - -- -fno-code says to stop after Hsc but don't generate any code. - , Flag "fno-code" (PassFlag (\f -> do setMode (stopBeforeMode HCc) f - addFlag "-fno-code" f - addFlag "-fforce-recomp" f)) + , Flag "e" (SepArg (\s -> setMode (doEvalMode s) "-e")) Supported ] @@ -552,6 +556,11 @@ setMode newMode newFlag = do Nothing -> ((newMode, newFlag), errs) Just (oldMode, oldFlag) -> case (oldMode, newMode) of + -- -c/--make are allowed together, and mean --make -no-link + _ | isStopLnMode oldMode && isDoMakeMode newMode + || isStopLnMode newMode && isDoMakeMode oldMode -> + ((doMakeMode, "--make"), []) + -- If we have both --help and --interactive then we -- want showGhciUsage _ | isShowGhcUsageMode oldMode && @@ -593,7 +602,6 @@ addFlag s flag = do -- Run --make mode doMake :: [(String,Maybe Phase)] -> Ghc () -doMake [] = ghcError (UsageError "no input files") doMake srcs = do let (hs_srcs, non_hs_srcs) = partition haskellish srcs @@ -603,6 +611,15 @@ doMake srcs = do phase `notElem` [As, Cc, CmmCpp, Cmm, StopLn] hsc_env <- GHC.getSession + + -- if we have no haskell sources from which to do a dependency + -- analysis, then just do one-shot compilation and/or linking. + -- This means that "ghc Foo.o Bar.o -o baz" links the program as + -- we expect. + if (null hs_srcs) + then oneShot hsc_env StopLn srcs >> GHC.printWarnings + else do + o_files <- mapM (\x -> do f <- compileFile hsc_env StopLn x GHC.printWarnings @@ -748,7 +765,7 @@ abiHash strs = do mods <- mapM find_it (map fst strs) - let get_iface mod = loadUserInterface False (text "abiHash") mod + let get_iface modl = loadUserInterface False (text "abiHash") modl ifaces <- initIfaceCheck hsc_env $ mapM get_iface mods bh <- openBinMem (3*1024) -- just less than a block