avoid using the makefile when bootstrapping with --spin

This commit is contained in:
Joey Hess 2015-02-28 12:50:28 -04:00
parent dc03e317b4
commit e26c232d15
4 changed files with 62 additions and 14 deletions

View File

@ -1,18 +1,12 @@
CABAL?=cabal CABAL?=cabal
DEBDEPS=gnupg ghc cabal-install libghc-missingh-dev libghc-ansi-terminal-dev libghc-ifelse-dev libghc-unix-compat-dev libghc-hslogger-dev libghc-network-dev libghc-quickcheck2-dev libghc-mtl-dev libghc-monadcatchio-transformers-dev # this target is provided (and is first) to keep old versions of the
# propellor cron job working, and will eventually be removed
# this target is provided to keep old versions of the propellor cron job run: build
# working, and will eventually be removed
run: deps build
./propellor ./propellor
dev: build tags dev: build tags
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
install: propellor.1 install: propellor.1
install -d $(DESTDIR)/usr/bin $(DESTDIR)/usr/src/propellor install -d $(DESTDIR)/usr/bin $(DESTDIR)/usr/src/propellor
install -s dist/build/propellor/propellor $(DESTDIR)/usr/bin/propellor install -s dist/build/propellor/propellor $(DESTDIR)/usr/bin/propellor
@ -50,7 +44,8 @@ hackage:
.PHONY: tags .PHONY: tags
# The rules below are only used when bootstrapping new propellor # The rules below are only used when bootstrapping new propellor
# installations; propellor contains equivilant haksell code. # installations and building packages; propellor contains equivilant
# haskell code that it uses to re-build itself.
build: dist/setup-config build: dist/setup-config
@if ! $(CABAL) build; then $(CABAL) configure; $(CABAL) build; fi @if ! $(CABAL) build; then $(CABAL) configure; $(CABAL) build; fi

3
debian/changelog vendored
View File

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

View File

@ -1,11 +1,62 @@
module Propellor.Bootstrap ( module Propellor.Bootstrap (
buildPropellor bootstrapPropellorCommand,
installGitCommand,
buildPropellor,
) where ) where
import Propellor import Propellor
import Utility.SafeCommand import Utility.SafeCommand
import System.Posix.Files import System.Posix.Files
import Data.List
type ShellCommand = String
-- Shell command line to build propellor, used when bootstrapping on a new
-- host. Should be run inside the propellor source tree, and will install
-- all necessary build dependencies.
bootstrapPropellorCommand :: ShellCommand
bootstrapPropellorCommand = "if ! test -x ./propellor; then " ++ go ++ "; fi"
where
go = intercalate " && "
[ depsCommand
, buildCommand
]
buildCommand :: ShellCommand
buildCommand = intercalate " && "
[ "cabal configure"
, "cabal build"
, "ln -sf dist/build/propellor-config/propellor-config propellor"
]
depsCommand :: ShellCommand
depsCommand = "(" ++ aptinstall debdeps ++ " || (apt-get update && " ++ aptinstall debdeps ++ ")) || true;"
++ "(" ++ aptinstall ["libghc-async-dev"] ++ " || (cabal update; cabal install async)) || true"
where
aptinstall ps = "apt-get --no-upgrade --no-install-recommends -y install " ++ unwords ps
-- This is the same build deps listed in debian/control.
debdeps =
[ "gnupg"
, "ghc"
, "cabal-install"
-- async is not available in debian stable
-- , "libghc-async-dev"
, "libghc-missingh-dev"
, "libghc-hslogger-dev"
, "libghc-unix-compat-dev"
, "libghc-ansi-terminal-dev"
, "libghc-ifelse-dev"
, "libghc-network-dev"
, "libghc-quickcheck2-dev"
, "libghc-mtl-dev"
, "libghc-monadcatchio-transformers-dev"
]
installGitCommand :: ShellCommand
installGitCommand = "if ! git --version >/dev/null; then apt-get update && apt-get --no-install-recommends --no-upgrade -y install git; fi"
buildPropellor :: IO () buildPropellor :: IO ()
buildPropellor = unlessM (actionMessage "Propellor build" build) $ buildPropellor = unlessM (actionMessage "Propellor build" build) $

View File

@ -24,6 +24,7 @@ import Propellor.PrivData.Paths
import Propellor.Git import Propellor.Git
import Propellor.Ssh import Propellor.Ssh
import Propellor.Gpg import Propellor.Gpg
import Propellor.Bootstrap
import Propellor.Types.CmdLine import Propellor.Types.CmdLine
import qualified Propellor.Shim as Shim import qualified Propellor.Shim as Shim
import Utility.FileMode import Utility.FileMode
@ -69,7 +70,7 @@ spin target relay hst = do
probecmd = intercalate " ; " probecmd = intercalate " ; "
[ "if [ ! -d " ++ localdir ++ "/.git ]" [ "if [ ! -d " ++ localdir ++ "/.git ]"
, "then (" ++ intercalate " && " , "then (" ++ intercalate " && "
[ "if ! git --version || ! make --version; then apt-get update && apt-get --no-install-recommends --no-upgrade -y install git make; fi" [ installGitCommand
, "echo " ++ toMarked statusMarker (show NeedGitClone) , "echo " ++ toMarked statusMarker (show NeedGitClone)
] ++ ") || echo " ++ toMarked statusMarker (show NeedPrecompiled) ] ++ ") || echo " ++ toMarked statusMarker (show NeedPrecompiled)
, "else " ++ updatecmd , "else " ++ updatecmd
@ -78,7 +79,7 @@ spin target relay hst = do
updatecmd = intercalate " && " updatecmd = intercalate " && "
[ "cd " ++ localdir [ "cd " ++ localdir
, "if ! test -x ./propellor; then make deps build; fi" , bootstrapPropellorCommand
, if viarelay , if viarelay
then "./propellor --continue " ++ then "./propellor --continue " ++
shellEscape (show (Relay target)) shellEscape (show (Relay target))