How to: Recompiling / Rebuild Debian / Ubuntu Linux Binary Source File Packages

by on January 15, 2008 · 19 comments· LAST UPDATED January 15, 2008

in , ,

Q. I'd like to rebuild a Debian / Ubuntu package called foo with additional option. How do I recompile .deb packages?

A. To build a Debian package, you need the following packages / software installed on system
[a] fakeroot : fakeroot package - runs a command in an environment wherein it appears to have root privileges for file manipulation. This is useful for allowing users to create archives (tar, ar, .deb etc.) with files in them with root permissions/ownership.

[b] dpkg-dev : package building tools for Debian

[c] Development environment - You need gcc, make and all other compiler collection installed on system. Under Debian / Ubuntu package build-essential takes care of everything.

Step #1: Install required packages

Type the following command
$ sudo apt-get install build-essential fakeroot dpkg-dev

Step #2: Install source code package

First, create a directory to store source package, enter:
$ mkdir build
$ cd build

Use apt-get command to install source code for a package called foo
$ sudo apt-get source foo
Install all build-dependencies, enter:
$ sudo apt-get build-dep foo
Unpacks Debian / Ubuntu source archives with Debian source package (.dsc) manipulation tool, enter:
$ dpkg-source -x foo_version-revision.dsc
To just compile the package, you need cd into foo-version directory and issue the command
$ dpkg-buildpackage -rfakeroot -b
If you want to pass custom additonal options to configure, you can set up the DEB_BUILD_OPTIONS environment variable. For instance, if you want pass option called --enable-radio --enable-gui, enter:
$ DEB_BUILD_OPTIONS="--enable-gui --enable-radio" fakeroot debian/rules binary
You can also pass some variables to the Makefile. For example, if you want to compile with gcc v3.4, enter:
$ CC=gcc-3.4 DEB_BUILD_OPTIONS="--enable-gui --enable-radio" fakeroot debian/rules binary

A complete example - mplayer

Let us see how to rebuild mplayer media player package with --enable-radio --disable-ivt options:
# sudo apt-get source mplayer
# sudo apt-get build-dep mplayer
# dpkg-source -x mplayer_version-revision.dsc
# DEB_BUILD_OPTIONS="--enable-gui --enable-radio --disable-ivt" fakeroot debian/rules binary

Now wait for some time as compile procedure going to take its own time. To install the newly-built package, enter:
# dpkg -i ../mplayer_version-revision_arch.deb

Further readings:

TwitterFacebookGoogle+PDF versionFound an error/typo on this page? Help us!

{ 18 comments… read them below or add one }

1 Scott Carlson January 15, 2008 at 4:23 pm

I also use these lines to up the package number for a local deb to indicate what I’ve changed.

export EMAIL=someemail@gmail.com
dch -n

Reply

2 nixCraft January 15, 2008 at 4:44 pm

Scott,

devscripts make the life of a Debian Package really easy.

Reply

3 housetier January 15, 2008 at 8:25 pm

When I build from source, I create a build script that sets the environment variables and then executes debian/rules. That way I don’t have to find the correct setting again, when I build anew some time later. The script lives in ~/bin and thus is easily found.

Reply

4 atul_iims January 17, 2008 at 6:11 am

i have one query that is i am having one text file which include lots of version like

likeCompress-Raw-Zlib-2.001.tar.gz
Compress-Zlib-2.001.tar.gz
ConsoleKit-0.2.3.tar.gz
Convert-ASN1-0.20.tar.gz
Crypt-SSLeay-0.51.tar.gz

my problem is how to extract string one place like
Compress-Zlib & version in other file 2.001.tar.gz
please if you have any idea about this please mail me

Reply

5 Nilesh January 19, 2008 at 1:53 am

Is this possible for Fedora 7+ ?

Reply

6 nixCraft January 19, 2008 at 6:43 am

Use rpmbuild under RHEL / CentOS / Suse / Fedora Linux

Reply

7 Killmyself November 7, 2008 at 11:19 am

All this command didn’t help me much because I didn’t have any network connection at my home. All I can do is by downloading all the binary sources packages. But, I didn’t know the correct command to compile and execute the file. So, how can you help me then?
Before this I tried to install realplayer, but all those command I found from internet niether can help me much, but, when I drag the .bin file to terminal windows, it suddenly execute the file. Then, my installation complete, I didn’t need any command like:
sudo chmod a+x XXXXXX.bin

I didn’t need this command, I think my step quite easy. But know the problem is how can I install tar.gz packages? I tried the same way to but, it didn’t work at all. Can you suggest me any other alternative way to install this kind of packages?

I want to install video codecs for my ubuntu 8.04, I search a lot of blog in internet, but must of the way they show required me to have internet connection, but I didn’t have one, so please I’m begging anyone that can help me?
here my e-mail glistening.dream@gmail.com

Reply

8 Wilson Hung December 7, 2008 at 1:25 pm

My environment is on ubuntu 8.10 and I entered $ sudo apt-get source foo at step 2, for all build-dependencies installation, but got an error : cannot find sources of foo package. What should I do to continue following steps? Thanks.

Reply

9 nixCraft December 7, 2008 at 1:48 pm

Replace foo with actual package name such as apache2 or whatever you wish to rebuild.

Reply

10 brownman April 20, 2009 at 1:48 am

u absolutly saved me years of pains..

im struggeling to recompiling- other games – for my desired learning..

10X alot – it’s a bless finding your page !

Reply

11 Chris Brito May 26, 2009 at 1:55 pm

you help me so much! thank you

Reply

12 Maks October 3, 2009 at 3:52 am

hi! but isn’t “apt-get source foo” doing “dpkg-source -x foo.dsc” ???? so in
# sudo apt-get source mplayer
# sudo apt-get build-dep mplayer
# dpkg-source -x mplayer_version-revision.dsc
# DEB_BUILD_OPTIONS=”–enable-gui –enable-radio –disable-ivt” fakeroot debian/rules binary

Isnt this step already included whet you do apt-get source ?? # dpkg-source -x mplayer_version-revision.dsc

Reply

13 Daniel February 9, 2010 at 8:35 pm

When I rebuild a package this way and install it, then it will be overwritte with same version from repository next time I run apt-get update/dist-upgrade. I guess you forgot to tell how to push the version number. Perhaps “dch -i”?

Reply

14 Debianfan June 3, 2010 at 8:27 am

Thank You!
I’ve Just installed Debian Squeeze/unstable after almost 2 years.guess what?Debian Version of sensors-applet fails to show My Nvidia GPU temperatures.Your Article Turns out great ,I’ve to enable nvidia-support with “DEB_BUILD_OPTIONS=”–enable-gui –with-nvidia” fakeroot debian/rules binary”
Thanks!
PS:GPU Temp Support in sensors-applet needs libNVCtrl and some other headers which comes with NVIDIA installer or ,for Debian it is in the package “nvidia-settings”

Thanks Again!

Reply

15 Alex September 17, 2010 at 7:34 pm

I think that the command ‘sudo apt-get source foo’ should actually be ‘apt-get source foo’ so that the source files will have the correct permissions when compiling with fakeroot under regular user permissions.

Reply

16 JustAComment December 9, 2010 at 7:35 pm

only a little comment:

There is a small mistake in the general instructions: the “dpkg-source -x foo_version-revision.dsc” command fails because the sources are owned by root. This can be avoided because the “sudo” in the step of getting the source is not really needed, so instead of “sudo apt-get source foo” you can do “apt-get source foo”.

Otherwise, this howto is just perfect.

Reply

17 anonim July 22, 2011 at 2:37 am

How to setup this using Eclipse CDT ?
I need autocomplete feature

Reply

18 Ravikant February 10, 2012 at 7:22 am

“Are you crazy?” and septpod it. Now I wish I had tried it, though. Just for giggles.

Reply

Leave a Comment

Tagged as: , , , , , , , , , , , , , , ,

Previous Faq:

Next Faq: