X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=Makefile;h=82d8e0aa40e6c48956cabb5547d6592da9cacbf5;hb=fa469b6d422a4774d604a9197c9129dcd7d61627;hp=1425f75b8898bce2b06dae853d4e32fd10e789b6;hpb=b11cd0cefd0017d660a75069e953ef03e55f490e;p=build.git diff --git a/Makefile b/Makefile index 1425f75b..82d8e0aa 100644 --- a/Makefile +++ b/Makefile @@ -1,221 +1,621 @@ # -# PlanetLab RPM generation +# Thierry Parmentelat - INRIA Sophia Antipolis # -# Copyright (c) 2003 The Trustees of Princeton University (Trustees). -# All Rights Reserved. +### $Id$ # -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following -# disclaimer in the documentation and/or other materials provided -# with the distribution. -# -# * Neither the name of the copyright holder nor the names of its -# contributors may be used to endorse or promote products derived -# from this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TRUSTEES OR -# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# -# $Id: Makefile,v 1.9 2004/04/12 13:40:41 alk-pl_rpm Exp $ -# - -# Default target -all: - -# -# CVSROOT: CVSROOT to use -# INITIAL: CVS tag to use for Source0 tarball -# TAG: CVS tag to patch to -# MODULE: CVS module name to use -# SPEC: RPM spec file template -# RPMFLAGS: Miscellaneous RPM flags -# ALL: default targets -# -# If INITIAL is different than TAG, PatchSets will be generated -# automatically with cvsps(1) to bring Source0 up to TAG. If TAG is -# HEAD, a %{date} variable will be defined in the generated spec -# file. If a Patch: tag in the spec file matches a generated PatchSet -# number, the name of the patch will be as specified. Otherwise, the -# name of the patch will be the PatchSet number. %patch tags in the -# spec file are generated automatically. +#################### +# invokation: # - -# -# kernel-planetlab -# - -kernel-planetlab-CVSROOT := pup-pl_kernel@cvs.planet-lab.org:/cvs -kernel-planetlab-INITIAL := linux-2_4_22 -kernel-planetlab-TAG := HEAD -kernel-planetlab-MODULE := linux-2.4 -kernel-planetlab-SPEC := linux-2.4/scripts/kernel-planetlab.spec -ALL += kernel-planetlab - +# (*) make stage1=true +# this extracts all specfiles and computes .mk from specfiles +# you need to specify PLDISTRO here if relevant - see below +# (*) make help +# for more info on how to invoke this stuff # -# plkmod +#################### (fedora) distributions # - -plkmod-CVSROOT := pup-silk@cvs.planet-lab.org:/cvs -plkmod-INITIAL := HEAD -plkmod-TAG := HEAD -plkmod-MODULE := sys-v3 -plkmod-SPEC := sys-v3/rpm/plkmod.spec -plkmod-RPMFLAGS = --define "kernelver $(shell rpmquery --queryformat '%{VERSION}-%{RELEASE}\n' --specfile SPECS/$(notdir $(kernel-planetlab-SPEC)) | head -1)" -ALL += plkmod - -# Build kernel-planetlab first so we can bootstrap off of its build -plkmod: kernel-planetlab - +# (*) as of nov. 2007, myplc-devel is deprecated +# (*) instead, we create a fresh vserver that holds required tools (see e.g. planetlab-devel.lst) +# (*) the build uses the current fedora version as a target for the produced images +# (*) so you simply need to create a fedora 8 build image for building fedora-8 images +# +#################### (planetlab) distributions # -# vdk +# (*) 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 mimick what's done for planetlab +# (*) then you need to run +# make stage1=true PLDISTRO=onelab # - -vdk-CVSROOT := pup-pl_kernel@cvs.planet-lab.org:/cvs -vdk-INITIAL := vdk_918 -vdk-TAG := HEAD -vdk-MODULE := vdk -vdk-SPEC := vdk/vtune_driver.spec -vdk-RPMFLAGS = --define "kernelver $(shell rpmquery --queryformat '%{VERSION}-%{RELEASE}\n' --specfile SPECS/$(notdir $(kernel-planetlab-SPEC)) | head -1)" -ALL += vdk - -# Build kernel-planetlab first so we can bootstrap off of its build -vdk: kernel-planetlab - +#################### +# This build deals with 2 kinds of objects +# +# (*) packages are named upon the RPM name; they are moslty lowercase +# Add a package to ALL if you want it built as part of the default set. +# (*) modules are named after the subversion tree; as of this writing their names +# are mostly mixedcase like MyPLC or Vserverreference +# +#################### packages +# basics: how to build a package - you need/may define the following variables +# +# (*) package-MODULES +# a package needs one or several modules to build. +# to this end, define +# (*) package-SPEC +# the package's specfile; this is relative to the FIRST module in package-MODULES +# see 'codebase' below # -# vserver +# Optional: # - -vserver-CVSROOT := pup-pl_kernel@cvs.planet-lab.org:/cvs -vserver-INITIAL := vserver-0_29 -vserver-TAG := HEAD -vserver-MODULE := vserver -vserver-SPEC := vserver/vserver.spec -ALL += vserver - +# (*) package-SPECVARS +# space-separated list of spec variable definitions, where you can reference make variable that relate to +# packages defined BEFORE the current one (note: you should use = - as opposed to := - to define these) +# e.g. mydriver-SPECVARS = foo=$(kernel-rpm-release) +# would let you use the %release from the kernel's package when rpmbuild'ing mydriver - see automatic below +# (*) package-DEPENDS +# a set of *packages* that this package depends on +# (*) package-DEPENDFILES +# 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-RPMFLAGS: Miscellaneous RPM flags +# (*) package-RPMBUILD: If not rpmbuild - mostly used for sudo'ing rpmbuild # -# vserver-init +#################### modules +# Required information about the various modules (set this in e.g. planetlab-tags.mk) # - -vserver-init-CVSROOT := pup-pl_kernel@cvs.planet-lab.org:/cvs -vserver-init-INITIAL := HEAD -vserver-init-TAG := HEAD -vserver-init-MODULE := vserver-init -vserver-init-SPEC := vserver-init/vserver-init.spec -ALL += vserver-init - +# (*) module-SVNPATH +# the complete path where this module lies; +# you can specify the trunk or a given tag with this variable +# +# OR if the module is managed under cvs (will be obsoleted) +# +# (*) module-CVSROOT +# (*) module-TAG # -# vsh +#################### automatic variables # - -vsh-CVSROOT := pup-pl_kernel@cvs.planet-lab.org:/cvs -vsh-INITIAL := bash-2_05 -vsh-TAG := HEAD -vsh-MODULE := vsh -vsh-SPEC := vsh/vsh-planetlab.spec -ALL += vsh - -# Build kernel-planetlab first so we can bootstrap off of its build -vsh: kernel-planetlab +# the build defines the following make variables - these are extracted from spec files +# (*) package-TARBALL : from the Source: declaration +# example: kernel-i386-TARBALL = SOURCES/linux-2.6.20.tar.bz2 +# (*) package-SOURCE : +# example: kernel-i386-SOURCE = SOURCES/linux-2.6.20 +# (*) package-SRPM +# example: kernel-i386-SRPM = SRPMS/kernel-2.6.20-1.2949.fc6.vs2.2.0.1.0.planetlab.src.rpm +# (*) package-RPM +# example: kernel-i386-RPM = \ +# RPMS/i686/kernel-2.6.20-1.2949.fc6.vs2.2.0.1.0.planetlab.i686.rpm \ +# RPMS/i686/kernel-devel-2.6.20-1.2949.fc6.vs2.2.0.1.0.planetlab.i686.rpm \ +# RPMS/i686/kernel-vserver-2.6.20-1.2949.fc6.vs2.2.0.1.0.planetlab.i686.rpm \ +# RPMS/i686/kernel-debuginfo-2.6.20-1.2949.fc6.vs2.2.0.1.0.planetlab.i686.rpm +# (*) package-rpm-name +# example: kernel-i386-rpm-name = kernel +# (*) package-rpm-release +# example: kernel-i386-rpm-release = 1.2949.fc6.vs2.2.0.1.0.planetlab +# (*) package-version +# example: kernel-i386-rpm-version = 2.6.20 +# (*) package-subversion +# example: myplc-rpm-subversion = 15 +#################### # -# yum +# Default values # +HOSTARCH := $(shell uname -i) +DISTRO := $(shell ./getdistro.sh) +RELEASE := $(shell ./getrelease.sh) -yum-CVSROOT := pup-node_pkgs@cvs.planet-lab.org:/cvs -yum-INITIAL := YUM_2_0_3 -yum-TAG := YUM_2_0_3_PL_7 -yum-MODULE := yum -yum-SPEC := yum/yum.spec -ALL += yum - -# -# ksymoops -# +#################### Makefile +# Default target +all: +.PHONY:all -ksymoops-CVSROOT := pup-pl_kernel@cvs.planet-lab.org:/cvs -ksymoops-INITIAL := ksymoops-2_4_9 -ksymoops-TAG := HEAD -ksymoops-MODULE := ksymoops -ksymoops-SPEC := ksymoops/ksymoops.spec -ALL += ksymoops +### default values +PLDISTRO := planetlab +RPMBUILD := rpmbuild +export CVS_RSH := ssh -# -# PlanetLabAccounts -# +########## pldistro.mk holds PLDISTRO - it is generated at stage1 (see below) +ifeq "$(stage1)" "" +include pldistro.mk +endif -PlanetLabAccounts-CVSROOT := pup-node_pkgs@cvs.planet-lab.org:/cvs -PlanetLabAccounts-INITIAL := PLANETLABACCOUNTS_0_3_R_2 -PlanetLabAccounts-TAG := PLANETLABACCOUNTS_0_3_R_2 -PlanetLabAccounts-MODULE := PlanetLabAccounts -PlanetLabAccounts-SPEC := PlanetLabAccounts/PlanetLabAccounts.spec -ALL += PlanetLabAccounts +#################### include onelab.mk +# describes the set of components +PLDISTROCONTENTS := $(PLDISTRO).mk +include $(PLDISTROCONTENTS) + +#################### include -tags.mk +# describes where to fetch components, and the related tags if using cvs +PLDISTROTAGS := $(PLDISTRO)-tags.mk +include $(PLDISTROTAGS) + +########## stage1 and stage2 +# 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, +# 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) + +ALLMKS := $(foreach package, $(ALL), MAKE/$(package).mk) + +### stage2 : need some arithmetic, see +# http://www.cmcrossroads.com/articles/ask-mr.-make/learning-gnu-make-functions-with-arithmetic.html +ifneq "$(stage2)" "" +# the first n packages +packages := $(wordlist 1,$(words $(stage2)),$(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)) +previousmks := $(foreach package,$(previous),MAKE/$(package).mk) +include $(previousmks) +all: verbose +verbose: + @echo "========== stage2 : $(package)" +# @echo "stage2 : included .mk files : $(previousmks)" +all: $($(package)_specpath) +all: MAKE/$(package).mk +else +### stage1 +ifneq "$(stage1)" "" +all : verbose +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 +### regular make +else +### once .mks are OK, you can run make normally +include $(ALLMKS) +#all : tarballs +#all : sources +#all : codebases +#all : rpms +#all : srpms +all: rpms +all: srpms +endif +endif +#################### +# gather build information for the 'About' page +SOURCES/myplc-release: + @echo 'Creating myplc-release' + mkdir -p SOURCES + 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 >> $@ + +#################### +# notes: +# * to make configuration easier, we always use the first module's +# definitions (CVSROOT,TAG, or SVNPATH) to extract the spec file +# * for the same reason, in case cvs is used, the first module name is added to +# $(package)-SPEC - otherwise the cvs modules have to define spec as +# /.spec while svn modules just define it as .spec # -# MAKEDEV -# +define stage1_variables +$(1)_spec = $(notdir $($(1)-SPEC)) +$(1)_specpath = SPECS/$(notdir $($(1)-SPEC)) +$(1)_module = $(firstword $($(1)-MODULES)) +endef -MAKEDEV-CVSROOT := pup-node_pkgs@cvs.planet-lab.org:/cvs -MAKEDEV-INITIAL := MAKEDEV_3_2_2 -MAKEDEV-TAG := MAKEDEV_3_2_2_PL_6 -MAKEDEV-MODULE := MAKEDEV -MAKEDEV-SPEC := MAKEDEV/MAKEDEV.spec -ALL += MAKEDEV +$(foreach package, $(ALL), $(eval $(call stage1_variables,$(package)))) # -# NodeUpdate -# - -NodeUpdate-CVSROOT := pup-node_pkgs@cvs.planet-lab.org:/cvs -NodeUpdate-INITIAL := NODEUPDATE_0_2_R_3 -NodeUpdate-TAG := NODEUPDATE_0_2_R_3 -NodeUpdate-MODULE := NodeUpdate -NodeUpdate-SPEC := NodeUpdate/NodeUpdate.spec -ALL += NodeUpdate - -ifeq ($(findstring $(package),$(ALL)),) - -# Build all packages -all: $(ALL) - -# Recurse -$(ALL): - $(MAKE) package=$@ - -.PHONY: all $(ALL) - +# for each package, compute whether we need to set date (i.e. whether we use the trunk) +# the myplc package is forced to have a date, because it is more convenient +# (we cannot bump its number everytime something changes in the system) +# +define package_hasdate +$(1)_hasdate = $(if $(subst myplc,,$(1)), \ + $(if $($(1)-SVNPATH),\ + $(if $(findstring /trunk,$($(1)-SVNPATH)),yes,),\ + $(if $(findstring HEAD,$($(1)-TAG)),yes,)), \ + yes) +endef + +$(foreach package, $(ALL), $(eval $(call package_hasdate,$(package)))) + +### extract spec file from scm +# usage: extract_spec_file package +# see early releases for comments on other possible implementations +# cannot use variables in such rules, we need to inline everything, sigh +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 distrorelease $(RELEASE)" >> $($(1)_specpath) + echo "%define pldistro $(PLDISTRO)" >> $($(1)_specpath) + $(if $($(1)_hasdate),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) ;)) + $(if $($($(1)_module)-SVNPATH),\ + svn cat $($($(1)_module)-SVNPATH)/$($(1)-SPEC) >> $($(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)))) + +### this utility allows to extract various info from a spec file +### and to define them in makefiles +spec2make: spec2make.c + $(CC) -g -Wall $< -o $@ -lrpm -lrpmbuild + +# Base rpmbuild in the current directory +# trying a longer topdir +# http://forums.fedoraforum.org/showthread.php?t=39625 +# and more specifically post#6 +# hard-wired for now +export HOME := /building +.rpmmacros: + rm -f /building ; ln -s /build /building + rm -f $@ + echo "%_topdir $(HOME)" >> $@ + echo "%_tmppath $(HOME)/tmp" >> $@ + echo "%_netsharedpath /proc:/dev/pts" >> $@ + echo "%_install_langs C:de:en:es:fr" >> $@ + +### run spec2make on the spec file and include the result +# usage: spec2make package +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 +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 + +# always refresh this +all: savepldistro + +#################### +### pack sources into tarballs +ALLTARBALLS:= $(foreach package, $(ALL), $($(package)-TARBALL)) +tarballs: $(ALLTARBALLS) + @echo $(words $(ALLTARBALLS)) source tarballs OK +.PHONY: tarballs + +SOURCES/%.tar.bz2: SOURCES/% + tar chpjf $@ -C SOURCES $* + +SOURCES/%.tar.gz: SOURCES/% + tar chpzf $@ -C SOURCES $* + +SOURCES/%.tgz: SOURCES/% + tar chpzf $@ -C SOURCES $* + +## +URLS/%: url=$(subst @colon@,:,$(subst @slash@,/,$(notdir $@))) +URLS/%: basename=$(notdir $(url)) +URLS/%: + echo curl $(url) -o SOURCES/$(basename) + touch $@ + +### the directory SOURCES/- is made +# with a copy -rl from CODEBASES/ +# the former is $(package-SOURCE) and the latter is $(package-CODEBASE) +ALLSOURCES:=$(foreach package, $(ALL), $($(package)-SOURCE)) +# so that make does not use the rule below directly for creating the tarball files +.SECONDARY: $(ALLSOURCES) + +sources: $(ALLSOURCES) + @echo $(words $(ALLSOURCES)) versioned source trees OK +.PHONY: sources + +define target_link_codebase_sources +$($(1)-SOURCE): $($(1)-CODEBASE) ; mkdir -p SOURCES ; cp -rl $($(1)-CODEBASE) $($(1)-SOURCE) +endef + +$(foreach package,$(ALL),$(eval $(call target_link_codebase_sources,$(package)))) + +### codebase extraction +ALLCODEBASES:=$(foreach package, $(ALL), $($(package)-CODEBASE)) +# so that make does not use the rule below directly for creating the tarball files +.SECONDARY: $(ALLCODEBASES) + +codebases : $(ALLCODEBASES) + @echo $(words $(ALLCODEBASES)) codebase OK +.PHONY: codebases + +### extract codebase +# usage: extract_single_module package +define extract_single_module + mkdir -p CODEBASES + $(if $($($(1)_module)-SVNPATH), cd CODEBASES && svn export $($($(1)_module)-SVNPATH) $(1), cd CODEBASES && cvs -d $($($(1)_module)-CVSROOT) export -r $($($(1)_module)-TAG) -d $(1) $($(1)_module)) +endef + +# usage: extract_multi_module package +define extract_multi_module + mkdir -p CODEBASES/$(1) && cd CODEBASES/$(1) && (\ + $(foreach m,$($(1)-MODULES), $(if $($(m)-SVNPATH), svn export $($(m)-SVNPATH) $(m);, cvs -d $($(m)-CVSROOT) export -r $($(m)-TAG) $(m);))) +endef + +CODEBASES/%: package=$(notdir $@) +CODEBASES/%: multi_module=$(word 2,$($(package)-MODULES)) +CODEBASES/%: + @(echo -n "XXXXXXXXXXXXXXX -- BEG CODEBASE $(package) : $@ " ; date) + $(if $(multi_module),\ + $(call extract_multi_module,$(package)),\ + $(call extract_single_module,$(package))) + @(echo -n "XXXXXXXXXXXXXXX -- END CODEBASE $(package) : $@ " ; date) + +### rpmbuild invokation +ALLRPMS:=$(foreach package,$(ALL),$($(package)-RPM)) +rpms: $(ALLRPMS) + @echo $(words $(ALLRPMS)) binary rpms OK +.PHONY: rpms + +# usage: build_binary_rpm package +# xxx hacky - invoke createrepo if DEPENDFILES mentions RPMS/yumgroups.xml +define target_binary_rpm +$($(1)-RPM): $($(1)_specpath) $($(1)-TARBALL) .rpmmacros + mkdir -p BUILD RPMS tmp + @(echo -n "XXXXXXXXXXXXXXX -- BEG RPM $(1) " ; date) + $(if $(findstring RPMS/yumgroups.xml,$($(1)-DEPENDFILES)), createrepo --quiet -g yumgroups.xml RPMS/ , ) + $(if $($(1)-RPMBUILD),\ + $($(1)-RPMBUILD) $($(1)-RPMFLAGS) -bb $($(1)_specpath), \ + $(RPMBUILD) $($(1)-RPMFLAGS) -bb $($(1)_specpath)) + @(echo -n "XXXXXXXXXXXXXXX -- END RPM $(1) " ; date) +endef + +$(foreach package,$(ALL),$(eval $(call target_binary_rpm,$(package)))) + +### source rpms +ALLSRPMS:=$(foreach package,$(ALL),$($(package)-SRPM)) +srpms: $(ALLSRPMS) + @echo $(words $(ALLSRPMS)) source rpms OK +.PHONY: srpms + +# usage: target_source_rpm package +# select upon the package name, whether it contains srpm or not +define target_source_rpm +ifeq "$(subst srpm,,$(1))" "$(1)" +$($(1)-SRPM): $($(1)_specpath) .rpmmacros $($(1)-TARBALL) + mkdir -p BUILD SRPMS tmp + @(echo -n "XXXXXXXXXXXXXXX -- BEG SRPM $(1) " ; date) + $(if $($(1)-RPMBUILD),\ + $($(1)-RPMBUILD) $($(1)-RPMFLAGS) -bs $($(1)_specpath), + $(RPMBUILD) $($(1)-RPMFLAGS) -bs $($(1)_specpath)) + @(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) + make -C $($(1)-CODEBASE) srpm && \ + rm -f SRPMS/$(notdir $($(1)-SRPM)) && \ + ln $($(1)-CODEBASE)/$(notdir $($(1)-SRPM)) SRPMS/$(notdir $($(1)-SRPM)) + @(echo -n "XXXXXXXXXXXXXXX -- END SRPM $(1) " ; date) +endif +endef -# Define variables for Makerules -CVSROOT := $($(package)-CVSROOT) -INITIAL := $($(package)-INITIAL) -TAG := $($(package)-TAG) -MODULE := $($(package)-MODULE) -SPEC := $($(package)-SPEC) -RPMFLAGS := $($(package)-RPMFLAGS) -CVS_RSH := $(if $($(package)-CVS_RSH),$($(package)-CVS_RSH),ssh) - -include Makerules +$(foreach package,$(ALL),$(eval $(call target_source_rpm,$(package)))) +### RPMS/yumgroups.xml +ifndef YUMGROUPS +YUMGROUPS := groups/$(PLDISTRO).xml endif - -# Remove generated files +RPMS/yumgroups.xml: $(YUMGROUPS) + install -D -m 644 $(YUMGROUPS) $@ + +### shorthand target +# e.g. make proper -> does propers rpms +# usage shorthand_target package +define target_shorthand +$(1): $($(package)-RPM) +.PHONY: $(1) +$(1)-spec: $($(package)-SPEC) +.PHONY: $(1)-spec +$(1)-mk: $($(package)-MK) +.PHONY: $(1)-mk +$(1)-tarball: $($(package)-TARBALL) +.PHONY: $(1)-tarball +$(1)-codebase: $($(package)-CODEBASE) +.PHONY: $(1)-source +$(1)-source: $($(package)-SOURCE) +.PHONY: $(1)-codebase +$(1)-rpm: $($(package)-RPM) +.PHONY: $(1)-rpm +$(1)-srpm: $($(package)-SRPM) +.PHONY: $(1)-srpm +endef + +$(foreach package,$(ALL),$(eval $(call target_shorthand,$(package)))) + +### dependencies +define package_depends_on_file +$(1):$(2) +$($(1)-RPM):$(2) +endef + +define target_dependfiles +$(foreach file,$($(1)-DEPENDFILES),$(eval $(call package_depends_on_file,$(1),$(file)))) +endef + +define package_depends_on_package +$(1):$(2) +$(1):$($(2)-RPM) +$($(1)-RPM):$($(2)-RPM) +endef + +define target_depends +$(foreach package,$($(1)-DEPENDS),$(eval $(call package_depends_on_package,$(1),$(package)))) +endef + +$(foreach package,$(ALL),$(eval $(call target_depends,$(package)))) +$(foreach package,$(ALL),$(eval $(call target_dependfiles,$(package)))) + + +### clean target +# usage: target_clean package +define target_clean +$(1)-clean-codebase: + rm -rf $($(1)-CODEBASE) +.PHONY: $(1)-clean-codebase +CLEANS += $(1)-clean-codebase +$(1)-clean-source: + rm -rf $($(1)-SOURCE) +.PHONY: $(1)-clean-source +CLEANS += $(1)-clean-source +$(1)-clean-tarball: + rm -rf $($(1)-TARBALL) +.PHONY: $(1)-clean-tarball +CLEANS += $(1)-clean-tarball +$(1)-clean-build: + rm -rf BUILD/$(notdir $($(1)-SOURCE)) +CLEANS += $(1)-clean-build +$(1)-clean-rpm: + rm -rf $($(1)-RPM) +.PHONY: $(1)-clean-rpm +CLEANS += $(1)-clean-rpm +$(1)-clean-srpm: + rm -rf $($(1)-SRPM) +.PHONY: $(1)-clean-srpm +CLEANS += $(1)-clean-srpm +$(1)-clean: $(1)-clean-codebase $(1)-clean-source $(1)-clean-tarball $(1)-clean-build $(1)-clean-rpm $(1)-clean-srpm +.PHONY: $(1)-clean +endef + +$(foreach package,$(ALL),$(eval $(call target_clean,$(package)))) + +### clean precisely clean: - rm -rf BUILD RPMS SOURCES SPECS SRPMS .rpmmacros .cvsps - + $(MAKE) $(CLEANS) .PHONY: clean + +clean-help: + @echo Available clean targets + @echo $(CLEANS) + +### brute force clean +distclean1: + rm -rf pldistro.mk .rpmmacros spec2make SPECS MAKE +distclean2: + rm -rf CODEBASES SOURCES BUILD RPMS SRPMS tmp +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 +# for a given module +VFORMAT="%30s := %s\n" +define print_version +$(1)-version: + @$(if $($(1)-SVNPATH),\ + printf $(VFORMAT) $(1)-SVNPATH "$($(1)-SVNPATH)",\ + 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 print_version,$(module)))) + +versions: $(foreach module, $(ALL-MODULES), $(module)-version) +else +versions: + @echo "warning : the 'versions' target is not supported on macos" +endif + +#################### include install Makefile +# the default is to use the distro-dependent install file +# however the main distro file can redefine PLDISTROINSTALL +ifndef PLDISTROINSTALL +PLDISTROINSTALL := $(PLDISTRO)-install.mk +endif +# only if present +-include $(PLDISTROINSTALL) + +#################### +help: + @echo "Known pakages are" + @echo " $(ALL)" + @echo "Run make in two stages:" + @echo "" + @echo "make stage1=true PLDISTRO=onelab" + @echo " -> extracts all spec files in SPECS/ and mk files in MAKE/" + @echo " as well as save PLDISTRO for subsequent runs" + @echo "" + @echo "Then you can use the following targets" + @echo '$ make' + @echo " rebuilds everything" + @echo '$ make util-vserver' + @echo " makes the RPMS related to util-vserver" + @echo " equivalent to 'make util-vserver-rpm'" + @echo "" + @echo "Or, vertically - step-by-step for a given package" + @echo '$ make util-vserver-codebase' + @echo " performs codebase extraction in CODEBASES/util-vserver" + @echo '$ make util-vserver-source' + @echo " creates source link in SOURCES/util-vserver-" + @echo '$ make util-vserver-tarball' + @echo " creates source tarball in SOURCES/util-vserver-." + @echo '$ make util-vserver-rpm' + @echo " build rpm(s) in RPMS/" + @echo '$ make util-vserver-srpm' + @echo " build source rpm in SRPMS/" + @echo "" + @echo "Or, horizontally, reach a step for all known packages" + @echo '$ make codebases' + @echo '$ make sources' + @echo '$ make tarballs' + @echo '$ make rpms' + @echo '$ make srpms' + @echo "" + @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 util-vserver-clean" + @echo " removes codebase, source, tarball, build, rpm and srpm for util-vserver" + @echo "$ make util-vserver-clean-codebase" + @echo " and so on for source, tarball, build, rpm and srpm" + +#################### convenience, for debugging only +# make +foo : prints the value of $(foo) +# make ++foo : idem but verbose, i.e. foo=$(foo) +++%: varname=$(subst +,,$@) +++%: + @echo "$(varname)=$($(varname))" ++%: varname=$(subst +,,$@) ++%: + @echo "$($(varname))"