import Distribution.Simple.Utils
import System.Cmd
import System.FilePath
+import System.Exit
+import System.Directory
main :: IO ()
main = do let hooks = defaultUserHooks {
"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