distclean to wipe BUILDROOT
[build.git] / Makefile
index b405fac..cea39aa 100644 (file)
--- a/Makefile
+++ b/Makefile
 #     a set of *packages* that this package depends on
 # (*) package-DEPEND-DEVEL-RPMS
 #     a set of *rpms* that the build will rpm-install before building <package>
+#     the build will attempt to uninstall those once the package is built, this is not fatal though
+#     this is intended to denote local rpms, i.e. ones that are results of our own build
+#     stock rpms should be mentioned in config.planetlab/devel.pkgs
 # (*) package-DEPEND-FILES
 #     a set of files that the package depends on - and that make needs to know about
 #     if this contains RPMS/yumgroups.xml, then the toplevel RPMS's index 
 #     is refreshed with createrepo prior to running rpmbuild
+# (*) package-EXCLUDE-DEVEL-RPMS
+#     a set of *rpms* that the build will rpm-uninstall before building <package>
+#     this is intended to denote stock rpms, and the build will attempt to yum-install them
+#     back after the package is rebuilt
 # (*) package-RPMFLAGS: Miscellaneous RPM flags
 # (*) package-RPMBUILD: If not rpmbuild - mostly used for sudo'ing rpmbuild
 # (*) package-BUILD-FROM-SRPM: set this to any non-empty value, if your package is able to produce 
@@ -92,7 +99,7 @@
 ####################
 
 # exported to spec files as plrelease
-PLANETLAB_RELEASE = 4.2
+PLANETLAB_RELEASE = 4.3
 
 #
 # Default values
@@ -103,8 +110,13 @@ DISTRO := $(shell ./getdistro.sh)
 RELEASE := $(shell ./getrelease.sh)
 DISTRONAME := $(shell ./getdistroname.sh)
 RPM-INSTALL-DEVEL := rpm --force -Uvh
-# cannot force rpm -e
+# uninstall -- cannot force rpm -e
+# need to ignore result, kernel-headers cannot be uninstalled as glibc depends on it
 RPM-UNINSTALL-DEVEL := rpm -e
+YUM-INSTALL-DEVEL := yum -y install
+
+# see also below
+REMOTE-PLDISTROS="wextoolbox"
 
 #################### Makefile
 # Default target
@@ -116,9 +128,15 @@ PLDISTRO := planetlab
 RPMBUILD := rpmbuild
 export CVS_RSH := ssh
 
-########## pldistro.mk holds PLDISTRO - it is generated at stage1 (see below)
+########## savedpldistro.mk holds PLDISTRO - it is generated at stage1 (see below)
 ifeq "$(stage1)" ""
-include pldistro.mk
+include savedpldistro.mk
+endif
+
+# when re-running the nightly build after failure, we need to gather the former values
+# do this by running make stage1=skip +PLDISTRO
+ifeq "$(stage1)" "skip"
+include savedpldistro.mk
 endif
 
 #################### include onelab.mk
@@ -145,6 +163,31 @@ endif
 # use default if necessary
 build-SVNPATH ?= $(default-build-SVNPATH)
 
+####################
+define remote_pldistro
+$(1).mk: config.$(1)/$(1).mk
+       @echo 'creating $(1) from config subdir'
+       cp config.$(1)/$(1).mk $(1).mk
+
+$(2).mk: config.$(1)/$(2).mk
+       @echo 'creating $(1) tags from config subdir'
+       cp config.$(1)/$(2).mk $(2).mk
+
+config.$(1)/$(1).mk: config.$(1)
+config.$(1)/$(2).mk: config.$(1)
+
+config.$(1): config.$(1).svnpath
+       @echo "Fetching details for pldistro $(1)"
+       svn export $(shell grep -v "^#" config.$(1).svnpath) config.$(1)
+
+DISTCLEANS += $(1).mk $(2).mk config.$(1)
+
+endef
+
+# somehow this does not work, handle manually instead
+#$(foreach distro, $(REMOTE-PLDISTROS), $(eval $(call remote_pldistro,$(distro),$(distro)-tags)))
+$(eval $(call remote_pldistro,wextoolbox,wextoolbox-tags))
+
 ########## stage1 and stage1iter
 # extract specs and compute .mk files by running 
 # make stage1=true
@@ -222,14 +265,27 @@ repo: RPMS/yumgroups.xml
 # $(package)-SPEC - otherwise the cvs modules have to define spec as 
 # <module>/<module>.spec while svn modules just define it as <module>.spec
 #
-define stage1_variables
-$(1).spec = $(notdir $($(1)-SPEC))
-$(1).specpath = SPECS/$(1).spec
-$(1).module = $(firstword $($(1)-MODULES))
-$(1)-SVNPATH = $(strip $($(1)-SVNPATH))
+define stage1_package_vars
+$(1).spec := $(notdir $($(1)-SPEC))
+$(1).specpath := SPECS/$(1).spec
+$(1).module := $(firstword $($(1)-MODULES))
+endef
+
+$(foreach package, $(ALL), $(eval $(call stage1_package_vars,$(package))))
+
+# compute all modules
+ALL-MODULES :=
+$(foreach package,$(ALL), $(eval ALL-MODULES+=$($(package)-MODULES)))
+ALL-MODULES:=$(sort $(ALL-MODULES))
+
+# extract revision from -SVNPATH
+define stage1_module_vars
+$(1)-SVNPATH := $(strip $($(1)-SVNPATH))
+$(1).svnpath := $(firstword $(subst @, ,$($(1)-SVNPATH)))
+$(1).svnrev := $(word 2,$(subst @, @,$($(1)-SVNPATH)))
 endef
 
-$(foreach package, $(ALL), $(eval $(call stage1_variables,$(package))))
+$(foreach module,$(ALL-MODULES), $(eval $(call stage1_module_vars,$(module))))
 
 #
 # for each package, compute whether we need to set date 
@@ -268,7 +324,7 @@ $($(1).specpath): header.spec
            echo "%define" $(word 1,$(subst =, ,$(line))) "$(word 2,$(subst =, ,$(line)))" >> $($(1).specpath) ;))
        echo "# included from $($(1)-SPEC)" >> $($(1).specpath)
        $(if $($($(1).module)-SVNPATH),\
-          svn cat $($($(1).module)-SVNPATH)/$($(1)-SPEC) >> $($(1).specpath) || rm $($(1).specpath),\
+          svn cat $($($(1).module).svnpath)/$($(1)-SPEC)$($($(1).module).svnrev) >> $($(1).specpath) || rm $($(1).specpath),\
           cvs -d $($($(1).module)-CVSROOT) checkout \
              -r $($($(1).module)-TAG) \
              -p $($(1).module)/$($(1)-SPEC) >> $($(1).specpath))
@@ -296,6 +352,7 @@ endif
        rm -f $@ 
        echo "%_topdir $(HOME)" >> $@
        echo "%_tmppath $(HOME)/tmp" >> $@
+       echo "%__spec_install_pre %{___build_pre}" >> $@
        ./getrpmmacros.sh >> $@
 
 ### this utility allows to extract various info from a spec file
@@ -308,22 +365,29 @@ spec2make: spec2make.c
 define target_mk
 MAKE/$(1).mk: $($(1).specpath) spec2make .rpmmacros
        mkdir -p MAKE
-       ./spec2make $($(1)-RPMFLAGS) $($(1).specpath) $(1) > MAKE/$(1).mk || rm MAKE/$(1).mk
+       ./spec2make $($(1)-RPMFLAGS) $($(1).specpath) $(1) > MAKE/$(1).mk || { rm MAKE/$(1).mk; exit 1; }
 endef
 
 $(foreach package,$(ALL),$(eval $(call target_mk,$(package))))
 
 # stores PLDISTRO in a file
 # this is done at stage1. later run wont get confused
-pldistro.mk:
+savedpldistro.mk:
        echo "PLDISTRO:=$(PLDISTRO)" > $@
        echo "PLDISTROTAGS:=$(PLDISTROTAGS)" >> $@
+       echo "build-SVNPATH:=$(build-SVNPATH)" >> $@
+       echo "PERSONALITY:=$(PERSONALITY)" >> $@
+       echo "MAILTO:=$(MAILTO)" >> $@
+       echo "BASE:=$(BASE)" >> $@
+       echo "WEBPATH:=$(WEBPATH)" >> $@
+       echo "TESTBUILDURL:=$(TESTBUILDURL)" >> $@
+       echo "WEBROOT:=$(WEBROOT)" >> $@
 
-savepldistro: pldistro.mk
-.PHONY: savepldistro
+savedpldistro: savedpldistro.mk
+.PHONY: savedpldistro
 
 # always refresh this
-all: savepldistro
+all: savedpldistro
 
 #################### regular make
 
@@ -415,26 +479,37 @@ srpms: $(ALLSRPMS)
        @echo $(words $(ALLSRPMS)) source rpms OK
 .PHONY: srpms
 
+### these macro handles the DEPEND-DEVEL-RPMS and EXCLUDE-DEVEL-RPMS tags for a hiven package
+# before building : rpm-install DEPEND-DEVEL-RPMS and rpm-uninstall EXCLUDE
+define handle_devel_rpms_pre 
+       $(if $($(1).all-devel-rpm-paths), echo "Installing for $(1)-DEPEND-DEVEL-RPMS" ; $(RPM-INSTALL-DEVEL) $($(1).all-devel-rpm-paths)) 
+       $(if $($(1)-EXCLUDE-DEVEL-RPMS), echo "Uninstalling for $(1)-EXCLUDE-DEVEL-RPMS" ; $(RPM-UNINSTALL-DEVEL) $($(1)-EXCLUDE-DEVEL-RPMS))
+endef
+
+define handle_devel_rpms_post
+       -$(if $($(1)-DEPEND-DEVEL-RPMS), echo "Unstalling for $(1)-DEPEND-DEVEL-RPMS" ; $(RPM-UNINSTALL-DEVEL) $($(1)-DEPEND-DEVEL-RPMS))
+       $(if $($(1)-EXCLUDE-DEVEL-RPMS), "Reinstalling for $(1)-EXCLUDE-DEVEL-RPMS" ; $(YUM-INSTALL-DEVEL) $($(1)-EXCLUDE-DEVEL-RPMS) )
+endef
+
 # usage: target_source_rpm package
-# select upon the package name, whether it contains srpm or not
 define target_source_rpm 
 ifeq "$($(1)-BUILD-FROM-SRPM)" ""
 $($(1).srpm): $($(1).specpath) .rpmmacros $($(1).tarballs) 
        mkdir -p BUILD SRPMS tmp
        @(echo -n "XXXXXXXXXXXXXXX -- BEG SRPM $(1) (using SOURCES) " ; date)
-       $(if $($(1).all-devel-rpm-paths), $(RPM-INSTALL-DEVEL) $($(1).all-devel-rpm-paths))
+       $(call handle_devel_rpms_pre,$(1))
        $($(1).rpmbuild) -bs $($(1).specpath)
-       $(if $($(1)-DEPEND-DEVEL-RPMS), $(RPM-UNINSTALL-DEVEL) $($(1)-DEPEND-DEVEL-RPMS))
+       $(call handle_devel_rpms_post,$(1))
        @(echo -n "XXXXXXXXXXXXXXX -- END SRPM $(1) " ; date)
 else
 $($(1).srpm): $($(1).specpath) .rpmmacros $($(1).codebase)
        mkdir -p BUILD SRPMS tmp
        @(echo -n "XXXXXXXXXXXXXXX -- BEG SRPM $(1) (using make srpm) " ; date)
-       $(if $($(1).all-devel-rpm-paths), $(RPM-INSTALL-DEVEL) $($(1).all-devel-rpm-paths))
-       make -C $($(1).codebase) srpm SPECFILE=$(HOME)/$($(1).specpath) && \
+       $(call handle_devel_rpms_pre,$(1))
+       make -C $($(1).codebase) srpm SPECFILE=$(HOME)/$($(1).specpath) EXPECTED_SRPM=$(notdir $($(1).srpm)) && \
            rm -f SRPMS/$(notdir $($(1).srpm)) && \
            ln $($(1).codebase)/$(notdir $($(1).srpm)) SRPMS/$(notdir $($(1).srpm)) 
-       $(if $($(1)-DEPEND-DEVEL-RPMS), $(RPM-UNINSTALL-DEVEL) $($(1)-DEPEND-DEVEL-RPMS))
+       $(call handle_devel_rpms_post,$(1))
        @(echo -n "XXXXXXXXXXXXXXX -- END SRPM $(1) " ; date)
 endif
 endef
@@ -460,18 +535,18 @@ $($(1).rpms): $($(1).srpm)
        mkdir -p RPMS tmp
        @(echo -n "XXXXXXXXXXXXXXX -- BEG RPM $(1) " ; date)
        $(if $(findstring RPMS/yumgroups.xml,$($(1)-DEPEND-FILES)), $(createrepo) , )
-       $(if $($(1).all-devel-rpm-paths), $(RPM-INSTALL-DEVEL) $($(1).all-devel-rpm-paths))
+       $(call handle_devel_rpms_pre,$(1))
        $($(1).rpmbuild) --rebuild $(RPM-USE-TMP-DIRS) $($(1).srpm)
-       $(if $($(1)-DEPEND-DEVEL-RPMS), $(RPM-UNINSTALL-DEVEL) $($(1)-DEPEND-DEVEL-RPMS))
+       $(call handle_devel_rpms_post,$(1))
        @(echo -n "XXXXXXXXXXXXXXX -- END RPM $(1) " ; date)
 # for manual use only - in case we need to investigate the results of an rpmbuild
 $(1)-compile: $($(1).srpm)
        mkdir -p COMPILE tmp
        @(echo -n "XXXXXXXXXXXXXXX -- BEG compile $(1) " ; date)
        $(if $(findstring RPMS/yumgroups.xml,$($(1)-DEPEND-FILES)), $(createrepo) , )
-       $(if $($(1).all-devel-rpm-paths), $(RPM-INSTALL-DEVEL) $($(1).all-devel-rpm-paths))
+       $(call handle_devel_rpms_pre,$(1))
        $($(1).rpmbuild) --recompile $(RPM-USE-TMP-DIRS) $($(1).srpm)
-       $(if $($(1)-DEPEND-DEVEL-RPMS), $(RPM-UNINSTALL-DEVEL) $($(1)-DEPEND-DEVEL-RPMS))
+       $(call handle_devel_rpms_post,$(1))
        @(echo -n "XXXXXXXXXXXXXXX -- END compile $(1) " ; date)
 .PHONY: $(1)-compile
 endef
@@ -580,20 +655,20 @@ clean-help:
 
 ### brute force clean
 distclean1:
-       rm -rf pldistro.mk .rpmmacros spec2make header.spec SPECS MAKE 
+       rm -rf savedpldistro.mk .rpmmacros spec2make header.spec SPECS MAKE $(DISTCLEANS)
 distclean2:
-       rm -rf CODEBASES SOURCES BUILD RPMS SRPMS tmp
+       rm -rf CODEBASES SOURCES BUILD BUILDROOT RPMS SRPMS tmp
 distclean: distclean1 distclean2
 .PHONY: distclean1 distclean2 distclean
 
 develclean:
-       $(RPM-UNINSTALL-DEVEL) $(ALL-DEVEL-RPMS)
+       -$(RPM-UNINSTALL-DEVEL) $(ALL-DEVEL-RPMS)
 
 ####################
 # gather build information for the 'About' page
 # when run from crontab, INIT_CWD not properly set (says /root ..)
-# so, the nightly build passes NIGHTLY_BASE here
-# also store the nightly_base in .base for any post-processing purposes
+# so, the nightly build passes BASE here
+# also store BASE in .base for any post-processing purposes
 myplc-release:
        @echo 'Creating myplc-release'
        rm -f $@
@@ -603,13 +678,13 @@ myplc-release:
        $(MAKE) --no-print-directory version-svns >> $@
        echo "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx rpm info" >> $@
        $(MAKE) --no-print-directory version-rpms >> $@
-       @echo $(NIGHTLY_BASE) > .base
+       @echo $(BASE) > .base
 
 version-build:
        @echo -n 'Build build-date: ' ; date '+%Y.%m.%d'
        @echo -n 'Build build-time: ' ; date '+%H:%M-%Z'
        @echo -n 'Build build-hostname: ' ; hostname
-       @echo    "Build build-base: $(NIGHTLY_BASE)"
+       @echo    "Build build-base: $(BASE)"
        @echo    "Build planetlab-distro: $(PLDISTRO)"
        @echo    "Build planetlab-tags: $(PLDISTROTAGS)"
        @echo -n 'Build planetlab-tagsid: ' ; fgrep '$$''Id' $(PLDISTROTAGS)
@@ -617,7 +692,7 @@ version-build:
        @echo    "Build target-distro: $(DISTRO)"
        @echo    "Build target-distroname: $(DISTRONAME)"
        @echo    "Build target-release: $(RELEASE)"     
-       @echo    "Build target-personality: $(NIGHTLY_PERSONALITY)"     
+       @echo    "Build target-personality: $(PERSONALITY)"     
 
 #################### 
 # for a given module
@@ -629,11 +704,6 @@ $(1)-version-svn:
           printf $(VFORMAT) $(1)-CVSROOT "$($(1)-CVSROOT)" ; printf $(VFORMAT) $(1)-TAG "$($(1)-TAG)")
 endef
 
-# compute all modules
-ALL-MODULES :=
-$(foreach package,$(ALL), $(eval ALL-MODULES+=$($(package)-MODULES)))
-ALL-MODULES:=$(sort $(ALL-MODULES))
-
 $(foreach module,$(ALL-MODULES), $(eval $(call svn_version_target,$(module))))
 
 version-svns: $(foreach module, $(ALL-MODULES), $(module)-version-svn)
@@ -685,9 +755,10 @@ info: packages modules branches
 
 ####################
 tests_svnpath:
-       @$(if $(TESTS_SVNPATH), echo $(TESTS_SVNPATH) > $@, \
+       @$(if $(tests-SVNPATH), echo $(tests-SVNPATH) > $@, \
        echo "http://svn.planet-lab.org/svn/tests/trunk" > $@)
 
+
 ####################
 help:
        @echo "********** Run make in two stages:"