[project @ 2001-01-21 16:37:06 by sewardj]
[ghc-hetmet.git] / ghc / compiler / main / TmpFiles.hs
1 -----------------------------------------------------------------------------
2 -- $Id: TmpFiles.hs,v 1.14 2000/12/11 15:26:00 sewardj Exp $
3 --
4 -- Temporary file management
5 --
6 -- (c) The University of Glasgow 2000
7 --
8 -----------------------------------------------------------------------------
9
10 module TmpFiles (
11    Suffix,
12    initTempFileStorage,  -- :: IO ()
13    cleanTempFiles,       -- :: IO ()
14    newTempName,          -- :: Suffix -> IO FilePath
15    addFilesToClean,      -- :: [FilePath] -> IO ()
16    v_TmpDir
17  ) where
18
19 -- main
20 import Config
21 import Util
22 import DriverUtil
23
24 -- hslibs
25 import Exception
26 import IOExts
27
28 -- std
29 import System
30 import Directory
31 import IO
32 import Monad
33
34 #include "HsVersions.h"
35
36 GLOBAL_VAR(v_FilesToClean, [],               [String] )
37 GLOBAL_VAR(v_TmpDir,       cDEFAULT_TMPDIR,  String   )
38
39
40 initTempFileStorage = do
41         -- check whether TMPDIR is set in the environment
42    IO.try (do dir <- getEnv "TMPDIR" -- fails if not set
43 #ifndef mingw32_TARGET_OS
44               writeIORef v_TmpDir dir
45 #endif
46               return ()
47           )
48
49 cleanTempFiles :: Bool -> IO ()
50 cleanTempFiles verbose = do
51   fs <- readIORef v_FilesToClean
52
53   let blowAway f =
54            (do  when verbose (hPutStrLn stderr ("Removing: " ++ f))
55                 if '*' `elem` f then kludgedSystem ("rm -f " ++ f) "Cleaning temp files" >> return ()
56                                 else removeFile f)
57             `catchAllIO`
58            (\_ -> when verbose (hPutStrLn stderr 
59                                 ("Warning: can't remove tmp file " ++ f)))
60   mapM_ blowAway fs
61
62 type Suffix = String
63
64 -- find a temporary name that doesn't already exist.
65 newTempName :: Suffix -> IO FilePath
66 newTempName extn = do
67   x <- myGetProcessID
68   tmp_dir <- readIORef v_TmpDir
69   findTempName tmp_dir x
70   where findTempName tmp_dir x = do
71            let filename = tmp_dir ++ "/ghc" ++ show x ++ '.':extn
72            b  <- doesFileExist filename
73            if b then findTempName tmp_dir (x+1)
74                 else do add v_FilesToClean filename -- clean it up later
75                         return filename
76
77 addFilesToClean :: [FilePath] -> IO ()
78 addFilesToClean files = mapM_ (add v_FilesToClean) files