Split the Id related functions out from Var into Id, document Var and some of Id
[ghc-hetmet.git] / compiler / main / SysTools.lhs
index 11e31b8..3c465ed 100644 (file)
@@ -48,7 +48,7 @@ import Util
 import DynFlags
 import FiniteMap
 
-import Control.Exception
+import Exception
 import Data.IORef
 import Control.Monad
 import System.Exit
@@ -74,24 +74,33 @@ import FastString
 import SrcLoc           ( SrcLoc, mkSrcLoc, noSrcSpan, mkSrcSpan )
 \end{code}
 
+How GHC finds its files
+~~~~~~~~~~~~~~~~~~~~~~~
 
-                The configuration story
-                ~~~~~~~~~~~~~~~~~~~~~~~
+[Note topdir]
 
 GHC needs various support files (library packages, RTS etc), plus
-various auxiliary programs (cp, gcc, etc).  It finds these in one
-of two places:
+various auxiliary programs (cp, gcc, etc).  It starts by finding topdir:
 
-* When running as an *installed program*, GHC finds most of this support
-  stuff in the installed library tree.  The path to this tree is passed
-  to GHC via the -B flag, and given to initSysTools .
+     for "installed" topdir is the root of GHC's support files ($libdir)
+     for "in-place"  topdir is the root of the build tree
 
-* When running *in-place* in a build tree, GHC finds most of this support
-  stuff in the build tree.  The path to the build tree is, again passed
-  to GHC via -B.
+On Unix:
+  - ghc always has a shell wrapper that passes a -B<dir> option
+  - in an installation, <dir> is $libdir
+  - in a build tree, <dir> is $TOP/inplace-datadir
+  - so we detect the build-tree case and add ".." to get us back to $TOP
 
-GHC tells which of the two is the case by seeing whether package.conf
-is in TopDir [installed] or in TopDir/ghc/driver [inplace] (what a hack).
+On Windows:
+  - ghc never has a shell wrapper.
+  - we can find the location of the ghc binary, which is
+        $topdir/bin/ghc.exe                   in an installation, or
+        $topdir/ghc/stage1-inplace/ghc.exe    in a build tree.
+  - we detect which one of these we have, and calculate $topdir.
+
+
+from topdir we can find package.conf, which contains the locations of
+almost everything else, whether we're in a build tree or installed.
 
 
 SysTools.initSysProgs figures out exactly where all the auxiliary programs
@@ -154,9 +163,7 @@ initSysTools :: Maybe String    -- Maybe TopDir path (without the '-B' prefix)
 
 initSysTools mbMinusB dflags0
   = do  { (am_installed, top_dir) <- findTopDir mbMinusB
-                -- top_dir
-                --      for "installed" this is the root of GHC's support files
-                --      for "in-place" it is the root of the build tree
+                -- see [Note topdir]
                 -- NB: top_dir is assumed to be in standard Unix
                 -- format, '/' separated
 
@@ -202,7 +209,7 @@ initSysTools mbMinusB dflags0
         -- Check that the package config exists
         ; config_exists <- doesFileExist pkgconfig_path
         ; when (not config_exists) $
-             throwDyn (InstallationError
+             ghcError (InstallationError
                          ("Can't find package.conf as " ++ pkgconfig_path))
 
         -- On Windows, gcc and friends are distributed with GHC,
@@ -298,24 +305,6 @@ initSysTools mbMinusB dflags0
 \end{code}
 
 \begin{code}
--- Find TopDir
---      for "installed" this is the root of GHC's support files
---      for "in-place" it is the root of the build tree
---
--- Plan of action:
--- 1. Set proto_top_dir
---      if there is no given TopDir path, get the directory
---      where GHC is running (only on Windows)
---
--- 2. If package.conf exists in proto_top_dir, we are running
---      installed; and TopDir = proto_top_dir
---
--- 3. Otherwise we are running in-place, so
---      proto_top_dir will be /...stuff.../ghc/compiler
---      Set TopDir to /...stuff..., which is the root of the build tree
---
--- This is very gruesome indeed
-
 findTopDir :: Maybe String   -- Maybe TopDir path (without the '-B' prefix).
            -> IO (Bool,      -- True <=> am installed, False <=> in-place
                   String)    -- TopDir (in Unix format '/' separated)
@@ -341,7 +330,7 @@ findTopDir mbMinusB
                       -> do maybe_exec_dir <- getBaseDir -- Get directory of executable
                             case maybe_exec_dir of       -- (only works on Windows;
                                                          --  returns Nothing on Unix)
-                              Nothing  -> throwDyn (InstallationError "missing -B<dir> option")
+                              Nothing  -> ghcError (InstallationError "missing -B<dir> option")
                               Just dir -> return dir
 \end{code}
 
@@ -688,9 +677,9 @@ runSomethingFiltered dflags filter_fn phase_name pgm args mb_env = do
                  then return (ExitFailure 1, True)
                  else IO.ioError err)
   case (doesn'tExist, exit_code) of
-     (True, _)        -> throwDyn (InstallationError ("could not execute: " ++ pgm))
+     (True, _)        -> ghcError (InstallationError ("could not execute: " ++ pgm))
      (_, ExitSuccess) -> return ()
-     _                -> throwDyn (PhaseFailed phase_name exit_code)
+     _                -> ghcError (PhaseFailed phase_name exit_code)
 
 builderMainLoop :: DynFlags -> (String -> String) -> FilePath
                 -> [String] -> Maybe [(String, String)]
@@ -828,7 +817,7 @@ traceCmd dflags phase_name cmd_line action
   where
     handle_exn _verb exn = do { debugTraceMsg dflags 2 (char '\n')
                               ; debugTraceMsg dflags 2 (ptext (sLit "Failed:") <+> text cmd_line <+> text (show exn))
-                              ; throwDyn (PhaseFailed phase_name (ExitFailure 1)) }
+                              ; ghcError (PhaseFailed phase_name (ExitFailure 1)) }
 \end{code}
 
 %************************************************************************