summaryrefslogtreecommitdiff
path: root/src/Propellor/Bootstrap.hs
diff options
context:
space:
mode:
authorJoey Hess2015-02-28 12:20:03 -0400
committerJoey Hess2015-02-28 12:27:07 -0400
commitdc03e317b40d640e6501be0fce3e32bc29699fbb (patch)
tree4e5b2a7bb2db17c6e962dcbf18f03ada645038f2 /src/Propellor/Bootstrap.hs
parent1a62575d3dc8ce703705de08ccd27b4b034a3388 (diff)
Propellor now builds itself without needing the Makefile.
Diffstat (limited to 'src/Propellor/Bootstrap.hs')
-rw-r--r--src/Propellor/Bootstrap.hs42
1 files changed, 42 insertions, 0 deletions
diff --git a/src/Propellor/Bootstrap.hs b/src/Propellor/Bootstrap.hs
new file mode 100644
index 00000000..7ad4bb1f
--- /dev/null
+++ b/src/Propellor/Bootstrap.hs
@@ -0,0 +1,42 @@
+module Propellor.Bootstrap (
+ buildPropellor
+) where
+
+import Propellor
+import Utility.SafeCommand
+
+import System.Posix.Files
+
+buildPropellor :: IO ()
+buildPropellor = unlessM (actionMessage "Propellor build" build) $
+ errorMessage "Propellor build failed!"
+
+-- Build propellor using cabal, and symlink propellor to where cabal
+-- leaves the built binary.
+--
+-- For speed, only runs cabal configure when it's not been run before.
+-- If the build fails cabal may need to have configure re-run.
+build :: IO Bool
+build = catchBoolIO $ do
+ make "dist/setup-config" ["propellor.cabal"] $
+ cabal ["configure"]
+ unlessM (cabal ["build"]) $ do
+ void $ cabal ["configure"]
+ unlessM (cabal ["build"]) $
+ error "cabal build failed"
+ nukeFile "propellor"
+ createSymbolicLink "dist/build/propellor-config/propellor-config" "propellor"
+ return True
+
+make :: FilePath -> [FilePath] -> IO Bool -> IO ()
+make dest srcs builder = do
+ dt <- getmtime dest
+ st <- mapM getmtime srcs
+ when (dt == Nothing || any (> dt) st) $
+ unlessM builder $
+ error $ "failed to make " ++ dest
+ where
+ getmtime = catchMaybeIO . getModificationTime
+
+cabal :: [String] -> IO Bool
+cabal = boolSystem "cabal" . map Param