Compiling and installing a recent version of Mesa on Debian
This post is about how (and why) I recently produced my own Debian packages for a recent
upstream release of Mesa to work around a bug on my own machine. Though the
specifics are not specifically interesting, you may extrapolate my story to a more
general guide of what to do when you need to run an upstream software release that's too recent to
be packaged by Debian, and too complex to be easy to install by hand with make
install
.
I recently tried to figure out the source of weird crashes on my machine, which
runs Debian testing. I
understood from /var/log/syslog
that I was probably affected by
Bug #771045. From
the linked discussions it seemed that a
patch
in Mesa had a good chance of fixing the problem. The patch was part of
version 10.3.4 of Mesa, but Debian
testing only had 10.3.2-1, judging from the output of:
dpkg-query -l | grep -i mesa
So, if I wanted the patch, I needed to install manually a newer version of Mesa.
A first thing to check was whether it was not packaged in Debian unstable. I
have the unstable repository set up and pinned at a lower priority with the
following in /etc/apt/preferences.d/prefs
:
Package: *
Pin: release a=testing
Pin-Priority: 650
Package: *
Pin: release a=unstable
Pin-Priority: 600
I use this to manually install a recent version of iceweasel from unstable. Could it be the case that a recent Mesa was packaged in unstable? Alas, no, checking on a random mesa package among those at version 10.3.2-1:
apt-cache policy libegl1-mesa
libegl1-mesa:
Installed: 10.3.2-1
Candidate: 10.3.2-1
Version table:
*** 10.3.2-1 0
650 http://debian.proxad.net/debian/ testing/main amd64 Packages
600 http://cdn.debian.net/debian/ unstable/main amd64 Packages
100 /var/lib/dpkg/status
So here is how I manually compiled a more recent version. I was surprised to see how simple it turned out to be, in fact: precious little manual intervention is required.
Of course, a word of warning applies: make sure you will know how to fix your system if it gets broken by the home-made packages that you installed or by anything else you did.
I'm assuming that your machine's architecture is amd64
, otherwise what I say
later about compiling for i386
may make no sense.
You may need to start by installing some packages such as build-essential
if
you don't have them. Then, issue:
sudo apt-get build-dep libegl1-mesa
This will install1 the packages needed to compile Mesa.
Then, go to a fresh folder and download the sources for Mesa:
mkdir -p ~/mesa
cd ~/mesa
apt-get source libegl1-mesa
The source for the packaged version (10.3.2-1) should be downloaded.
You could then go in the source tree and run uscan
from the devscripts
package:
cd mesa-10.3.2
uscan
This would automatically search for a newer release on the Mesa website and
download it. However, it would pick the latest version (10.4.1
as of this
writing) for which the packaging wouldn't work as is. So instead, download
directly
Mesa 10.3.4,
the version that we want, from the official website,
and symlink it to the conventions used by the Debian tools.
cd ~/mesa
wget ftp://ftp.freedesktop.org/pub/mesa/older-versions/10.x/10.3.4/MesaLib-10.3.4.tar.gz
ln -s MesaLib-10.3.4.tar.gz mesa_10.3.4.orig.tar.gz
Now we can go back in the source tree for the old version, and use uupdate
to
unpack the new version and migrate the Debian-specific stuff. Then go to the new
source tree thus created:
cd mesa-10.3.2
uupdate ../mesa_10.3.4.orig.tar.gz
cd ../mesa-10.3.4
Now we are ready to start the compilation process:
debuild -us -uc
This should compile everything and take 10-30 minutes. If a problem occurs, you should have copious output to try to understand what went wrong. Otherwise, if all goes well, all the deb packages for the new version will have been generated in the parent folder. That was easy!2 :)
That's all nice and well, but then I realized that I needed the i386 version of
the packages, because I use Skype, whose "multiarch" package is actually i386.
How to cross-compile the packages? In fact, it's quite easy.
We will use pbuilder
to create a
chroot where the compilation can take place,
but everything is automatic:
sudo apt-get install pbuilder
sudo pbuilder --create --architecture i386
Now go in the source tree and issue3:
sudo pbuilder --build ../mesa_10.3.4-1.dsc
This should take care of everything. The packages will be produced in
/var/cache/pbuilder/result
.
Now you just have to figure out which packages you need to install (using
dpkg-query -l
) and install them with sudo dpkg -i
, then correct any
dependency problems with sudo apt-get -f install
. Alternatively, you can just
issue sudo debi -u
from the source tree, which should do those steps
automatically. However, I haven't tested it. Of course to install the i386
packages in this way you will need to move them, or let debi
know where to
find them.
Note that to avoid problems
it looks like it is safer to install all packages at once. If you run into file
conflicts between the i386 and amd64 packages, a solution may be to apt-get
remove
all the old versions and then install the new ones. Of course, this will
probably remove a bunch of useful packages on your system that depend on Mesa;
if you do this
should make sure that you have kept a trace of the packages that you will want
to reinstall afterwards, and also that you are confident using a tty or ssh if
your graphical environment breaks.
And, well, that's it. If you have installed the packages successfully, you can
just reboot. Then you can check in dpkg-query
that you are indeed using the
newer version of the packages, and double-check using:
glxinfo | grep -i version
Of course, if something went bad, maybe your system will not boot (or at least not boot graphically) and then it will be up to you to investigate. Hopefully removing the new packages and installing back the Debian ones should make things work again. :)
One last thing: hopefully, as the version numbers of your home-made Mesa packages correspond to
the actual version number of the release, apt-get upgrade
should move you to
the more recent versions as soon as they start getting packaged by Debian.
-
Note that the packages installed by
apt-get build-dep
will be marked as "manually installed" and clutter the output ofapt-mark showmanual
. If you care, you may want to save it before proceeding. ↩ -
If you're wondering how this automated process could take care of things like updating the changelog, have a look at
debian/changelog
in the source folder. A dummy entry will have been generated. ↩ -
If you don't have the file
../mesa_10.3.4-1.dsc
, it should have been produced when compiling foramd64
before. ↩