diff options
author | Simon Marlow <simonmar@microsoft.com> | 2007-11-20 10:20:42 +0000 |
---|---|---|
committer | Simon Marlow <simonmar@microsoft.com> | 2007-11-20 10:20:42 +0000 |
commit | 530c5c77a9fb6f8464c53b766f1bff3907f6b46a (patch) | |
tree | 0dad93895b21cdf03e7a452bce68e99dc0277233 /libraries/base/Setup.hs | |
parent | df97527119689d11d8f21617bd2d921694929ffe (diff) | |
download | haskell-530c5c77a9fb6f8464c53b766f1bff3907f6b46a.tar.gz |
Only overwrite GHC/Prim.hs and GHC/Primopwrappers.hs if they change
This avoids make doing unnecessary work after 'setup makefile'.
Diffstat (limited to 'libraries/base/Setup.hs')
-rw-r--r-- | libraries/base/Setup.hs | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/libraries/base/Setup.hs b/libraries/base/Setup.hs index 79c60e9024..40033bdcd0 100644 --- a/libraries/base/Setup.hs +++ b/libraries/base/Setup.hs @@ -13,6 +13,8 @@ import Distribution.Simple.LocalBuildInfo import Distribution.Simple.Utils import System.Cmd import System.FilePath +import System.Exit +import System.Directory main :: IO () main = do let hooks = defaultUserHooks { @@ -40,12 +42,26 @@ build_primitive_sources f pd lbi uhs x "primops.txt"] primhs = joinPath ["GHC", "Prim.hs"] primopwrappers = joinPath ["GHC", "PrimopWrappers.hs"] + primhs_tmp = addExtension primhs "tmp" + primopwrappers_tmp = addExtension primopwrappers "tmp" maybeExit $ system (genprimopcode ++ " --make-haskell-source < " - ++ primops ++ " > " ++ primhs) + ++ primops ++ " > " ++ primhs_tmp) + maybeUpdateFile primhs_tmp primhs maybeExit $ system (genprimopcode ++ " --make-haskell-wrappers < " - ++ primops ++ " > " ++ primopwrappers) + ++ primops ++ " > " ++ primopwrappers_tmp) + maybeUpdateFile primopwrappers_tmp primopwrappers f pd lbi uhs x +-- Replace a file only if the new version is different from the old. +-- This prevents make from doing unnecessary work after we run 'setup makefile' +maybeUpdateFile :: FilePath -> FilePath -> IO () +maybeUpdateFile source target = do + r <- rawSystem "cmp" ["-s" {-quiet-}, source, target] + case r of + ExitSuccess -> return () + ExitFailure _ -> copyFile source target + removeFile source + filter_modules_hook :: Hook a -> Hook a filter_modules_hook f pd lbi uhs x = let lib' = case library pd of |