summaryrefslogtreecommitdiff
path: root/libraries/base/Setup.hs
diff options
context:
space:
mode:
authorSimon Marlow <simonmar@microsoft.com>2007-11-20 10:20:42 +0000
committerSimon Marlow <simonmar@microsoft.com>2007-11-20 10:20:42 +0000
commit530c5c77a9fb6f8464c53b766f1bff3907f6b46a (patch)
tree0dad93895b21cdf03e7a452bce68e99dc0277233 /libraries/base/Setup.hs
parentdf97527119689d11d8f21617bd2d921694929ffe (diff)
downloadhaskell-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.hs20
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