# Thierry Parmentelat - INRIA Sophia Antipolis
#
### $Id$
+### $URL$
#
####################
# invocation:
# 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
####################
# exported to spec files as plrelease
-PLANETLAB_RELEASE = 4.2
+PLANETLAB_RELEASE = 5.0
#
# Default values
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
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
#################### include <pldistro>-tags.mk
# describes where to fetch components, and the related tags if using cvs
+ifeq "$(PLDISTROTAGS)" ""
PLDISTROTAGS := $(PLDISTRO)-tags.mk
+endif
include $(PLDISTROTAGS)
# this used to be set in the -tags.mk files, but that turned out to require
# 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
# $(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
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))
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
define target_mk
MAKE/$(1).mk: $($(1).specpath) spec2make .rpmmacros
mkdir -p MAKE
- ./spec2make $($(1)-RPMFLAGS) $($(1).specpath) $(1) > MAKE/$(1).mk
- @if [ -z MAKE/$(1).mk ] ; then rm MAKE/$(1).mk ; exit 1 ; fi
+ ./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:
- echo "PLDISTRO:=$(PLDISTRO)" > $@
- echo "PLDISTROTAGS:=$(PLDISTROTAGS)" >> $@
-
-savepldistro: pldistro.mk
-.PHONY: savepldistro
+SAVED_VARS=PLDISTRO PLDISTROTAGS build-SVNPATH PERSONALITY MAILTO BASE WEBPATH TESTBUILDURL WEBROOT
+savedpldistro.mk:
+ @echo "# do not edit" > $@
+ @$(foreach var,$(SAVED_VARS),echo "$(var):=$($(var))" >> $@ ;)
+ @echo "# do not edit" > aliases
+ @echo -n "alias m=\"make " >> aliases
+ @$(foreach var,$(SAVED_VARS),echo -n " $(var)=$($(var))" >> aliases ;)
+ @echo "\"" >> aliases
+ @echo "alias m1=\"m stage1=true\"" >> aliases
+
+savedpldistro: savedpldistro.mk
+.PHONY: savedpldistro
# always refresh this
-all: savepldistro
+all: savedpldistro
#################### regular make
@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
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
### 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 $@
$(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)
@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
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)
####################
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:"