Take the 2-minute tour ×
Ask Ubuntu is a question and answer site for Ubuntu users and developers. It's 100% free, no registration required.

I would like to create a brand new deb package to install series of files. If at all possible, I would like to untar the folder containing these files as part of the installation into a known folder location. Failing that, some knowledge how to package the source folders and files would be very useful.

Question is - is this possible and if so - how?

Lets give an example:

~/mypluginfolder/ contains the files x, y, a subfolder called abc and inside that another file called z.

I want to tar this folder: tar -cvf myfiles.tar ~/mypluginfolder

I presume my debian package would look like

myfiles.tar.gz
myfiles+ppafoss_0.1-1/
   myfiles.tar
   DEBIAN
      changelog, compat, control, install, rules source

Is it possible to somehow untar myfiles.tar to a known folder location for example

/usr/share/rhythmbox/plugins/

Thus the final result would be:

/usr/share/rhythmbox/plugins/mypluginfolder
/usr/share/rhythmbox/plugins/mypluginfolder\x
/usr/share/rhythmbox/plugins/mypluginfolder\y
/usr/share/rhythmbox/plugins/mypluginfolder\abc\z

If - presuming launchpad needs source, advice is sought as to where I should drop the source folders and files into the deb package structure.


This will eventually will become a series of individual launchpad PPA packages.

What I prefer (but may not be able to achieve...) is to keep my packaging to a minimum - create a series of packages from a template and adjust the bare minimum (changelog etc + the tar file/file & folder structure).

share|improve this question
    
Um... why do you want a .deb to do the tar extraction? Why not just take the source code from the tar and create the deb from scratch with the source? –  Thomas W. Jun 4 '12 at 13:45
2  
A possibility could be that you wget the tarball from another place, adobe-flash style. –  jrg Jun 4 '12 at 13:55
    
@jrg, that downloads the .bin installer, not a tarball. adobe packaging style doesnt provide the source (its closed source). The concept, though, is still the same, download the code from elsewhere and then extract/install (i'm being nit=picky here :P) –  Thomas W. Jun 4 '12 at 13:59
    
@LordofTime Same difference. ;p –  jrg Jun 4 '12 at 14:02

1 Answer 1

up vote 20 down vote accepted

Below, I'm assuming that the source is open (e.g. Python scripts) which are therefore not bound to any architecture (e.g. amd64 or i386), hence "all". If you have some C source, you need to use Architecture: amd64 i386 in your source control file.


creating package ready for Launchpad

This will eventually will become a series of individual launchpad PPA packages.

What I prefer (but may not be able to achieve...) is to keep my packaging to a minimum - create a series of packages from a template and adjust the bare minimum (changelog etc + the tar file).

Launchpad only accepts source packages, so create a rules that installs the files in the correct places. For convenience, I'll use debhelper. The directory with your files should look like:

debian/changelog
debian/control
debian/rules
debian/compat
mypluginfolder/...

A debian/copyright file may also be useful for informing users about the licenses associated with the package. I don't think you need a postinst script since you only need to extract some files. compat should contain the debhelper compatilbility level, say "8". (please refer to the manual page of debhelper for more details)

The changelog file can be edited with the dch command, available from the devscripts package. The rules (using debhelper) should contain:

#!/usr/bin/make -f
%:
   dh $@
override_dh_install:
    dh_install mypluginfolder/ /usr/share/rhythmbox/plugins

Make it executable using chmod 755 debian/rules. A source package can be build using debuild -S. Be sure to be in a directory named <package-name>-<version>. More information about the override_ behavior and the dh command can be found on its manual page.

The Debian New Maintainers' Guide was very valuable for me to understand this, it's recommended reading. Example packaging can be found on https://github.com/Bumblebee-Project/bumblebee-ppa.


creating package from existing file tree

dpkg-deb -b can be used for creating tarballs from an existing file tree. First, start with creating a directory that should be named after your package. I'll assume you want to name it myplugin, and put it in /usr/share/rhythmbox/plugins/mypluginfolder. In addition, create the DEBIAN directory (uppercase!) for storing package information:

mkdir -p myplugin/usr/share/rhythmbox/plugins/mypluginfolder
mkdir myplugin/DEBIAN

Copy over your files:

cp -r ~/mypluginsfolder myplugin/usr/share/rhythmbox/plugins

Next, you'll need a so-called control file located at myplugin/DEBIAN/control which describes the package. The contents of such a file are put below:

Package: myplugin
Version: 1.0-1
Maintainer: You <[email protected]>
Architecture: all
Description: plugins for Rhythmbox
 Longer description here
 .
 As you can see, new paragraph are split by a single dot,
 and lines have to be indented by one space.

Now, you can optionally verify the contents of your package. The next command lists the file and directory entries contents of myplugin:

find myplugin -ls

If you're satisfied, build the package in the current directory:

dpkg-deb -b myplugin .

A new file will appear, named like <package>_<version>_<architecture>.deb which is in this example myplugin_1.0-1_all.deb. You can use the less program to peek in the file. For example, less myplugin_1.0-1_all.deb.

share|improve this answer
1  
+1 absolute genius - I bow to you sir. Thanks! –  fossfreedom Jun 4 '12 at 22:10
    
Thanks for this great help! Had some trouble with the control file though, in the end it worked, but don't ask me how ;) –  Gerhard Burger May 10 '13 at 19:05

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.