X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=Makefile;h=fd7f8d94dfb681386101a07099953bac36c436dd;hb=e46a735e756997a3335d8f90192802ac6fbe9f1d;hp=d7b4f210fa4e5040a9d164e13314ca3713d2e528;hpb=fb8496f965ebbddd0d4380f1d69d3b41ea10cc7c;p=build.git diff --git a/Makefile b/Makefile index d7b4f210..fd7f8d94 100644 --- a/Makefile +++ b/Makefile @@ -21,15 +21,7 @@ # #################### (planetlab) distributions # -# (*) the default distribution is called 'planetlab' -# (*) you may define an alternative distribution, e.g. onelab -# in this case you need to -# (*) create onelab.mk that defines your *packages* (see below) -# (*) create onelab-tags.mk that defines where to fetch your *modules* -# (*) create your main yumgroups.xml as groups/.xml -# (*) there are also various places where a set of modules are defined. -# check for .lst files in the various modules that build root images -# and mimic what's done for planetlab +# (*) see README-pldistros.txt # (*) then you need to run # make stage1=true PLDISTRO=onelab # @@ -70,6 +62,8 @@ # is refreshed with createrepo prior to running rpmbuild # (*) 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 +# a source rpms by running 'make srpm' # #################### modules # Required information about the various modules (set this in e.g. planetlab-tags.mk) @@ -87,20 +81,26 @@ # # the build defines some make variables that are extracted from spec files # see for example -# (*) $ make ulogd.pkginfo +# (*) $ make ulogd-pkginfo # to see the list f variables attached to a given package -# (*) $ make kernel-devel.rpminfo +# (*) $ make kernel-devel-rpminfo # to see the list f variables attached to a given rpm # #################### +# exported to spec files as plrelease +PLANETLAB_RELEASE = 4.2 + # # Default values # HOSTARCH := $(shell uname -i) DISTRO := $(shell ./getdistro.sh) RELEASE := $(shell ./getrelease.sh) +DISTRONAME := $(shell ./getdistroname.sh) RPM-INSTALL-DEVEL := rpm --force -Uvh +# cannot force rpm -e +RPM-UNINSTALL-DEVEL := rpm -e #################### Makefile # Default target @@ -127,32 +127,32 @@ include $(PLDISTROCONTENTS) PLDISTROTAGS := $(PLDISTRO)-tags.mk include $(PLDISTROTAGS) -########## stage1 and stage2 +########## stage1 and stage1iter # extract specs and compute .mk files by running # make stage1=true # entering stage1, we compute all the spec files -# then we use stage2 to compute the .mk iteratively, +# then we use stage1iter to compute the .mk iteratively, # ensuring that the n-1 first makefiles are loaded when creating the n-th one -# when stage2 is set, it is supposed to be an index (starting at 1) in $(ALL) +# when stage1iter is set, it is supposed to be an index (starting at 1) in $(ALL) ALLMKS := $(foreach package, $(ALL), MAKE/$(package).mk) -### stage2 : need some arithmetic, see +### stage1iter : need some arithmetic, see # http://www.cmcrossroads.com/articles/ask-mr.-make/learning-gnu-make-functions-with-arithmetic.html -ifneq "$(stage2)" "" +ifneq "$(stage1iter)" "" # the first n packages -packages := $(wordlist 1,$(words $(stage2)),$(ALL)) +packages := $(wordlist 1,$(words $(stage1iter)),$(ALL)) # the n-th package package := $(word $(words $(packages)),$(packages)) # the n-1 first packages -stage2_1 := $(wordlist 2,$(words $(stage2)),$(stage2)) -previous := $(wordlist 1,$(words $(stage2_1)),$(ALL)) +stage1iter_1 := $(wordlist 2,$(words $(stage1iter)),$(stage1iter)) +previous := $(wordlist 1,$(words $(stage1iter_1)),$(ALL)) previousmks := $(foreach package,$(previous),MAKE/$(package).mk) include $(previousmks) all: verbose verbose: - @echo "========== stage2 : $(package)" -# @echo "stage2 : included .mk files : $(previousmks)" + @echo "========== stage1iter : $(package)" +# @echo "stage1iter : included .mk files : $(previousmks)" all: $($(package).specpath) all: MAKE/$(package).mk else @@ -163,10 +163,10 @@ verbose : @echo "========== stage1" all : spec2make all : .rpmmacros -# specs and makes are done sequentially by stage2 -all : stage2 -stage2: - arg=""; for n in $(ALL) ; do arg="$$arg x"; $(MAKE) --no-print-directory stage2="$$arg"; done +# specs and makes are done sequentially by stage1iter +all : stage1iter +stage1iter: + arg=""; for n in $(ALL) ; do arg="$$arg x"; $(MAKE) --no-print-directory stage1iter="$$arg"; done ### regular make else ### once .mks are OK, you can run make normally @@ -184,28 +184,10 @@ all: repo endif endif -#################### -# gather build information for the 'About' page -myplc-release: - @echo 'Creating myplc-release' - rm -f $@ - (echo -n 'Build bdate: ' ; date '+%Y.%m.%d') >> $@ - (echo -n 'Build btime: ' ; date '+%H:%M') >> $@ - (echo -n 'Build hostname: ' ; hostname) >> $@ - (echo -n 'Build location: ' ; pwd) >> $@ - (echo -n 'Build tags file: ' ; fgrep '$$''Id' $(PLDISTROTAGS)) >> $@ - echo "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx modules versions info" >> $@ - $(MAKE) --no-print-directory versions >> $@ - -### yumgroups.xml -# the source -ifndef YUMGROUPS -YUMGROUPS := groups/$(PLDISTRO).xml -endif - -RPMS/yumgroups.xml: $(YUMGROUPS) +### yumgroups.xml : compute from all known .pkgs files +RPMS/yumgroups.xml: mkdir -p RPMS - install -D -m 644 $(YUMGROUPS) $@ + ./yumgroups.sh $(PLDISTRO) > $@ createrepo = createrepo --quiet -g yumgroups.xml RPMS/ @@ -224,8 +206,9 @@ repo: RPMS/yumgroups.xml # define stage1_variables $(1).spec = $(notdir $($(1)-SPEC)) -$(1).specpath = SPECS/$(notdir $($(1)-SPEC)) +$(1).specpath = SPECS/$(1).spec $(1).module = $(firstword $($(1)-MODULES)) +$(1)-SVNPATH = $(strip $($(1)-SVNPATH)) endef $(foreach package, $(ALL), $(eval $(call stage1_variables,$(package)))) @@ -238,9 +221,9 @@ $(foreach package, $(ALL), $(eval $(call stage1_variables,$(package)))) # define package_hasdate $(1).has-date = $(if $(subst myplc,,$(1)), \ - $(if $($(1)-SVNPATH),\ - $(if $(findstring /trunk,$($(1)-SVNPATH)),yes,),\ - $(if $(findstring HEAD,$($(1)-TAG)),yes,)), \ + $(if $($($(1).module)-SVNPATH),\ + $(if $(findstring /trunk,$($($(1).module)-SVNPATH)),yes,),\ + $(if $(findstring HEAD,$($($(1).module)-TAG)),yes,)), \ yes) endef @@ -251,20 +234,21 @@ define target_spec $($(1).specpath): mkdir -p SPECS (echo -n "# Generated by planetlab build from $($(1)-SPEC) on " ; date) > $($(1).specpath) - echo "%define distroname $(DISTRO)" >> $($(1).specpath) + echo "%define distro $(DISTRO)" >> $($(1).specpath) echo "%define distrorelease $(RELEASE)" >> $($(1).specpath) + echo "%define distroname $(DISTRONAME)" >> $($(1).specpath) echo "%define pldistro $(PLDISTRO)" >> $($(1).specpath) + echo "%define plrelease $(PLANETLAB_RELEASE)" >> $($(1).specpath) $(if $($(1).has-date),echo "%define date $(shell date +%Y.%m.%d)" >> $($(1).specpath),) - echo "# included from codebase specfile" >> $($(1).specpath) $(if $($(1)-SPECVARS), \ $(foreach line,$($(1)-SPECVARS), \ echo "%define" $(word 1,$(subst =, ,$(line))) "$(word 2,$(subst =, ,$(line)))" >> $($(1).specpath) ;)) + echo "# included from codebase specfile" >> $($(1).specpath) $(if $($($(1).module)-SVNPATH),\ - svn cat $($($(1).module)-SVNPATH)/$($(1)-SPEC) >> $($(1).specpath),\ + svn cat $($($(1).module)-SVNPATH)/$($(1)-SPEC) >> $($(1).specpath) || rm $($(1).specpath),\ cvs -d $($($(1).module)-CVSROOT) checkout \ -r $($($(1).module)-TAG) \ -p $($(1).module)/$($(1)-SPEC) >> $($(1).specpath)) - @if [ -z $($(1).specpath) ] ; then rm $($(1).specpath) ; exit 1 ; fi endef $(foreach package,$(ALL),$(eval $(call target_spec,$(package)))) @@ -289,9 +273,7 @@ endif rm -f $@ echo "%_topdir $(HOME)" >> $@ echo "%_tmppath $(HOME)/tmp" >> $@ - echo "%_netsharedpath /proc:/dev/pts" >> $@ - echo "%_install_langs C:de:en:es:fr" >> $@ - echo "%_excludedocs yes" >> $@ + ./getrpmmacros.sh >> $@ ### this utility allows to extract various info from a spec file ### and to define them in makefiles @@ -321,7 +303,20 @@ savepldistro: pldistro.mk # always refresh this all: savepldistro -#################### +#################### regular make + +define stage2_variables +### devel dependencies +$(1).rpmbuild = $(if $($(1)-RPMBUILD),$($(1)-RPMBUILD),$(RPMBUILD)) $($(1)-RPMFLAGS) +$(1).all-devel-rpm-paths := $(foreach rpm,$($(1)-DEPEND-DEVEL-RPMS),$($(rpm).rpm-path)) +$(1).depend-devel-packages := $(sort $(foreach rpm,$($(1)-DEPEND-DEVEL-RPMS),$($(rpm).package))) +ALL-DEVEL-RPMS += $($(1)-DEPEND-DEVEL-RPMS) +endef + +$(foreach package,$(ALL),$(eval $(call stage2_variables,$(package)))) +ALL-DEVEL-RPMS := $(sort $(ALL-DEVEL-RPMS)) + + ### pack sources into tarballs ALLTARBALLS:= $(foreach package, $(ALL), $($(package).tarballs)) tarballs: $(ALLTARBALLS) @@ -401,31 +396,30 @@ srpms: $(ALLSRPMS) # usage: target_source_rpm package # select upon the package name, whether it contains srpm or not define target_source_rpm -$(1).all-devel-rpm-paths := $(foreach rpm,$($(1)-DEPEND-DEVEL-RPMS),$($(rpm).rpm-path)) -ifeq "$(subst srpm,,$(1))" "$(1)" +ifeq "$($(1)-BUILD-FROM-SRPM)" "" $($(1).srpm): $($(1).specpath) .rpmmacros $($(1).tarballs) mkdir -p BUILD SRPMS tmp - @(echo -n "XXXXXXXXXXXXXXX -- BEG SRPM $(1) " ; date) + @(echo -n "XXXXXXXXXXXXXXX -- BEG SRPM $(1) (using SOURCES) " ; date) $(if $($(1).all-devel-rpm-paths), $(RPM-INSTALL-DEVEL) $($(1).all-devel-rpm-paths)) - $(if $($(1)-RPMBUILD),\ - $($(1)-RPMBUILD) $($(1)-RPMFLAGS) -bs $($(1).specpath), - $(RPMBUILD) $($(1)-RPMFLAGS) -bs $($(1).specpath)) + $($(1).rpmbuild) -bs $($(1).specpath) + $(if $($(1)-DEPEND-DEVEL-RPMS), $(RPM-UNINSTALL-DEVEL) $($(1)-DEPEND-DEVEL-RPMS)) @(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 && \ + make -C $($(1).codebase) srpm SPECFILE=$(HOME)/$($(1).specpath) && \ 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)) @(echo -n "XXXXXXXXXXXXXXX -- END SRPM $(1) " ; date) endif endef $(foreach package,$(ALL),$(eval $(call target_source_rpm,$(package)))) -### rpmbuild invokation +### binary rpms are made from source rpm ALLRPMS:=$(foreach package,$(ALL),$($(package).rpms)) # same as above, mention $(ALL) and not $(ALLRPMS) rpms: $(ALLRPMS) @@ -434,42 +428,52 @@ rpms: $(ALLRPMS) # use tmp dirs when building binary rpm so make remains idempotent # otherwise SOURCES/ or SPEC gets touched again - which leads to rebuilding -rpm_use_tmp_dirs = --define "_sourcedir $(HOME)/tmp" --define "_specdir $(HOME)/tmp" +RPM-USE-TMP-DIRS = --define "_sourcedir $(HOME)/tmp" --define "_specdir $(HOME)/tmp" +RPM-USE-COMPILE-DIRS = --define "_sourcedir $(HOME)/COMPILE" --define "_specdir $(HOME)/COMPILE" # usage: build_binary_rpm package # xxx hacky - invoke createrepo if DEPEND-FILES mentions RPMS/yumgroups.xml define target_binary_rpm $($(1).rpms): $($(1).srpm) - mkdir -p BUILD RPMS tmp + mkdir -p RPMS tmp @(echo -n "XXXXXXXXXXXXXXX -- BEG RPM $(1) " ; date) $(if $(findstring RPMS/yumgroups.xml,$($(1)-DEPEND-FILES)), $(createrepo) , ) - $(if $($(1)-RPMBUILD),\ - $($(1)-RPMBUILD) $($(1)-RPMFLAGS) --rebuild $(rpm_use_tmp_dirs) $($(1).srpm), \ - $(RPMBUILD) $($(1)-RPMFLAGS) --rebuild $(rpm_use_tmp_dirs) $($(1).srpm)) + $(if $($(1).all-devel-rpm-paths), $(RPM-INSTALL-DEVEL) $($(1).all-devel-rpm-paths)) + $($(1).rpmbuild) --rebuild $(RPM-USE-TMP-DIRS) $($(1).srpm) + $(if $($(1)-DEPEND-DEVEL-RPMS), $(RPM-UNINSTALL-DEVEL) $($(1)-DEPEND-DEVEL-RPMS)) @(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)) + $($(1).rpmbuild) --recompile $(RPM-USE-TMP-DIRS) $($(1).srpm) + $(if $($(1)-DEPEND-DEVEL-RPMS), $(RPM-UNINSTALL-DEVEL) $($(1)-DEPEND-DEVEL-RPMS)) + @(echo -n "XXXXXXXXXXXXXXX -- END compile $(1) " ; date) +.PHONY: $(1)-compile endef $(foreach package,$(ALL),$(eval $(call target_binary_rpm,$(package)))) - ### shorthand target # e.g. make proper -> does propers rpms # usage shorthand_target package define target_shorthand -$(1): $($(package).rpms) +$(1): $($(1).rpms) .PHONY: $(1) -$(1)-spec: $($(package)-SPEC) +$(1)-spec: $($(1)-SPEC) .PHONY: $(1)-spec -$(1)-mk: $($(package)-MK) +$(1)-mk: $($(1)-MK) .PHONY: $(1)-mk -$(1)-tarball: $($(package).tarballs) +$(1)-tarball: $($(1).tarballs) .PHONY: $(1)-tarball -$(1)-codebase: $($(package).codebase) +$(1)-codebase: $($(1).codebase) .PHONY: $(1)-source -$(1)-source: $($(package).source) +$(1)-source: $($(1).source) .PHONY: $(1)-codebase -$(1)-rpms: $($(package).rpms) +$(1)-rpms: $($(1).rpms) .PHONY: $(1)-rpms -$(1)-srpm: $($(package).srpm) +$(1)-srpm: $($(1).srpm) .PHONY: $(1)-srpm endef @@ -488,11 +492,6 @@ endef $(foreach package,$(ALL),$(eval $(call target_dependfiles,$(package)))) ### package dependencies -define compute_devel_depends -$(1).depend-devel-packages := $(foreach rpm,$($(1)-DEPEND-DEVEL-RPMS),$($(rpm).package)) -endef -$(foreach package,$(ALL),$(eval $(call compute_devel_depends,$(package)))) - define package_depends_on_package $(1):$(2) $(1):$($(2).rpms) @@ -565,14 +564,44 @@ distclean2: distclean: distclean1 distclean2 .PHONY: distclean1 distclean2 distclean -# xxx tmp - I cannot use this on my mac for local testing -ISMACOS=$(findstring Darwin,$(shell uname)) -ifneq "$(ISMACOS)" "" -#################### produce reliable version information +develclean: + $(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 +myplc-release: + @echo 'Creating myplc-release' + rm -f $@ + echo "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx build info" >> $@ + $(MAKE) --no-print-directory version-build >> $@ + echo "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx svn info" >> $@ + $(MAKE) --no-print-directory version-svns >> $@ + echo "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx rpm info" >> $@ + $(MAKE) --no-print-directory version-rpms >> $@ + @echo $(NIGHTLY_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 planetlab-distro: $(PLDISTRO)" + @echo "Build planetlab-tags: $(PLDISTROTAGS)" + @echo -n 'Build planetlab-tagsid: ' ; fgrep '$$''Id' $(PLDISTROTAGS) + @echo "Build target-arch: $(HOSTARCH)" + @echo "Build target-distro: $(DISTRO)" + @echo "Build target-distroname: $(DISTRONAME)" + @echo "Build target-release: $(RELEASE)" + @echo "Build target-personality: $(NIGHTLY_PERSONALITY)" + +#################### # for a given module VFORMAT="%30s := %s\n" -define print_version -$(1)-version: +define svn_version_target +$(1)-version-svn: @$(if $($(1)-SVNPATH),\ printf $(VFORMAT) $(1)-SVNPATH "$($(1)-SVNPATH)",\ printf $(VFORMAT) $(1)-CVSROOT "$($(1)-CVSROOT)" ; printf $(VFORMAT) $(1)-TAG "$($(1)-TAG)") @@ -583,13 +612,21 @@ ALL-MODULES := $(foreach package,$(ALL), $(eval ALL-MODULES+=$($(package)-MODULES))) ALL-MODULES:=$(sort $(ALL-MODULES)) -$(foreach module,$(ALL-MODULES), $(eval $(call print_version,$(module)))) +$(foreach module,$(ALL-MODULES), $(eval $(call svn_version_target,$(module)))) -versions: $(foreach module, $(ALL-MODULES), $(module)-version) -else -versions: - @echo "warning : the 'versions' target is not supported on macos" -endif +version-svns: $(foreach module, $(ALL-MODULES), $(module)-version-svn) + +RFORMAT="%20s :: version=%s release=%s\n" +define rpm_version_target +$(1)-version-rpm: + @printf $(RFORMAT) $($(1).rpm-name) $($(1).rpm-version) $($(1).rpm-release) +version-rpms: $(1)-version-rpm +endef + +$(foreach package,$(sort $(ALL)), $(eval $(call rpm_version_target,$(package)))) + +versions: myplc-release version-build version-svns version-rpms +.PHONY: versions version-build version-rpms version-svns #################### include install Makefile # the default is to use the distro-dependent install file @@ -634,11 +671,18 @@ help: @echo 'make srpms' @echo 'make rpms' @echo "" + @echo "********** Manual targets" + @echo "make package-compile" + @echo " The regular process uses rpmbuild --rebuild, that performs" + @echo " a compilation directory cleanup upon completion. If you need to investigate" + @echo " the intermediate compilation directory, use the -compile targets" @echo "********** Cleaning examples" @echo "make clean" @echo " removes the files made by make" @echo "make distclean" @echo " brute-force cleaning, removes entire directories - requires a new stage1" + @echo "make develclean" + @echo " rpm-uninstalls all devel packages installed during build" @echo "" @echo "make iptables-distclean" @echo " deep clean for a given package" @@ -654,9 +698,9 @@ help: @echo "make ++ALL" @echo " Displays the value of a given variable (here ALL)" @echo " with only a single plus sign only the value is displayed" - @echo "make ulogd.pkginfo" + @echo "make ulogd-pkginfo" @echo " Displays know attributes of a package" - @echo "make kernel-devel.rpminfo" + @echo "make kernel-devel-rpminfo" @echo " Displays know attributes of an rpm" @echo "" @echo "********** Known pakages are" @@ -673,11 +717,11 @@ help: @echo "$($(varname))" ## package info PKGKEYS := tarballs source codebase srpm rpms rpmnames rpm-release rpm-name rpm-version rpm-subversion -%.pkginfo: package=$(subst .pkginfo,,$@) -%.pkginfo: +%-pkginfo: package=$(subst -pkginfo,,$@) +%-pkginfo: @$(foreach key,$(PKGKEYS),echo "$(package).$(key)=$($(package).$(key))";) ## rpm info RPMKEYS := rpm-path package -%.rpminfo: rpm=$(subst .rpminfo,,$@) -%.rpminfo: +%-rpminfo: rpm=$(subst -rpminfo,,$@) +%-rpminfo: @$(foreach key,$(RPMKEYS),echo "$(rpm).$(key)=$($(rpm).$(key))";)