X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=Makefile;h=a41537c30374e312835672a277f07e6ea5ba635e;hb=f4a6eac89c12ba1360bfe2e494637da6c3d7d519;hp=9b6a7eb3e47f0d45288897b6893132735ea5d097;hpb=3855a2fa7db384931e9a9f21153ec73b4894cb6d;p=build.git diff --git a/Makefile b/Makefile index 9b6a7eb3..a41537c3 100644 --- a/Makefile +++ b/Makefile @@ -2,6 +2,7 @@ # Thierry Parmentelat - INRIA Sophia Antipolis # ### $Id$ +### $URL$ # #################### # invocation: @@ -56,10 +57,17 @@ # 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 +# 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 +# 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 +100,7 @@ #################### # exported to spec files as plrelease -PLANETLAB_RELEASE = 4.2 +PLANETLAB_RELEASE = 5.0 # # Default values @@ -103,8 +111,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 +129,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 @@ -128,7 +147,9 @@ include $(PLDISTROCONTENTS) #################### include -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 @@ -145,6 +166,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 +268,27 @@ repo: RPMS/yumgroups.xml # $(package)-SPEC - otherwise the cvs modules have to define spec as # /.spec while svn modules just define it as .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 @@ -256,6 +315,11 @@ header.spec: echo "%define distroname $(DISTRONAME)" >> $@ echo "%define pldistro $(PLDISTRO)" >> $@ echo "%define plrelease $(PLANETLAB_RELEASE)" >> $@ + echo "# use MD5 and gzip for binary and source files" << $@ + echo "%global _binary_filedigest_algorithm 1" >> $@ + echo "%global _source_filedigest_algorithm 1" >> $@ + echo "%global _source_payload w9.gzdio" >> $@ + echo "%global _binary_payload w9.gzdio" >> $@ ### extract spec file from scm define target_spec @@ -268,7 +332,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 +360,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 @@ -315,15 +380,21 @@ $(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 @@ -415,26 +486,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 +542,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 +662,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 +685,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 +699,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 +711,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 +762,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:"