Installing packages from source code with checkinstall

Posted by Steve on Fri 27 May 2005 at 16:23

The majority of applicatications you'll wish to use upon your system are already available as Debian packages, or as backports if you're running Woody. But there may be a few applications you need to install from source. Rather than fully Debianising the package yourself you can integrate it into your system with checkinstall.

checkinstall is a simple program which monitors the installation of files, and creates a Debian package from them.

There are two primary benefits to using checkinstall instead of running make install:

  • You can easily remove the package with one step.
  • You can install the resulting package upon multiple machines.

It's also a good way to install arbitary files to a Debian system, such as configuration files - you merely need to create a Makefile which will install packages, without needing to create a full Debian package.

(Although it should be noted that building Debian packages of perl modules, and rebuilding Debian packages are both relatively straightforward jobs).

To get started with checkinstall you will need to install it. As root run:

apt-get install checkinstall

Once it is installed you can use it the next time you need to install a package from source code.

As an example of using it we'll investigate using it with the package htpd which is a software tool for synchronising your clock against time responses received from HTTP servers. (Note that we've covered keeping your clock current previously).

At the time of writing this software is not available as a Debian package, so it is a perfect example to start with.

First of all we need to download the source code and unpack it:

skx@lappy:~$ mkdir tmp
skx@lappy:~$ cd tmp
skx@lappy:~/tmp$ wget http://www.clevervest.com/htp/archive/c/htpdate-0.8.0.tar.gz
skx@lappy:~/tmp$ tar -zxf htpdate-0.8.0.tar.gz 
skx@lappy:~/tmp$ cd htpdate-0.8.0/
skx@lappy:~/tmp/htpdate-0.8.0$

Now we can build the software as we normally would. In this case, assuming you have a compiler installed, etc, then you can build the software by typing "make":

skx@lappy:~/tmp/htpdate-0.8.0$ make
gcc -Wall -ansi -Os -o htpdate htpdate.c

This gives us the binary, normally we'd proceed to install the created binary by executing "make install". Instead we're going to use checkinstall to monitor the installation process, and create a Debian package for us.

As root run:

checkinstall -D make install

(The '-D' flag means "Build a Debian package").

This will ask you if you wish to create some documentation:

root@lappy:~/tmp/htpdate-0.8.0# checkinstall -D make install

checkinstall 1.5.3, Copyright 2001 Felipe Eduardo Sanchez Diaz Duran
           This software is released under the GNU GPL.


The package documentation directory ./doc-pak does not exist.
Should I create a default set of package docs?  [y]: 

If you say "yes" then you will find the binary will have some documentation installed in /usr/share/doc/$packagename.

After that you'll be asked to give a description for the package:

Please write a description for the package.
End your description with an empty line or EOF.
>> HTTP Time Protocol

After that you'll see a summery :

This package will be built according to these values: 

0 -  Maintainer: [ root@localhost.localdomain ]
1 -  Summary: [ HTTP Time Protocol ]
2 -  Name:    [ htpdate-0.8.0 ]
3 -  Version: [ 0.8.0 ]
4 -  Release: [ 1 ]
5 -  License: [ GPL ]
6 -  Group:   [ checkinstall ]
7 -  Architecture: [ i386 ]
8 -  Source location: [ htpdate-0.8.0 ]
9 -  Alternate source location: [  ]

Enter a number to change any of them or press ENTER to continue: 

I choose "0" to change the email address of the package maintainer to my own, then entered "enter" to continue.

Once this last step has been completed the package will be installed, and the binary .deb file produced:

**********************************************************************

 Done. The new package has been installed and saved to
 /home/skx/tmp/htpdate-0.8.0/htpdate-0.8.0_0.8.0-1_i386.deb

 You can remove it from your system anytime using: 

      dpkg -r htpdate-0.8.0

**********************************************************************

We can see which files are included by examining the built .deb file:

root@lappy:~/htp/htpdate-0.8.0# dpkg --contents htpdate-0.8.0_0.8.0-1_i386.deb
drwxr-xr-x root/root         0 2005-05-27 17:15:28 ./
drwxr-xr-x root/root         0 2005-05-27 17:13:43 ./bin/
-rwxr-xr-x root/root      9532 2005-05-27 17:13:43 ./bin/htpdate
drwxr-xr-x root/root         0 2005-05-27 17:13:43 ./usr/
drwxr-xr-x root/root         0 2005-05-27 17:13:43 ./usr/local/
drwxr-xr-x root/root         0 2005-05-27 17:13:43 ./usr/local/share/
drwxr-xr-x root/root         0 2005-05-27 17:13:43 ./usr/local/share/man/
drwxr-xr-x root/root         0 2005-05-27 17:13:43 ./usr/local/share/man/man8/
-rw-r--r-- root/staff     1372 2005-05-27 17:13:43 ./usr/local/share/man/man8/htpdate.8.gz
drwxr-xr-x root/root         0 2005-05-27 17:13:43 ./usr/share/
drwxr-xr-x root/root         0 2005-05-27 17:13:43 ./usr/share/doc/
drwxr-xr-x root/root         0 2005-05-27 17:13:43 ./usr/share/doc/htpdate-0.8.0/
-rw-r--r-- root/root      2835 2005-05-26 22:32:18 ./usr/share/doc/htpdate-0.8.0/CHANGES
-rw-r--r-- root/root      1824 2005-05-26 22:32:18 ./usr/share/doc/htpdate-0.8.0/README

In this case the files beneath /usr/share/doc/htpdate-0.8.0/ are only included because we answered "yes" when asked if we wished to create the documentation directory - if we'd said "no" they would have been ignored.

Because the package has no notion of dependencies we could install it on any machine - depending upon your point of view this is either a bug, or a feature!

For more options please see the manpage:

man checkinstall

 

 


Posted by simms (69.157.xx.xx) on Fri 27 May 2005 at 17:01
very interesting.
so if i understood correctly, if i 'package' the program ABC in this manner, and then a new version of ABC becomes available, then i just repeat this compilation/packaging process for the new version, and then run
dpkg -i ABC.deb
to replace the previous version in the same manner, with the new package?

[ Parent | Reply to this comment ]

Posted by Steve (82.41.xx.xx) on Fri 27 May 2005 at 17:03
[ View Steve's Scratchpad | View Weblogs ]

Exactly.

Although you'll notice as part of the build prcess the package is actually installed - so you'll not need to install it manually, unless you wish to install the package upon another machine.

Steve
-- Steve.org.uk

[ Parent | Reply to this comment ]

Posted by simms (69.157.xx.xx) on Fri 27 May 2005 at 17:16
neat, thanks for the quick reply.

[ Parent | Reply to this comment ]

Posted by sabin (62.99.xx.xx) on Fri 27 May 2005 at 17:14
[ View sabin's Scratchpad | View Weblogs ]
would I get issues if I would try to do the same with the newest OpenSSH version for example? or should it do that as well? greets..

./sabin -s

[ Parent | Reply to this comment ]

Posted by Steve (82.41.xx.xx) on Fri 27 May 2005 at 17:20
[ View Steve's Scratchpad | View Weblogs ]

I've not tried it, but I expect you'd see a few problems.

First of all you'd need to make sure that you'd configured the software properly, with "--prefix=/", and "--sysconfdir=/etc/sshd", etc.

(If you didn't do that it wouldn't have the same defaults as the Debian packages).

But once the package was installed I suspect you'd get conflicts fairly quickly between your package and the official Debian package. (Unless you uninstalled that first, which would be the ideal solution - but once you did that you might find you had no access).

It's also worth thinking about the extra things that most Debian packages give you, such as init scripts to make the server run at bootup. If you installed the package from source you wouldn't have that. (Although you can cause things to be added to the packages you build with checkinstall, so you could fix this if you wished).

All in all I'd not recommend using checkinstall for such a critical package as openssh. Whilst it might work I'd be reluctent for fear of causing problems. I regard checkinstall as a neat and simple way of integrating non-critical software into a system, for which packages aren't available (yet).

Steve
-- Steve.org.uk

[ Parent | Reply to this comment ]

Posted by sabin (62.99.xx.xx) on Fri 27 May 2005 at 17:24
[ View sabin's Scratchpad | View Weblogs ]
ok it makes sense now.. wanna thank you for your efforts concerning debian-administration.org and keep it that way! greets from .at

./sabin -s

[ Parent | Reply to this comment ]

Posted by mafeu (84.137.xx.xx) on Fri 27 May 2005 at 23:27
I've been using checkinstall for years and it's a really nice tool to get source packages into your Debian system and care for them with the tool you love to use - dpkg. It is no more and no less.

The article is mentioning it but be warned again: checkinstall is no tool for building policy straight Debian packages. For instance, there are no checks on dependencies and all the other checks that regular packages get run through are not applied.

However, I even have some noncritical packages installed via checkinstall that are included within the Debian distribution but not in their latest upstream version. The neat thing is, when you give your selfcompiled package the same name as the regular Debian package, it will replace the old version (even though it is much saver to remove the old package in advance) and what is even better: whenever a newer version is entering your favored distribution branch, the 'apt-get (dist-)upgrade' mechanism will upgrade your package automagically.

Thats the real advantage of checkinstall.

[ Parent | Reply to this comment ]

Posted by whizse (62.209.xx.xx) on Sun 29 May 2005 at 20:29
Thanks for pointing out this great program, so far I have been using stow to manage stuff not available in the archives, but this is a much better way for debian systems!

[ Parent | Reply to this comment ]

Posted by Steve (82.41.xx.xx) on Sun 29 May 2005 at 20:34
[ View Steve's Scratchpad | View Weblogs ]

To be fair GNU Stow does have the attraction, as I understand it, of allowing multiple versions of an application to be installed at the same time.

With checkinstall building the package will automatically install it (unless you tell it not to) and then you lose the old version.

This might be a concern for some users - although I guess you could keep the old .deb file around if you wished to revert.

Steve
-- Steve.org.uk

[ Parent | Reply to this comment ]

Posted by Anonymous (203.200.xx.xx) on Wed 10 Aug 2005 at 12:30
Hi
I am trying to install some kde styles from source. The problem is this that when i install a style from the debian packages available from the site they get install properly but when i do it from source they dont get installed. Now i tried this checkinstall thing and then also they are not getting installed. Means dpkg install the debian package properly but the style which i install is not in the list of style. Ne one please help me out

[ Parent | Reply to this comment ]

Posted by Anonymous (80.58.xx.xx) on Sun 25 Sep 2005 at 15:50
and if you try to build a module?
when you do a checkinstall it says that you can't do that, because module.ko is trying to overwrite another package. Are there any way to do a checkinstall with a module?

I will use to make a .deb file, with the qemu module, of my kernel version (compilated by me) Tnx

[ Parent | Reply to this comment ]

Posted by Anonymous (70.187.xx.xx) on Sun 5 Mar 2006 at 16:25
If you mean during a dpkg -i it gives you problem try

dpkg -force--all -i nameofdeb.deb

[ Parent | Reply to this comment ]

Posted by localhost (196.203.xx.xx) on Sat 27 May 2006 at 16:57
[ View Weblogs ]
Is it possible to package a PHP Web application, it does not install using make install, it's just copying files into web directorie, and executing sql queries at install.

[ Parent | Reply to this comment ]

Posted by Steve (62.30.xx.xx) on Sat 27 May 2006 at 17:03
[ View Steve's Scratchpad | View Weblogs ]

Not as far as I'm aware.

However you might be able to get by with writing a very simple Makefile which just does a "cp" to move the files into the correct location.

Steve

[ Parent | Reply to this comment ]

Posted by inzion (213.144.xx.xx) on Thu 14 Sep 2006 at 21:29
What happens if the software i want to create a deb package from, lets say, makes changes to the /etc/passwd. then the /etc/passwd file will exist in the .deb package, right? lets say i do a "dpkg --purge package.deb", what happens then to the /etc/passwd? i think i somewhere read that it will be removed, is that right?

[ Parent | Reply to this comment ]

Posted by Anonymous (189.169.xx.xx) on Mon 25 Sep 2006 at 06:04
In that case you should do something like this:

checkinstall --exclude=/etc/passwd


Felipe Sanchez.

[ Parent | Reply to this comment ]

Posted by Anonymous (148.243.xx.xx) on Mon 6 Aug 2012 at 19:31
I tried to install postgres 9.1.3 from source using checkinstall as you told in this post. The problem is that I can do it right without checkinstall but when I use: checkinstall -D install (after make command of course) it says that Missing install parameter.

Why? Is this use a modified script version of make install?

[ Parent | Reply to this comment ]

Sign In

Username:

Password:

[Register|Advanced]

 

Flattr

 

Current Poll

What do you use for configuration management?








( 676 votes ~ 10 comments )