diff options
author | Ian Lynagh <igloo@earth.li> | 2008-03-23 18:31:15 +0000 |
---|---|---|
committer | Ian Lynagh <igloo@earth.li> | 2008-03-23 18:31:15 +0000 |
commit | 11a293d6dba4ef540d49bef553c6cd705526cc02 (patch) | |
tree | 2aca1df05acdc815b770dc8f632207b30245204d /libraries/ghc-prim/Setup.hs | |
download | haskell-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.hs | 57 |
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 + |