# # This makefile chunk is intended to ease my work on packages. I hope it can # reveal useful to other people too. But if you see some cruft here and # there, you'll know why ;) # # Several of the package I work on (shadow, most of the pkg-grid alioth # project) use quilt to manage diff onto upstream tarball. # # We only store the debian directory in the SCM since all changes must be # done as patch managed by quilt. # # This makefile is intended to be copied in the directory containing the # debian/ tree. It can: # # - Download the upstream tarball and open it on need # * Define the SITE variable to tell it where to search for it (with wget) # * The package name is guessed from the current directory, but can be # explicitely given as the PKG variable. # * The verion number must be given as VER variable # # - Copy the debian directory onto the working directory # (yeah, cp debian/ $(PKG)-$(VER)/debian. I see you're following) # # - Build the package, capturing the output with script # # - Ensure that just after the package build, we have such a link: # $(PKG)-$(VER)/debian/patches -> debian/patches # So, changes to the patches with quilt gets saved out of the # $(PKG)-$(VER) tree, which can be erased at any time without loss. # Of course, just before the build, the makefile ensures that this link # is replaced by a copy of the debian/patches directory to make # dpkg-buildpackage happy # TARGETS: # # deb: Do what's documented above. # # debsign: don't add -us -uc to dpkg-buildpackage invocation # check-complet: for multi-binary packages, make sure that all the content # of debian/tmp gets moved away [to the right place] by dh_install # check-lintian: # check-linda: # check: all of the check-* above # scan or watch: watch for new upstream tarballs # VARIABLES which you can use to configure stuff: # # PKG: package name (defaults to the current directory name) # VER: package version (defaults to the changelog entry in debian/changelog) # UP_TAR: name of the tarfile, as called upstream # Defaults to $(PKG)-$(UP_VER).tar.gz where UP_VER is VER without -nn part # Useful to get it downloaded and/or opened automatically # EXTRA_OPEN_CMD: what to do after untarring upstream tarball. # When upstream tarball doesn't contain a gentle $(PKG)-$(UP_VER) as # expected by dpkg-buildpackage, do this: # EXTRA_OPEN_CMD=mv the_funky_dir_name_given_upstream $(PKG)-$(UP_VER) # SITE: where to get the upstream tarball (we do "wget $(SITE)/$(UP_TAR)") # # CAVEATS: # # - $(PKG)-$(VER) is not considered as precious at all. Don't change # anything in it. In particular, don't change $(PKG)-$(VER)/debian files. ############## ### That's it. ### The actual makefile chunk follows, but you shouldn't need to dig into it ############## PKG?=$(shell pwd |sed 's|.*/||') VER?=$(shell dpkg-parsechangelog -ldebian/changelog|grep '^Version'|sed -e 's/[^ ]* //' -e 's/[^:]://') UP_VER=$(shell echo $(VER)|sed 's/-.*$$//') UP_TAR?=$(PKG)-$(UP_VER).tar.gz ######################################################## ##################### BUILD TARGET ##################### ######################################################## deb:: $(PKG)-$(UP_VER) stamp-debdir $(PKG)_$(UP_VER).orig.tar.gz @echo XXXXXXXXXXX Build the deb rm -rf $(PKG)-$(UP_VER)/debian/patches @if [ -e debian/patches ] ; then \ echo "cp -r debian/patches $(PKG)-$(UP_VER)/debian"; \ cp -r debian/patches $(PKG)-$(UP_VER)/debian; \ fi -cd $(PKG)-$(UP_VER) && script -c "dpkg-buildpackage -rfakeroot -uc -us" ../build.log @if [ -e debian/patches ] ; then \ rm -rf $(PKG)-$(UP_VER)/debian/patches ; \ echo "Link patches/ to ../debian/patches" ; \ cd $(PKG)-$(UP_VER)/debian ; \ ln -s ../../debian/patches .; \ fi debsign:: $(PKG)-$(UP_VER) stamp-debdir $(PKG)_$(UP_VER).orig.tar.gz @echo XXXXXXXXXXX Build the deb rm -rf $(PKG)-$(UP_VER)/debian/patches @if [ -e debian/patches ] ; then \ echo "cp -r debian/patches $(PKG)-$(UP_VER)/debian"; \ cp -r debian/patches $(PKG)-$(UP_VER)/debian; \ fi cd $(PKG)-$(UP_VER) && script -c "dpkg-buildpackage -rfakeroot" ../build.log @if [ -e debian/patches ] ; then \ rm -rf $(PKG)-$(UP_VER)/debian/patches ; \ echo "Link patches/ to ../debian/patches" ; \ cd $(PKG)-$(UP_VER)/debian ; \ ln -s ../../debian/patches .; \ fi $(PKG)-$(UP_VER):: $(UP_TAR) @echo XXXXXXXXXXX Open the tarball rm -rf $(PKG)-$(UP_VER) tar xfz $(UP_TAR) $(EXTRA_OPEN_CMD) $(UP_TAR):: @echo XXXXXXXXXXX Download the tarball @if test -e $(UP_TAR) ; then \ echo "Tarball found; no download needed."; \ else \ if test "x$(SITE)" = x ; then \ echo "Unable to download $(UP_TAR) since no SITE is provided";\ echo "Either edit Makefile or download the tarball yourself";\ exit 1;\ else \ wget -nd $(SITE)/$(UP_TAR);\ fi\ fi stamp-debdir: FORCE @echo XXXXXXXXXXX Put the debian dir in position rm -rf $(PKG)-$(UP_VER)/debian cp -Lr debian $(PKG)-$(UP_VER)/debian for i in CVS .svn \{arch\} .arch-ids ; do \ find $(PKG)-$(UP_VER)/debian -type d -name $$i | xargs rm -rf ; \ done for i in .cvsignore svn-commit.tmp .arch-inventory ; do \ find $(PKG)-$(UP_VER)/debian -type f -name $$i | xargs rm -f ; \ done touch stamp-debdir $(PKG)_$(UP_VER).orig.tar.gz: $(UP_TAR) @echo XXXXXXXXXXX Copy the orig.tar.gz cp $(UP_TAR) $(PKG)_$(UP_VER).orig.tar.gz FORCE: ######################################################## ##################### CHECK TARGET ##################### ######################################################## check-complet: FORCE @echo XXXXXXXXXXX Check the package for completness @for file in `find $(PKG)-$(UP_VER)/debian/tmp -type f|\ sed 's|$(PKG)-$(UP_VER)/debian/tmp/||'` ; do \ where=`find $(PKG)-$(UP_VER)/debian/*|\ grep -v '$(PKG)-$(UP_VER)/debian/tmp'|\ grep $$file|\ sed -e "s|$(PKG)-$(UP_VER)/debian/||" \ -e 's|\([^/]*\)/.*|\1|' `; \ if [ "x$$where" = x ] ; then \ base=`basename $$file`; \ where=`find $(PKG)-$(UP_VER)/debian/*|\ grep -v '$(PKG)-$(UP_VER)/debian/tmp'|\ grep $$base|\ sed -e "s|$(PKG)-$(UP_VER)/debian/||" `; \ if [ "x$$where" = x ] ; then \ echo "Not Found $$file"; \ else \ echo "NOT FOUND $$file (beside $$where)"; \ fi \ else \ echo Found $$file in $$where >/dev/null; \ fi;\ done check-relocation: FORCE @echo XXXXXXXXXXX Check the relocation of the package @for pkg in `grep Package $(PKG)-$(UP_VER)/debian/control|\ sed 's|Package: ||'` ; do \ echo "XXX check $$pkg"; \ LC_ALL=C grep -r $(PWD) $(PKG)-$(UP_VER)/debian/$$pkg |\ while read line ; do \ if echo $$line|grep -q 'Binary file' >/dev/null ; then \ name=`echo $$line|sed 's/Binary file \([^ ]*\) .*$$/\1/'`; \ echo " Binary $$name =>";\ strings $$name |grep $(PWD)|\ grep -v '.c$$'|sed 's/^/ /';\ else \ echo " $$line"; \ fi; \ done; \ done check-relocation-old: FORCE @echo XXXXXXXXXXX Check the relocation of the package @for pkg in `grep Package $(PKG)-$(UP_VER)/debian/control|\ sed 's|Package: ||'` ; do \ echo "XXX check $$pkg"; \ LC_ALL=C grep -r $(PWD) $(PKG)-$(UP_VER)/debian/$$pkg|\ sed 's/^/ /';\ done check-lintian: FORCE @echo XXXXXXXXXXX Check the package with lintian lintian -i *.deb lintian -i *.dsc check-linda: FORCE @echo XXXXXXXXXXX Check the package with linda linda -i *.deb linda -i *.dsc check: check-complet check-linda check-lintian ########################################################## ##################### REMOTE TARGETS ##################### ########################################################## HOST ?= veloce.inria.fr remote-real: FORCE @echo XXXXXXXXXXX Build on $(HOST) @if [ `ls *.dsc |wc -l` -gt 1 ] ; then \ echo "There is several dsc files. Please cleanup"; \ exit 1; \ fi files=`cat *.dsc| \ grep-dctrl -s Files -e -FSource . -n| \ sed 's/^.*[^ ] *[^ ]* *\([^ ]*\)$$/\1/'`" "`ls *.dsc` ;\ ssh $(HOST) "rm -rf ~/remotebuild;mkdir ~/remotebuild" ; \ scp $$files $(HOST):~/remotebuild; \ ssh $(HOST) "cd remotebuild;dpkg-source -x *.dsc; cd $(PKG)-*; dpkg-buildpackage -rfakeroot -us -uc -B"; \ scp $(HOST):~/remotebuild/*.deb .; \ scp $(HOST):~/remotebuild/*.changes .; # dput local `ssh $(HOST) "cd ~/remotebuild; ls *.changes"` @echo ok; # gpg --decrypt - 2>/dev/null |\ alpha: FORCE HOST=veloce.inria.fr $(MAKE) remote-real ppc: FORCE HOST=valnure.cs.ucsb.edu $(MAKE) remote-real sparc: FORCE HOST=sperm.cs.ucsb.edu $(MAKE) remote-real sync: FORCE make -C ~/public_html publish remote: alpha ppc sparc sync ######################################################## ##################### CLEAN TARGET ##################### ######################################################## clean-dsc: FORCE @echo XXXXXXXXXXX Clean the old versions @while [ `ls *.dsc |wc -l` -gt 1 -o `ls *.changes |wc -l` -gt 1 ] ; do \ if [ `ls *.changes |wc -l` -gt 1 ] ; then \ echo "XXX Cleanup binaries";ls;\ changes=`ls *.changes|head -1`; \ list=`grep-dctrl -s Files -n . $$changes|\ sed 's/^ *//'|\ cut -d' ' -f5|\ grep -v '\.dsc$$'`;\ rm -i $$list $$changes; \ fi; \ \ if [ `ls *.dsc |wc -l` -gt 1 ] ; then \ echo "XXX Cleanup source";ls;\ dsc=`ls *.dsc|head -1`; \ list=`grep-dctrl -s Files -n . $$dsc|\ sed 's/^ *//'|\ cut -d' ' -f3|\ grep -v '\.orig\.tar\.gz$$'`; \ rm -i $$list $$dsc; \ fi; \ done clean: clean-dsc @echo XXXXXXXXXXX Clean the stamps rm -rf stamp-* maintainerclean: clean rm -rf *.deb *.diff.gz *.dsc *.changes *.upload rm -rf $(PKG)_$(UP_VER).orig.tar.gz $(PKG)-$(UP_VER) scan watch: uscan --check-dirname-regex 'PACKAGE' --check-dirname-level 2 --report .PHONY: FORCE scan watch clean clean-dsc ifneq (,$(wildcard makefile.override)) include makefile.override endif