# 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)
DISTRO := $(shell ./getdistro.sh)
RELEASE := $(shell ./getrelease.sh)
RPM-INSTALL-DEVEL := rpm --force -Uvh
+# cannot force rpm -e
+RPM-UNINSTALL-DEVEL := rpm -e
#################### Makefile
# Default target
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
@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
#
define stage1_variables
$(1).spec = $(notdir $($(1)-SPEC))
-$(1).specpath = SPECS/$(notdir $($(1)-SPEC))
+$(1).specpath = SPECS/$(1).spec
$(1).module = $(firstword $($(1)-MODULES))
endef
echo "%define distrorelease $(RELEASE)" >> $($(1).specpath)
echo "%define pldistro $(PLDISTRO)" >> $($(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))))
# 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)
# 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)
# 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"
# usage: build_binary_rpm package
# xxx hacky - invoke createrepo if DEPEND-FILES mentions RPMS/yumgroups.xml
mkdir -p BUILD 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)
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)
distclean: distclean1 distclean2
.PHONY: distclean1 distclean2 distclean
+develclean:
+ $(RPM-UNINSTALL-DEVEL) $(ALL-DEVEL-RPMS)
+
# xxx tmp - I cannot use this on my mac for local testing
ISMACOS=$(findstring Darwin,$(shell uname))
ifneq "$(ISMACOS)" ""
@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"