diff options
Diffstat (limited to 'compiler')
-rw-r--r-- | compiler/main/DriverMkDepend.hs | 15 | ||||
-rw-r--r-- | compiler/main/DynFlags.hs | 7 |
2 files changed, 21 insertions, 1 deletions
diff --git a/compiler/main/DriverMkDepend.hs b/compiler/main/DriverMkDepend.hs index 741104596a..6368d8c785 100644 --- a/compiler/main/DriverMkDepend.hs +++ b/compiler/main/DriverMkDepend.hs @@ -41,6 +41,7 @@ import System.IO import System.IO.Error ( isEOFError ) import Control.Monad ( when ) import Data.Maybe ( isJust ) +import Data.IORef ----------------------------------------------------------------- -- @@ -85,7 +86,7 @@ doMkDependHS srcs = do -- Print out the dependencies if wanted liftIO $ debugTraceMsg dflags 2 (text "Module dependencies" $$ ppr sorted) - -- Prcess them one by one, dumping results into makefile + -- Process them one by one, dumping results into makefile -- and complaining about cycles hsc_env <- getSession root <- liftIO getCurrentDirectory @@ -224,6 +225,18 @@ processDeps dflags hsc_env excl_mods root hdl (AcyclicSCC node) -- Something like A.o : A.hs ; writeDependency root hdl obj_files src_file + -- Emit a dependency for each CPP import + ; when (depIncludeCppDeps dflags) $ do + -- CPP deps are descovered in the module parsing phase by parsing + -- comment lines left by the preprocessor. + -- Note that GHC.parseModule may throw an exception if the module + -- fails to parse, which may not be desirable (see #16616). + { session <- Session <$> newIORef hsc_env + ; parsedMod <- reflectGhc (GHC.parseModule node) session + ; mapM_ (writeDependency root hdl obj_files) + (GHC.pm_extra_src_files parsedMod) + } + -- Emit a dependency for each import ; let do_imps is_boot idecls = sequence_ diff --git a/compiler/main/DynFlags.hs b/compiler/main/DynFlags.hs index e94798aede..15f254ad7c 100644 --- a/compiler/main/DynFlags.hs +++ b/compiler/main/DynFlags.hs @@ -1022,6 +1022,7 @@ data DynFlags = DynFlags { -- For ghc -M depMakefile :: FilePath, depIncludePkgDeps :: Bool, + depIncludeCppDeps :: Bool, depExcludeMods :: [ModuleName], depSuffixes :: [String], @@ -2010,6 +2011,7 @@ defaultDynFlags mySettings (myLlvmTargets, myLlvmPasses) = -- ghc -M values depMakefile = "Makefile", depIncludePkgDeps = False, + depIncludeCppDeps = False, depExcludeMods = [], depSuffixes = [], -- end of ghc -M values @@ -2684,6 +2686,9 @@ addOptP f = alterSettings (\s -> s { sOpt_P = f : sOpt_P s setDepMakefile :: FilePath -> DynFlags -> DynFlags setDepMakefile f d = d { depMakefile = f } +setDepIncludeCppDeps :: Bool -> DynFlags -> DynFlags +setDepIncludeCppDeps b d = d { depIncludeCppDeps = b } + setDepIncludePkgDeps :: Bool -> DynFlags -> DynFlags setDepIncludePkgDeps b d = d { depIncludePkgDeps = b } @@ -3100,6 +3105,8 @@ dynamic_flags_deps = [ -------- ghc -M ----------------------------------------------------- , make_ord_flag defGhcFlag "dep-suffix" (hasArg addDepSuffix) , make_ord_flag defGhcFlag "dep-makefile" (hasArg setDepMakefile) + , make_ord_flag defGhcFlag "include-cpp-deps" + (noArg (setDepIncludeCppDeps True)) , make_ord_flag defGhcFlag "include-pkg-deps" (noArg (setDepIncludePkgDeps True)) , make_ord_flag defGhcFlag "exclude-module" (hasArg addDepExcludeMod) |