A naming problem was identified that would prevent upgrading and distributing the packages accross multiple distributions. A new naming convention is proposed for discussion, based on the Debian GNU/Linux backport conventions. The 1.2.40 release of the packaging-farm was published with a documentation for the packaging-farm.conf configuration file and support for Ubunutu natty.
package names and multiple distributions
As it is, packaging-farm will create packages with names that are not dependent on the distribution. It creates a problem that is immediately visible when trying to build a repository that includes all the packages: the pool can only accomodate for a single package with a given name.
When building packages for multiple distributions, packaging-farm should rename the packages built so that they carry the distribution name. The names must compare in the same order as the distribution chronology. For instance, foo-1.2-1 would be renamed into foo-1.2-1~3wheezy. Such a behavior is intrusive and may not be appropriate if building for a single distribution. The proposed names are as follow, for each of the supported distributions, following the Debian GNU/Linux backport naming scheme, with the distribution name added for clarity:
* Ubuntu ** natty = ~bpo1104natty+1 ** maverick = ~bpo1010maverick+1 ** lucid = ~bpo1004lucid+1 ** etc. * Debian GNU/Linux ** wheezy = ~bpo70wheezy+1 ** squeeze = ~bpo60squeeze+1 ** lenny = ~bpo50lenny+1 ** etch = ~bpo40etch+1 ** etc.
For the record, here is the chat log that led to the proposal above.
(10:29:46 AM) loicd: Hi, I'm facing a problem organizing repositories made with reprepro. A package (the name is xivo) is fit to build for Debian wheezy, unstable & Ubunty maverick and naty, for i386 & amd64, without requiring any change. Because reprepro uses a pool to store the packages, these four packages (for wheezy, unstable, maverick & naty) cannot coexist with the exact same name. I could either a) change the package name by adding the target distribution although these packages are strictly identical, b) make a separate repository for each distribution (which still is useful to aggregate the various architectures). Do you have any advice ? (10:30:43 AM) twb: FWIW I just use apt-ftparchive (10:31:44 AM) twb: http://paste.debian.net/115729/ (10:31:49 AM) twb: Not very nice, but it does the job (10:32:51 AM) loicd: twb: you mean that it is imune to this kind of trouble (the pool) ? (10:34:57 AM) twb: Basically each dir is an apt repo (10:35:26 AM) twb: So instead of dists/ and pool/x/xivo, you'd just have xivo/ as a repo, and you can point whatever distros you want at it (10:41:02 AM) loicd: twb: it looks like what I'm after. One drawback of having the same package name for two distro is upgrade. The following use case is broken : a) install wheezy + xivo, b) upgrade to unstable => xivo does not get upgraded. Although the source packages are the same, the resulting .deb are different because the context is different. The ideal situation would be to be able to create .deb with a name that contains the distro in such a way that it upgrades. (10:41:54 AM) ***OdyX does -1 upload to Debian, then -1~n0 to natty, -1~m0 to maverick -1~l0 to lucid. (10:44:39 AM) loicd: OdyX: smart :-) (10:45:24 AM) OdyX: loicd: more or less ~. It means you have to rebuild+upload each time (only source if you upload to PPAs) (10:46:55 AM) loicd: twb: I actually have the same problem with squeeze + wheezy. (10:47:09 AM) twb: loicd: squeeze is BPO's problem, not yours :P (10:47:20 AM) loicd: -1~s0 = squeeze, -1~w0 (10:47:24 AM) loicd: that works too (11:10:37 AM) loicd: twb: actually, it is. The vendor of the software needs to provide squeeze backports to its clients. This happens usually in a rush and before it becomes available to bpo. It actually is a concern shared by most software vendors : the delays between meeting the client request and meeting the debian requirements do not always match. (11:41:55 AM) loicd: I think I will go for names that use the version number to ensure it compares as expected foo-1.2-1 => foo-1.2-1~7.0wheezy ( wheezy = ~7.0wheezy, squeeze = ~6.0squeeze, lenny = ~5.0lenny etc.). What do you think ? (11:42:31 AM) daemonkeeper: why use the codename at all then? (11:43:45 AM) twb: If the backport doesn't involve a source package change, I don't really see why it's necessary to fuck about at all (11:45:14 AM) pabs: loicd: don't you want dch --bpo? (11:45:53 AM) loicd: daemonkeeper: for readability. I agree it's redundant. (11:46:06 AM) loicd: but it will help the customer support, I suppose (11:48:37 AM) loicd: twb: because the dependencies change and the binary packages being built are actually different. I agree that it would be completly pointless if they were python sources for instance. But in the case of compiled binaries, if the distribution is being upgraded the binary package must also be upgraded. If it had the same name it would not upgrade and be broken. (11:49:05 AM) twb: loicd: ah right (12:07:54 PM) loicd: pabs: thanks for pointing out bpo. I will follow the bpo naming scheme so that it's compatible with bpo. And it's a lot better to adopt an existing convention ;-) http://backports.debian.org/Contribute/#index5h3 :-)
natty support and documentation
Support for natty was added by creating a virtual machine using the server distribution and creating i386 and x86_64 chroots with:
pbuilder --create --architecture i386 --basetgz /var/cache/pbuilder/natty-i386.tgz pbuilder --create --architecture amd64 --basetgz /var/cache/pbuilder/natty-amd64.tgz
and untaring them into the packaging-farm rsync repository for i386 and x86_64.
The content of the packaging-farm.conf was documented as a manual page:
NAME packaging-farm.conf - define the default environment to build a package DESCRIPTION The packaging-farm command uses makefiles to run. Each package defines variables to influence the way it is built, as described in the packag- ing-farm(1) manual page. The packaging-farm.conf file is included before the package specific makefile and can be used to define vari- ables common to all packages. The packaging-farm.conf is a makefile and its syntax depends on GNU make There are no default values. If a variable is commented out, it will be set to a value that triggers an error. The default packaging-farm.conf file distributed contains sensible defaults, there is no fallback. If they are removed, it is presumably because of a typo or an error and it needs to trigger an error instead of silently falling back on an unex- pected default. VARIABLES For each variable listed below, the values that can be used are listed in the comments of the distributed packaging-farm.conf file. It is important to check that a variable does not contain a trailing space. Otherwise it will be used and lead to unexpected results. DISTRIBUTIONS is the white space separated list of distributions for which a package must be built. ARCHITECTURES is the white space separated list of architectures for which a package must be built. For each DISTRIBUTION, the package will be built for all ARCHITECTURES. For instance if DISTRIBUTIONS contains squeeze and maverick and ARCHITECTURES contains i386 and x86_64, the package will be built for squeeze+i386, squeeze+x86_64, maverick+i386 and maverick+x86_64. There is no way to ask that only i386 is built for squeeze and only x86_64 is built for maverick. PACKAGES The list of the packages for which dependencies must be calcu- lated with packaging-farm depends so that package1 is always built before package2 if package2 depends on package1. It is recommended to not manually set this variable. Instead, the ${CACHEDIR}/build (which is usually /var/cache/packaging-farm/build ) should only contain directo- ries matching the names of the packages to work on. And the variable can be set with: PACKAGES=$(shell ls ${CACHEDIR}/build) AUFS The AUFS File System (http://aufs.sourceforge.net/) is used by the packaging farm to create a local copy of a chroot with a minimum overhead. If not available (value set to no) a rsync based copy will be used instead. This uses a lot more disk space. On Debian GNU/Linux, aufs is usually available by default and can be loaded with modprobe aufs CHROOT_WANTED The list of chroot that must be loaded in order to build the packages. They are retrieved from rsync://packaging- farm.dachary.org/packaging-farm via the command: packaging-farm chroot-master-sync For instance CHROOT_WANTED=debian/i386/squeeze debian/x86_64/squeeze will retrieve squeeze for the i386 and x86_64 architectures. The chroot repository can be browsed via the web at http://packag- ing-farm.dachary.org/chroot/. The available chroot must cover all combinations of the DISTRIBUTIONS and ARCHITECTURES vari- ables, both in the packaging-farm.conf file and in the invivid- ual makefiles of each package. For instance, if a packaging- farm.conf has DISTRIBUTIONS=squeeze ARCHITECTURES=i386 only but a package overrides this with DISTRIBUTIONS=wheezy packaging- farm will need debian/i386/wheezy to build it. If the distribu- tion is omitted, all chroot for a given architecture will be retrieved. packaging-farm CHROOT_WANTED=debian/i386 chroot-master-sync A cron job will synchronize on a daily basis. There is no need to manually run the synchronization, unless a specific update is needed immediately. After being copied, the chroot will get the /etc/resolv.conf file from the host. CHROOT_ROOT Directory in which copies of the CHROOT_WANTED are kept. As of May, 2011, if CHROOT_WANTED=debian it will use 5GB. SUBMIT The suffix of the submit script that will be used when running: packaging-farm submit The action is carried out by as script named after this vari- able. /var/lib/packaging-farm/submit/submit-${SUBMIT}.sh TROUBLESHOOTING check for trailing spaces in variable values DISTRIBUTIONS=A B with a trailing space is different from DIS- TRIBUTIONS=A B withing a trailing space and will lead to unex- pected behavior. SEE ALSO submit-xivo.sh(1), packaging-farm(1) AUTHORS Loic Dachary <loic@dachary.org> local packaging-farm.conf(5)
The default packaging-farm.conf file was self documented and set with default
values so that the user only need to copy/paste from it without a need to actually
understand the details.
######################################################################## # # White space separated list of the distributions for which the packages # must be built. # There must be NO SPACE at the end of the line # # DISTRIBUTIONS=lenny squeeze wheezy unstable maverick natty # DISTRIBUTIONS=unstable # ######################################################################## # # White space separated list of the distributions for which the packages # must be built. # There must be NO SPACE at the end of the line # # ARCHITECTURES=i386 x86_64 # ARCHITECTURES=x86_64 # ######################################################################## # # The list of the packages for which dependencies must be calculated # with # # packaging-farm depends # # so that package1 is always built before package2 if package2 depends # on package1. It is recommended to not manually set this variable. # Instead, the ${CACHEDIR}/build (which is usually # /var/cache/packaging-farm/build ) should only contain directories # matching the names of the packages to work on. # There must be NO SPACE at the end of the line # # PACKAGES=package1 package2 # PACKAGES=$(shell ls ${CACHEDIR}/build) # ######################################################################## # # The AUFS File System (http://aufs.sourceforge.net/) is used by the # packaging farm to create a local copy of a chroot with a minimum # overhead. If not available (value set to no) a rsync based copy will # be used instead. This uses a lot more disk space. # On Debian GNU/Linux, aufs is usually available by default and # can be loaded with modprobe aufs # #AUFS=yes AUFS=no # ######################################################################## # # The list of chroot that must be loaded in order to build the # packages. They are retrieved from rsync://packaging-farm.dachary.org/packaging-farm # For instance: # CHROOT_WANTED=debian/i386/squeeze debian/x86_64/squeeze # will retrieve squeeze for the i386 and x86_64 architectures. # # The values are: # # debian/i386/lenny # debian/i386/maverick # debian/i386/natty # debian/i386/squeeze # debian/i386/unstable # debian/i386/wheezy # debian/x86_64/lenny # debian/x86_64/maverick # debian/x86_64/natty # debian/x86_64/squeeze # debian/x86_64/unstable # debian/x86_64/wheezy # # There must be NO SPACE at the end of the line # # Retreive all of debian # CHROOT_WANTED=debian # Retreive all of i386 debian # CHROOT_WANTED=debian/i386 # Retreive all of x86_64 debian # CHROOT_WANTED=debian/x86_64 # CHROOT_WANTED=debian/x86_64/unstable # ######################################################################## # # Directory in which copies of the CHROOT_WANTED # are kept. # CHROOT_ROOT=/chroot # ######################################################################## # # The suffix of the submit script that will be used # when running: # # packaging-farm submit # ###### # Read man submit-xivo.sh(1) for more information # SUBMIT=xivo ##### # Not yet documented. # SUBMIT=pokersource # SUBMIT=none # ######################################################################## # # If set, the debsign(1) command will be called to # sign the package, if it is built successfully. # # debsign ${SIGN_debian} *.changes # # It should specify the key with which the package should be # signed. The meta-packages will use SIGN_WITH to sign # the packages. # #SIGN_debian=-kABCDEFGH SIGN_debian= # ######################################################################## # # Sign the packages of the repository created for a meta-package # See reprepro(1) for more information. # #SIGN_WITH=SignWith: yes SIGN_WITH= #