March 10, 2014
Suppose you're running Ubuntu and want to get a newer version of a package than what's provided by Ubuntu. The process of re-building a newer version of a package from a newer version of the Distro is called "backporting." This can become very dangerous if you start backporting highly-dependent packages like python, so just don't do that. Try to keep to the leaves of your distro's dependency tree.
As a specific example, I run Ubuntu 12.04 ("precise"), which comes with nose
version 1.1.2-3, but I want something newer so that I can use the --cover-xml
option! This option was introduced at https://github.com/nose-devs/nose/commit/868ce889f1b6cf6423fdd56fbc90058c2f4895d8 and first released in 1.2.
I want to backport nose >= 1.2
to Ubuntu Precise.
http://archive.ubuntu.com/ubuntu/pool/main/n/nose/nose_1.3.0-2.dsc
sudo apt-get install devscripts pbuilder
sudo pbuilder --create --distribution precise
dget http://archive.ubuntu.com/ubuntu/pool/main/n/nose/nose_1.3.0-2.dsc
sudo pbuilder --build --distribution precise nose_1.3.0-2.dsc
If all went well, you should now have some .deb files in /var/cache/builder/result!
If you're like me and everything did NOT go well because you tried this in a VM with only 512MB RAM, you probably got some test failures like this:
====================================================================== FAIL: Doctest: test_issue270.rst ---------------------------------------------------------------------- Traceback (most recent call last): File "/usr/lib/python3.2/doctest.py", line 2153, in runTest raise self.failureException(self.format_failure(new.getvalue())) AssertionError: Failed doctest test for test_issue270.rst File "/tmp/buildd/nose-1.3.0/build/tests/unit_tests/test_issue270.rst", line 0 ---------------------------------------------------------------------- File "/tmp/buildd/nose-1.3.0/build/tests/unit_tests/test_issue270.rst", line 17, in test_issue270.rst Failed example: run(argv=argv, plugins=[MultiProcess()]) Exception raised: Traceback (most recent call last): File "/usr/lib/python3.2/doctest.py", line 1288, in __run compileflags, 1), test.globs) File "", line 1, in run(argv=argv, plugins=[MultiProcess()]) File "/tmp/buildd/nose-1.3.0/build/tests/nose/plugins/plugintest.py", line 412, in run_buffered run(*arg, **kw) File "/tmp/buildd/nose-1.3.0/build/tests/nose/plugins/plugintest.py", line 372, in run buffer = Buffer() File "/tmp/buildd/nose-1.3.0/build/tests/nose/plugins/plugintest.py", line 130, in __init__ self.__queue = Manager().Queue() File "/usr/lib/python3.2/multiprocessing/__init__.py", line 98, in Manager m.start() File "/usr/lib/python3.2/multiprocessing/managers.py", line 527, in start self._process.start() File "/usr/lib/python3.2/multiprocessing/process.py", line 132, in start self._popen = Popen(self) File "/usr/lib/python3.2/multiprocessing/forking.py", line 121, in __init__ self.pid = os.fork() OSError: [Errno 12] Cannot allocate memory ----------------------------------------------------------------------
Warning!
You should be very careful when installing them since they are unvalidated backports and may break things unexpectedly. Keeping to dependency tree leaves is one way to mitigate this, since nothing in the distro itself depends them. It is then up to you to make sure any software you use works nicely with the backported software. This is not limited just .debs, but could be Python applications, production services, or even just some scripts you whipped up and forgot about until you need them to bring the site back up.