#include "HsVersions.h"
import DriverPipeline ( CompResult(..), preprocess, compile, link )
-import DriverState ( v_Output_file )
+import DriverState ( v_Output_file, v_NoHsMain )
import DriverPhases
import DriverUtil
import Finder
-- clean up after ourselves
cleanTempFilesExcept verb (ppFilesFromSummaries modsDone)
- -- issue a warning for the confusing case where the user said '-o foo'
- -- but we're not going to do any linking.
ofile <- readIORef v_Output_file
- when (ghci_mode == Batch && isJust ofile && not a_root_is_Main
+ no_hs_main <- readIORef v_NoHsMain
+
+ -- Issue a warning for the confusing case where the user
+ -- said '-o foo' but we're not going to do any linking.
+ -- We attempt linking if either (a) one of the modules is
+ -- called Main, or (b) the user said -no-hs-main, indicating
+ -- that main() is going to come from somewhere else.
+ --
+ let do_linking = a_root_is_Main || no_hs_main
+ when (ghci_mode == Batch && isJust ofile && not do_linking
&& verb > 0) $
hPutStrLn stderr "Warning: output was redirected with -o, but no output will be generated\nbecause there is no Main module."
-- link everything together
- linkresult <- link ghci_mode dflags a_root_is_Main hpt3
+ linkresult <- link ghci_mode dflags do_linking hpt3
cmLoadFinish Succeeded linkresult
hpt3 modsDone ghci_mode pcs3
= [ fn | Just fn <- map toPpFile summaries ]
where
toPpFile sum
- | hspp /= ml_hs_file loc = hspp
- | otherwise = Nothing
+ | not (isSameFilePath hspp hs) = hspp
+ | otherwise = Nothing
where
loc = ms_location sum
hspp = ml_hspp_file loc
+ hs = ml_hs_file loc
+
+ -- better make extra sure 'a' and 'b' are in canonical form
+ -- before using this equality test.
+ isSameFilePath a b = fmap normalise a == fmap normalise b
+ -- a hack, because sometimes we strip off the leading "./" from a
+ -- a filename.
+ normalise ('.':'/':f) = f
+ normalise f = f
-----------------------------------------------------------------------------
-- getValidLinkables
= do hspp_fn <- preprocess file
(srcimps,imps,mod_name) <- getImportsFromFile hspp_fn
- let (path, basename, ext) = splitFilename3 file
+ let (basename, ext) = splitFilename file
-- GHC.Prim doesn't exist physically, so don't go looking for it.
the_imps = filter (/= gHC_PRIM_Name) imps
- (mod, location) <- mkHomeModLocation mod_name True{-is a root-}
- path basename ext
+ (mod, location) <- mkHomeModLocation mod_name "." basename ext
src_timestamp
<- case ml_hs_file location of