]> git.rkrishnan.org Git - tahoe-lafs/tahoe-lafs.git/commitdiff
new approach for debian packaging, sharing pieces across distributions. Still experim...
authorBrian Warner <warner@lothar.com>
Tue, 18 Aug 2009 19:05:27 +0000 (12:05 -0700)
committerBrian Warner <warner@lothar.com>
Tue, 18 Aug 2009 19:05:27 +0000 (12:05 -0700)
Makefile
misc/build-deb.py [new file with mode: 0644]
misc/build-deb.sh [deleted file]
misc/debian/compat [new file with mode: 0644]
misc/debian/compat.sid [new file with mode: 0644]
misc/debian/control.sid [new file with mode: 0644]
misc/debian/copyright [new file with mode: 0644]
misc/debian/pycompat [new file with mode: 0644]
misc/debian/rules.sid [new file with mode: 0644]

index 87895614a2a5e4251c7117510997f2509b8414fa..4cb82b1befd881c5a0ebf3d43acfd0b103be4312 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -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
diff --git a/misc/build-deb.py b/misc/build-deb.py
new file mode 100644 (file)
index 0000000..7c0015d
--- /dev/null
@@ -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)
diff --git a/misc/build-deb.sh b/misc/build-deb.sh
deleted file mode 100644 (file)
index e15d428..0000000
+++ /dev/null
@@ -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)
-
diff --git a/misc/debian/compat b/misc/debian/compat
new file mode 100644 (file)
index 0000000..b8626c4
--- /dev/null
@@ -0,0 +1 @@
+4
diff --git a/misc/debian/compat.sid b/misc/debian/compat.sid
new file mode 100644 (file)
index 0000000..7f8f011
--- /dev/null
@@ -0,0 +1 @@
+7
diff --git a/misc/debian/control.sid b/misc/debian/control.sid
new file mode 100644 (file)
index 0000000..ecdbee1
--- /dev/null
@@ -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
diff --git a/misc/debian/copyright b/misc/debian/copyright
new file mode 100644 (file)
index 0000000..d5834e6
--- /dev/null
@@ -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.)
diff --git a/misc/debian/pycompat b/misc/debian/pycompat
new file mode 100644 (file)
index 0000000..0cfbf08
--- /dev/null
@@ -0,0 +1 @@
+2
diff --git a/misc/debian/rules.sid b/misc/debian/rules.sid
new file mode 100644 (file)
index 0000000..7f12edf
--- /dev/null
@@ -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
+