= Example of pb usage with the buffer project = Buffer is a tool used by the MondoRescue project and I needed to create packages for it, in order to ease the installation of mondo on distributions as they require it. The first step is to create the project structure with the newproj command. For that to work you first need to edit your $HOME/.pbrc configuration file and add in it the following: {{{ pbconfurl buffer = svn+ssh://svn.mondorescue.org/mondo/svn/pb/projects/buffer/pbconf }}} Of course replace that reference by a reference to which you really have access in your case. Once done, ask pb to generate its structure, jst giving the name of the project (-p) and the release you're packaging (-r): {{{ pb -p buffer -r 1.19 newproj buffer Adding /users/bruno/pb/projects/buffer to SVN... A /users/bruno/pb/projects/buffer OK Updating /users/bruno/pb/projects/buffer... À la révision 456. OK Adding /users/bruno/pb/projects/buffer/pbconf to SVN... A /users/bruno/pb/projects/buffer/pbconf A /users/bruno/pb/projects/buffer/pbconf/1.19 A /users/bruno/pb/projects/buffer/pbconf/1.19/buffer.pb A /users/bruno/pb/projects/buffer/pbconf/1.19/buffer A /users/bruno/pb/projects/buffer/pbconf/1.19/buffer/rpm A /users/bruno/pb/projects/buffer/pbconf/1.19/buffer/rpm/buffer.spec A /users/bruno/pb/projects/buffer/pbconf/1.19/buffer/deb A /users/bruno/pb/projects/buffer/pbconf/1.19/buffer/deb/changelog A /users/bruno/pb/projects/buffer/pbconf/1.19/buffer/deb/control A /users/bruno/pb/projects/buffer/pbconf/1.19/buffer/deb/buffer.dirs A /users/bruno/pb/projects/buffer/pbconf/1.19/buffer/deb/buffer.docs A /users/bruno/pb/projects/buffer/pbconf/1.19/buffer/deb/compat A /users/bruno/pb/projects/buffer/pbconf/1.19/buffer/deb/rules A /users/bruno/pb/projects/buffer/pbconf/1.19/buffer/deb/copyright A /users/bruno/pb/projects/buffer/pbconf/1.19/buffer/pbfilter A /users/bruno/pb/projects/buffer/pbconf/1.19/pbfilter A /users/bruno/pb/projects/buffer/pbconf/1.19/pbfilter/novell.pbf A /users/bruno/pb/projects/buffer/pbconf/1.19/pbfilter/rpm.pbf A /users/bruno/pb/projects/buffer/pbconf/1.19/pbfilter/all.pbf A /users/bruno/pb/projects/buffer/pbconf/1.19/pbfilter/deb.pbf A /users/bruno/pb/projects/buffer/pbconf/1.19/pbfilter/md.pbf OK Updating /users/bruno/pb/projects/buffer/pbconf... À la révision 456. OK Checking in /users/bruno/pb/projects/buffer... Ajout buffer Ajout buffer/pbconf Ajout buffer/pbconf/1.19 Ajout buffer/pbconf/1.19/buffer.pb Ajout buffer/pbconf/1.19/pbfilter Ajout buffer/pbconf/1.19/pbfilter/all.pbf Ajout buffer/pbconf/1.19/pbfilter/deb.pbf Ajout buffer/pbconf/1.19/pbfilter/md.pbf Ajout buffer/pbconf/1.19/pbfilter/novell.pbf Ajout buffer/pbconf/1.19/pbfilter/rpm.pbf Ajout buffer/pbconf/1.19/buffer Ajout buffer/pbconf/1.19/buffer/deb Ajout buffer/pbconf/1.19/buffer/deb/changelog Ajout buffer/pbconf/1.19/buffer/deb/compat Ajout buffer/pbconf/1.19/buffer/deb/control Ajout buffer/pbconf/1.19/buffer/deb/copyright Ajout buffer/pbconf/1.19/buffer/deb/buffer.dirs Ajout buffer/pbconf/1.19/buffer/deb/buffer.docs Ajout buffer/pbconf/1.19/buffer/deb/rules Ajout buffer/pbconf/1.19/buffer/pbfilter Ajout buffer/pbconf/1.19/buffer/rpm Ajout buffer/pbconf/1.19/buffer/rpm/pkg1.spec Transmission des données .............. Révision 457 propagée. OK Updating /users/bruno/pb/projects/buffer... À la révision 457. OK Project: buffer Action: newproj }}} Now you "just" need to edit those configuration files to review them and prepare your build of packages. Begining with the first one, the project's conf file: {{{ grep -Ev '^#|^$' buffer/pbconf/1.19/buffer.pb pburl buffer = http://hello-penguin.com/software/buffer/buffer-1.19.tar.gz pbrepo buffer = ftp://ftp.mondorescue.org pbwf buffer = 1 pbpackager buffer = Bruno Cornec sshhost buffer = www.mondorescue.org sshlogin buffer = buffer sshdir buffer = /mondo/ftp sshport buffer = 22 projver buffer = 1.19 projtag buffer = 1 testver buffer = true defpkgdir buffer = dir-buffer }}} pbrepo indicates where the resulting packages will be available for download. pbwf indicates whether the tar file is well-formed (it should contain a directory with name-version). The ssh* variables indicates where will packages be uploaded at the end of the build. And the name of the directory for defpkgdir is not important as we do not deal with a local CMS. We also need to adapt the filter a bit: {{{ grep -Ev '^#|^$' buffer/pbconf/1.19/pbfilter/* buffer/pbconf/1.19/pbfilter/all.pbf:filter PBREPO = $pbrepo buffer/pbconf/1.19/pbfilter/all.pbf:filter PBSRC = src/%{name}-%{version}.tar.gz buffer/pbconf/1.19/pbfilter/all.pbf:filter PBVER = $pbver buffer/pbconf/1.19/pbfilter/all.pbf:filter PBDATE = $pbdate buffer/pbconf/1.19/pbfilter/all.pbf:filter PBLOG = yes buffer/pbconf/1.19/pbfilter/all.pbf:filter PBTAG = $pbtag buffer/pbconf/1.19/pbfilter/all.pbf:filter PBREV = $pbrev buffer/pbconf/1.19/pbfilter/all.pbf:filter PBPKG = $pbpkg buffer/pbconf/1.19/pbfilter/all.pbf:filter PBPACKAGER = $pbpackager buffer/pbconf/1.19/pbfilter/all.pbf:filter PBDESC = This is a program designed to speed up writing tapes on remote tape drives. When this program is put "in the pipe", two processes are started. One process reads from standard-in and the other writes to standard-out. Both processes communicate via shared memory. buffer/pbconf/1.19/pbfilter/all.pbf:filter PBURL = http://hello-penguin.com/software/buffer buffer/pbconf/1.19/pbfilter/deb.pbf:filter PBGRP = utils buffer/pbconf/1.19/pbfilter/md.pbf:filter PBGRP = Archiving/Backup buffer/pbconf/1.19/pbfilter/novell.pbf:filter PBGRP = Productivity/Archiving/Backup buffer/pbconf/1.19/pbfilter/rpm.pbf:filter PBGRP = Applications/Archiving buffer/pbconf/1.19/pbfilter/rpm.pbf:filter PBSUF = $pbsuf }}} This defines all the macro that are needed to do a build. Then adapt the spec file if you're on a rpm based distro, or the control file if under a deb one. I'm using Mandriva so go for the spec: {{{ grep -Ev '^#|^$' buffer/pbconf/1.19/buffer/rpm/buffer.spec Summary: buffer speeds up writing tapes on remote tape drives Summary(fr): buffer accélère l'écriture des bande sur des périphériques distants Name: PBPKG Version: PBVER Release: PBTAGPBSUF License: PBLIC Group: PBGRP Url: PBURL Source: PBREPO/PBSRC BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(id -u -n) %description PBDESC %description -l fr buffer accélère l'écriture des bande sur des périphériques distants %prep %setup -q %build make %{?_smp_mflags} %install %{__rm} -rf $RPM_BUILD_ROOT install -m 755 -D buffer $RPM_BUILD_ROOT%{_bindir}/buffer install -m 644 -D buffer.man $RPM_BUILD_ROOT%{_mandir}/man1/buffer.1 %clean %{__rm} -rf $RPM_BUILD_ROOT %files %defattr(-,root,root) %doc ChangeLog %doc COPYING README AUTHORS NEWS %{_bindir}/buffer %{_mandir}/man1/buffer.1* %changelog PBLOG }}} As you can see globally only few changes :-) Now it's time to test the result of our configuration: {{{ pb -p buffer cms2build Project: buffer Action: cms2build Packages: buffer Management of buffer 1.19-1 (rev flat) ... 2008-05-30 02:18:28 URL:http://hello-penguin.com/software/buffer/buffer-1.19.tar.gz [17920/17920] -> "/users/bruno/tmp/pb.jh8U7Q7VdP/buffer-1.19.tar.gz" [1] OK Extracting /users/bruno/tmp/pb.jh8U7Q7VdP/buffer-1.19.tar.gz in /users/bruno/pb/projects/buffer/delivery... OK Generating fake ChangeLog for test version Build files generated for debian-3.1,debian-4.0,fedora-4,fedora-5,fedora-6,fedora-7,fedora-8,fedora-9,mandrake-10.1,mandrake-10.2,mandriva-2006.0,mandriva-2007.0,mandriva-2007.1,mandriva-2008.0,mandriva-2008.1,redhat-7.3,redhat-9,rhel-3,rhel-4,rhel-5,sles-10,sles-9,suse-10.0,suse-10.1,suse-10.2,suse-10.3,ubuntu-6.06,ubuntu-7.04,ubuntu-7.10,ubuntu-8.04 No Build files found for gentoo-nover Creating buffer tar files compressed... OK Under /users/bruno/pb/projects/buffer/delivery/buffer-1.19.tar.gz }}} So far so good. We now have a new tar file which contains all the build files expanded for the various distribution supported (even if some of them are not ready yet e.g. .deb in our case). Go one step further: {{{ pb -p buffer build2pkg Project: buffer Action: build2pkg Packages: buffer Extracting build files... OK Building package with /users/bruno/pb/projects/buffer/build/SPECS/buffer.spec under /users/bruno/pb/projects/buffer/build... Executing(%prep): /bin/sh -e /users/bruno/pb/projects/buffer/build/tmp/rpm-tmp.85498 + umask 022 + cd /users/bruno/pb/projects/buffer/build/BUILD + '[' 1 -eq 1 ']' + '[' 1 -eq 1 ']' + '[' 1 -eq 1 ']' + cd /users/bruno/pb/projects/buffer/build/BUILD + rm -rf buffer-1.19 + /usr/bin/gzip -dc /users/bruno/pb/projects/buffer/build/SOURCES/buffer-1.19.tar.gz + tar -xf - + STATUS=0 + '[' 0 -ne 0 ']' + cd buffer-1.19 + exit 0 Executing(%build): /bin/sh -e /users/bruno/pb/projects/buffer/build/tmp/rpm-tmp.85498 + umask 022 + cd /users/bruno/pb/projects/buffer/build/BUILD + cd buffer-1.19 + '[' 1 -eq 1 ']' + '[' 1 -eq 1 ']' + make -j4 gcc -Wall -O6 -fomit-frame-pointer -c -o buffer.o buffer.c gcc -Wall -O6 -fomit-frame-pointer -c -o sem.o sem.c sem.c:108: attention : return type defaults to ‘int’ sem.c: In function ‘do_sem’: sem.c:120: attention : implicit declaration of function ‘getpid’ sem.c:124: attention : ‘return’ with no value, in function returning non-void buffer.c:133: erreur: conflicting types for ‘shmat’ /usr/include/sys/shm.h:58: erreur: previous declaration of ‘shmat’ was here buffer.c: In function ‘main’: buffer.c:274: attention : implicit declaration of function ‘exit’ buffer.c:274: attention : incompatible implicit declaration of built-in function ‘exit’ buffer.c: In function ‘parse_args’: buffer.c:297: attention : implicit declaration of function ‘atoi’ buffer.c: In function ‘buffer_allocate’: buffer.c:515: attention : format ‘%08x’ expects type ‘unsigned int’, but argument 4 has type ‘char *’ buffer.c:520: attention : implicit declaration of function ‘bzero’ buffer.c:520: attention : incompatible implicit declaration of built-in function ‘bzero’ buffer.c: In function ‘fill_block’: buffer.c:695: attention : incompatible implicit declaration of built-in function ‘bzero’ buffer.c: In function ‘byee’: buffer.c:874: attention : incompatible implicit declaration of built-in function ‘exit’ buffer.c:878: attention : incompatible implicit declaration of built-in function ‘exit’ make: *** [buffer.o] Erreur 1 make: *** Attente des tâches non terminées.... error: Bad exit status from /users/bruno/pb/projects/buffer/build/tmp/rpm-tmp.85498 (%build) RPM build errors: Bad exit status from /users/bruno/pb/projects/buffer/build/tmp/rpm-tmp.85498 (%build) child (rpmbuild --define 'packager Bruno Cornec ' --define "_topdir /users/bruno/pb/projects/buffer/build" -ba /users/bruno/pb/projects/buffer/build/SPECS/buffer.spec) exited with value 1 Checking validity of rpms with rpmlint... Error: no installed packages by name RPMS/*/buffer-1.19-1.mdv2008.1.*.rpm Error: no installed packages by name SRPMS/buffer-1.19-1.mdv2008.1.src.rpm OK }}} Ok, some patches seem to be required to be able to compile and link cleanly that application on my new shiny Mandriva 2008.1.