summaryrefslogtreecommitdiff
path: root/libraries/ghc-prim/Setup.hs
diff options
context:
space:
mode:
authorIan Lynagh <igloo@earth.li>2008-03-23 18:31:15 +0000
committerIan Lynagh <igloo@earth.li>2008-03-23 18:31:15 +0000
commit11a293d6dba4ef540d49bef553c6cd705526cc02 (patch)
tree2aca1df05acdc815b770dc8f632207b30245204d /libraries/ghc-prim/Setup.hs
downloadhaskell-11a293d6dba4ef540d49bef553c6cd705526cc02.tar.gz
Initial commit; code copied from the base package
Diffstat (limited to 'libraries/ghc-prim/Setup.hs')
-rw-r--r--libraries/ghc-prim/Setup.hs57
1 files changed, 57 insertions, 0 deletions
diff --git a/libraries/ghc-prim/Setup.hs b/libraries/ghc-prim/Setup.hs
new file mode 100644
index 0000000000..d6836e4393
--- /dev/null
+++ b/libraries/ghc-prim/Setup.hs
@@ -0,0 +1,57 @@
+
+-- We need to do some ugly hacks here because of GHC magic
+
+module Main (main) where
+
+import Control.Monad
+import Data.List
+import Distribution.PackageDescription
+import Distribution.Simple
+import Distribution.Simple.LocalBuildInfo
+import Distribution.Simple.Utils
+import System.Cmd
+import System.FilePath
+import System.Exit
+import System.Directory
+import Control.Exception (try)
+
+main :: IO ()
+main = do let hooks = defaultUserHooks {
+ buildHook = build_primitive_sources
+ $ buildHook defaultUserHooks,
+ makefileHook = build_primitive_sources
+ $ makefileHook defaultUserHooks,
+ haddockHook = build_primitive_sources
+ $ haddockHook defaultUserHooks }
+ defaultMainWithHooks hooks
+
+type Hook a = PackageDescription -> LocalBuildInfo -> UserHooks -> a -> IO ()
+
+build_primitive_sources :: Hook a -> Hook a
+build_primitive_sources f pd lbi uhs x
+ = do when (compilerFlavor (compiler lbi) == GHC) $ do
+ let genprimopcode = joinPath ["..", "..", "utils",
+ "genprimopcode", "genprimopcode"]
+ primops = joinPath ["..", "..", "compiler", "prelude",
+ "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_tmp)
+ maybeUpdateFile primhs_tmp primhs
+ maybeExit $ system (genprimopcode ++ " --make-haskell-wrappers < "
+ ++ 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 -> removeFile source
+ ExitFailure _ -> do try (removeFile target); renameFile source target
+