new approach for debian packaging, sharing pieces across distributions. Still experimental, still only works for sid.

This commit is contained in:
Brian Warner 2009-08-18 12:05:27 -07:00
parent 24b1805ca0
commit 7dc17aa078
9 changed files with 192 additions and 39 deletions

View File

@ -404,7 +404,7 @@ deb-jaunty-head:
# new experimental debian-packaging-building target
.PHONY: EXPERIMENTAL-deb
EXPERIMENTAL-deb: is-known-debian-arch
misc/build-deb.sh
$(PYTHON) misc/build-deb.py $(ARCH)
# These targets provide for windows native builds

110
misc/build-deb.py Normal file
View File

@ -0,0 +1,110 @@
# invoke this with a specific python
import sys, shutil, os.path
from subprocess import Popen, PIPE
PYTHON = sys.executable
ARCH = sys.argv[1]
class SubprocessError(Exception):
pass
def get_output(*cmd, **kwargs):
tolerate_stderr = kwargs.get("tolerate_stderr", False)
print " " + " ".join(cmd)
p = Popen(cmd, stdout=PIPE)
(out,err) = p.communicate()
rc = p.returncode
if rc != 0:
print >>sys.stderr, err
raise SubprocessError("command %s exited with rc=%s", (cmd, rc))
if err and not tolerate_stderr:
print >>sys.stderr, "stderr:", err
raise SubprocessError("command emitted unexpected stderr")
print " =>", out,
return out
def run(*cmd, **kwargs):
print " " + " ".join(cmd)
# if "stdin" in kwargs:
# stdin = kwargs.pop("stdin")
# p = Popen(cmd, stdin=PIPE, **kwargs)
# p.stdin.write(stdin)
# p.stdin.close()
# else:
# p = Popen(cmd, **kwargs)
p = Popen(cmd, **kwargs)
rc = p.wait()
if rc != 0:
raise SubprocessError("command %s exited with rc=%s", (cmd, rc))
# the very first time you run setup.py, it will download+build darcsver and
# whatnot, emitting noise to stdout. Run it once (and throw away that junk)
# to avoid treating that noise as the package name.
run(PYTHON, "setup.py", "--name")
NAME = get_output(PYTHON, "setup.py", "--name").strip()
VERSION = get_output(PYTHON, "setup.py", "--version").strip()
TARBALL = "%s-%s.tar.gz" % (NAME, VERSION)
DEBIAN_TARBALL = "%s_%s.orig.tar.gz" % (NAME, VERSION)
BUILDDIR = "build/debian/%s-%s" % (NAME, VERSION)
run(PYTHON, "setup.py", "sdist", "--formats=gztar")
if os.path.exists("build/debian"):
shutil.rmtree("build/debian")
os.makedirs("build/debian")
shutil.copyfile("dist/%s" % TARBALL, "build/debian/%s" % DEBIAN_TARBALL)
run("tar", "xf", DEBIAN_TARBALL, cwd="build/debian")
# now modify the tree for debian packaging. This is an algorithmic way of
# applying the debian .diff, which factors out some of the similarities
# between various debian/ubuntu releases. Everything we do after this point
# will show up in the generated .diff, and thus form the debian-specific part
# of the source package.
DEBDIR = os.path.join(BUILDDIR, "debian")
os.makedirs(DEBDIR)
# The 'aliases' section in setup.cfg causes problems, so get rid of it. We
# could get rid of the whole file, but 1: find_links is still sort of useful,
# and 2: dpkg-buildpackage prefers to ignore file removal (as opposed to
# file-modification)
#os.unlink(os.path.join(BUILDDIR, "setup.cfg"))
SETUPCFG = os.path.join(BUILDDIR, "setup.cfg")
lines = open(SETUPCFG, "r").readlines()
f = open(SETUPCFG, "w")
for l in lines:
if l.startswith("[aliases]"):
break
f.write(l)
f.close()
for n in ["compat", "control", "copyright", "pycompat", "rules"]:
fn = "misc/debian/%s.%s" % (n, ARCH)
if not os.path.exists(fn):
fn = "misc/debian/%s" % n
assert os.path.exists(fn)
shutil.copyfile(fn, os.path.join(DEBDIR, n))
if n == "rules":
os.chmod(os.path.join(DEBDIR, n), 0755) # +x
# We put "local package" on the first line of the changelog entry to suppress
# the lintian NMU warnings (since debchange's new entry's "author" will
# probably be different than the what the debian/control Maintainer: field
# says)
DISTRIBUTION_MAP = {"sid": "unstable"}
run("debchange", "--create",
"--package", NAME,
"--newversion", VERSION+"-1",
"--distribution", DISTRIBUTION_MAP.get(ARCH, ARCH),
"local package: 'make deb' build", cwd=BUILDDIR)
# the package is ready to build. 'debuild' will produce the source package
# (.dsc+.diff.gz), then build the .deb and produce a .changes file ready for
# upload to an APT archive. The build log will go into a .build file.
run("debuild", "-uc", "-us", cwd=BUILDDIR)

View File

@ -1,38 +0,0 @@
#!/bin/bash
set -e
# $PYTHON and $ARCH must be set
if [ -z "$PYTHON" ]; then
PYTHON=python
fi
if [ -z "$ARCH" ]; then
echo "must set ARCH= before running this script"
exit 1
fi
NAME=$($PYTHON setup.py --name)
VERSION=$($PYTHON setup.py --version)
# actually, it's the debchange using a different author than the
# debian/control Maintainer: entry that makes lintian think this is an NMU.
# Put "local package" on the first line of the changelog entry to supress
# this warning.
TARBALL=${NAME}-${VERSION}.tar.gz
DEBTARBALL=${NAME}_${VERSION}.orig.tar.gz
DEBDIR=build/debian/${NAME}-${VERSION}
$PYTHON setup.py sdist --formats=gztar
rm -rf build/debian
mkdir -p build/debian
cp dist/$TARBALL build/debian/$DEBTARBALL
(cd build/debian && tar xf $DEBTARBALL)
zcat misc/debian/$ARCH.diff.gz | (cd $DEBDIR && patch -p1)
chmod +x $DEBDIR/debian/rules
# We put "local package" on the first line of the changelog entry to suppress
# the lintian NMU warnings (since debchange's new entry's "author" will
# probably be different than the what the debian/control Maintainer: field
# says)
echo "updating version to $VERSION-1"
(cd $DEBDIR && debchange --newversion $VERSION-1 "local package: 'make deb' build")
(cd $DEBDIR && debuild -uc -us)

1
misc/debian/compat Normal file
View File

@ -0,0 +1 @@
4

1
misc/debian/compat.sid Normal file
View File

@ -0,0 +1 @@
7

17
misc/debian/control.sid Normal file
View File

@ -0,0 +1,17 @@
Source: allmydata-tahoe
Section: python
Priority: optional
Maintainer: Brian Warner <warner@allmydata.com>
Homepage: http://allmydata.org/trac/tahoe
Build-Depends: debhelper (>= 5.0.37.2), cdbs (>= 0.4.43), python-central (>= 0.5), python-setuptools, python, python-dev, debhelper (>= 7)
Build-Depends-Indep: python-twisted-core
XS-Python-Version: 2.4,2.5,2.6
Standards-Version: 3.8.3
Package: allmydata-tahoe
Architecture: all
Depends: ${python:Depends}, python-twisted-core, python-twisted-names, python-twisted-web, python-foolscap (>= 0.4.1), python-openssl, python-nevow, python-simplejson (>= 1.4), python-zfec (>= 1.1), python-pycryptopp (>= 0.5.15), python-setuptools, ${misc:Depends}
Recommends:
XB-Python-Version: 2.4,2.5,2.6
Description: A secure distributed filesystem
Allmydata Tahoe

27
misc/debian/copyright Normal file
View File

@ -0,0 +1,27 @@
This package was debianized by Brian Warner <warner@allmydata.com>
The upstream source of this project is http://allmydata.org .
Copyright (c) 2006-2009
AllMyData, Inc.
You may use this package under the GNU General Public License, version 2 or, at
your option, any later version.
On Debian GNU/Linux systems, the complete text of the GNU General
Public License can be found in `/usr/share/common-licenses/GPL'.
This licence also comes with the added permission that you may link this
program with the OpenSSL library and distribute executables, as long as you
follow the requirements of this licence in regard to all of the software in
the executable aside from OpenSSL.
You may use this package under the Transitive Grace Period Public Licence,
version 1 or, at your option, any later version. The Transitive Grace Period
Public Licence has requirements similar to the GPL except that it allows you to
wait for up to twelve months after you redistribute a derived work before
releasing the source code of your derived work. See the file COPYING.TGPPL.html
for the terms of the Transitive Grace Period Public Licence, version 1.
(You may choose to use this package under the terms of either licence, at your
option.)

1
misc/debian/pycompat Normal file
View File

@ -0,0 +1 @@
2

34
misc/debian/rules.sid Normal file
View File

@ -0,0 +1,34 @@
#! /usr/bin/make -f
# Uncomment this to turn on verbose mode.
#export DH_VERBOSE=1
DEB_PYTHON_SYSTEM=pycentral
include /usr/share/cdbs/1/rules/debhelper.mk
include /usr/share/cdbs/1/class/python-distutils.mk
# this ought to be the name of the package that we're building, which is
# different on each tahoe branch. debian/control is the master: whatever
# package is listed in there will be built.
DEBNAME := $(firstword $(DEB_PACKAGES))
STAGING_DIR := $(CURDIR)/debian/$(DEBNAME)
DEB_INSTALL_DOCS_ALL := COPYING.TGPPL.html CREDITS NEWS README relnotes.txt \
docs misc/spacetime misc/cpu-watcher.tac
DEB_COMPRESS_EXCLUDE := .tac
install/$(DEBNAME)::
dh_install misc/munin/* usr/share/$(DEBNAME)/munin
chmod +x $(STAGING_DIR)/usr/share/$(DEBNAME)/munin/*
chmod -x $(STAGING_DIR)/usr/share/$(DEBNAME)/munin/*-conf
# the base rules do "python setup.py clean", which spuriously downloads and
# builds several setuptools-extensions eggs. The tahoe 'setup.py clean'
# leaves those and many other files in place, but its "make clean" does the
# right thing. Putting this double-colon rule after the 'include' statements
# above should ensure that it runs after the base rules.
clean::
$(MAKE) clean