Propellor now builds itself without needing the Makefile.

This commit is contained in:
Joey Hess 2015-02-28 12:20:03 -04:00
parent 1a62575d3d
commit dc03e317b4
6 changed files with 78 additions and 32 deletions

View File

@ -9,18 +9,10 @@ run: deps build
dev: build tags
build: dist/setup-config
@if ! $(CABAL) build; then $(CABAL) configure; $(CABAL) build; fi
@ln -sf dist/build/propellor-config/propellor-config propellor
deps:
@if [ $$(whoami) = root ]; then apt-get --no-upgrade --no-install-recommends -y install $(DEBDEPS) || (apt-get update && apt-get --no-upgrade --no-install-recommends -y install $(DEBDEPS)); fi || true
@if [ $$(whoami) = root ]; then apt-get --no-upgrade --no-install-recommends -y install libghc-async-dev || (cabal update; cabal install async); fi || true
dist/setup-config: propellor.cabal
@if [ "$(CABAL)" = ./Setup ]; then ghc --make Setup; fi
@$(CABAL) configure
install: propellor.1
install -d $(DESTDIR)/usr/bin $(DESTDIR)/usr/src/propellor
install -s dist/build/propellor/propellor $(DESTDIR)/usr/bin/propellor
@ -56,3 +48,14 @@ hackage:
@cabal upload dist/*.tar.gz
.PHONY: tags
# The rules below are only used when bootstrapping new propellor
# installations; propellor contains equivilant haksell code.
build: dist/setup-config
@if ! $(CABAL) build; then $(CABAL) configure; $(CABAL) build; fi
@ln -sf dist/build/propellor-config/propellor-config propellor
dist/setup-config: propellor.cabal
@if [ "$(CABAL)" = ./Setup ]; then ghc --make Setup; fi
@$(CABAL) configure

1
debian/changelog vendored
View File

@ -4,6 +4,7 @@ propellor (2.2.0) UNRELEASED; urgency=medium
improve process name visible in ps.
* Add shebang to cron.daily etc files.
* Some changes to tor configuration, minor API change.
* Propellor now builds itself without needing the Makefile.
-- Joey Hess <id@joeyh.name> Mon, 16 Feb 2015 19:00:48 -0400

View File

@ -128,6 +128,7 @@ Library
Propellor.Types.Result
Propellor.Types.CmdLine
Other-Modules:
Propellor.Bootstrap
Propellor.Git
Propellor.Gpg
Propellor.Spin

View File

@ -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

View File

@ -12,6 +12,7 @@ import qualified Network.BSD
import Propellor
import Propellor.Gpg
import Propellor.Git
import Propellor.Bootstrap
import Propellor.Spin
import Propellor.Types.CmdLine
import qualified Propellor.Property.Docker as Docker
@ -31,6 +32,7 @@ usage h = hPutStrLn h $ unlines
, " propellor --edit field context"
, " propellor --list-fields"
, " propellor --merge"
, " propellor --build"
]
usageError :: [String] -> IO a
@ -128,19 +130,16 @@ unknownhost h hosts = errorMessage $ unlines
]
buildFirst :: CmdLine -> IO () -> IO ()
buildFirst cmdline next = ifM (doesFileExist "Makefile")
( do
oldtime <- getmtime
ifM (actionMessage "Propellor build" $ boolSystem "make" [Param "build"])
( do
newtime <- getmtime
if newtime == oldtime
then next
else void $ boolSystem "./propellor" [Param "--continue", Param (show cmdline)]
, errorMessage "Propellor build failed!"
)
, next
)
buildFirst cmdline next = do
oldtime <- getmtime
buildPropellor
newtime <- getmtime
if newtime == oldtime
then next
else void $ boolSystem "./propellor"
[ Param "--continue"
, Param (show cmdline)
]
where
getmtime = catchMaybeIO $ getModificationTime "propellor"
@ -155,10 +154,12 @@ updateFirst cmdline next = ifM hasOrigin (updateFirst' cmdline next, next)
updateFirst' :: CmdLine -> IO () -> IO ()
updateFirst' cmdline next = ifM fetchOrigin
( ifM (actionMessage "Propellor build" $ boolSystem "make" [Param "build"])
( void $ boolSystem "./propellor" [Param "--continue", Param (show cmdline)]
, errorMessage "Propellor build failed!"
)
( do
buildPropellor
void $ boolSystem "./propellor"
[ Param "--continue"
, Param (show cmdline)
]
, next
)

View File

@ -15,6 +15,7 @@
module Main where
import Propellor.Message
import Propellor.Bootstrap
import Utility.UserInfo
import Utility.Monad
import Utility.Process
@ -91,13 +92,10 @@ wrapper args propellordir propellorbin = do
warnoutofdate propellordir True
buildruncfg = do
changeWorkingDirectory propellordir
ifM (boolSystem "make" [Param "build"])
( do
putStrLn ""
putStrLn ""
chain
, error "Propellor build failed."
)
buildPropellor
putStrLn ""
putStrLn ""
chain
chain = do
(_, _, _, pid) <- createProcess (proc propellorbin args)
exitWith =<< waitForProcess pid