pts' first Debian package tutorial """""""""""""""""""""""""""""""""" by pts@fazekas.hu at Fri Feb 7 12:50:29 CET 2003 Wed Feb 12 14:38:21 CET 2003 Wed Feb 12 15:56:54 CET 2003 This tutorial will teach you how to make a Debian package from a source .tar.gz, and how to set up a Debian package repository so anybody can install your packages (and their dependencies) with a single invocation of `apt-get install'. This document can serve as a tutorial for newbies, and a reminder for for those who already have some experience. I'll describe the deb-make way, working on Debian Woody and Sid systems. deb-make makes quite easy to create a proper Debian package from a source .tar.gz distribution of a program. Using this guide, you can create and install your first debian package in 60 minutes. The most important benefits of creating a Debian package: -- you can install the program quickly to many machines with `dpkg -i' or `apt-get install' -- you can remove the package with `dpkg -r' or `dpkg --purge' -- dependencies are checked before installation by `dpkg -i' -- `apt-get install' semi-automatically downloads and installs all dependencies -- you can distribute the *.deb file to your friends who wouldn't be able to compile and install the software themselves 0. Installation ~~~~~~~~~~~~~~~ Run apt-get update apt-get install doc-debian debian-policy debmake devscripts fakeroot apt-get install apt dpkg apt-get install make g++ gcc perl autoconf sed libc6-dev apt-get install developers-reference If your Debian installation lacks the deb-make utility (typical in Debian Sarge debmake 3.7.10, because debmake is deprecated), download it from here, and extract it to root: http://www.math.bme.hu/~pts/full_debmake.tgz The standard deb-make won't work, because it lacks these files and directories: /usr/bin/deb-make /usr/share/debmake/debian /usr/share/debmake/debians ... The following packages get installed: -- doc-debian: for the directory /usr/share/doc/debian/FAQ -- debian-policy: for the file /usr/share/doc/debian-policy/policy.txt.gz (this package replaces `packaging-manual') -- debmake: for the executable /usr/bin/deb-make -- devscripts: for the Perl script /usr/bin/dch (only the dch and debchange files are necessary from this package) -- fakeroot: for the executable /usr/bin/fakeroot -- dpkg: newest version of the debian package installer -- make g++ gcc perl autoconf sed libc6-dev: a minimum compilation environment -- developers-reference: more documentation 1. Download and extract the source .tar.gz ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Use wget(1) or your favourite download manager to download the sources of a non-Debian software package. Use `tar xzvf FILENAME.tar.gz' (or `tar xvf FILENAME.tar' if the former didn't work) to extract it. You can extract .tar.bz2 files with one of `tar xjvf' or `tar xIvf'. Rename the package directory (i.e the directory created by tar when extracting the archive) to `packagename-ver.sion'. You can have as many hyphens (-) in the packagename as desired, but no spaces or underscore (_). Please rename all capital letters to lowercase. Run the appropriate `cvs import' command if you plan to include this package into your CVS repository. See the `CVS Book' on the world-wide web for a tutorial about CVS. 2. Do the non-Debian way first ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Do the usual UNIX package compilation procedure, completely unrelated to Debian. (The time of this step is not part of the 60 minutes of building your first Debian package. It may take 2 minutes to 2 days, depending on your system and your experience.) You are expected to be experimented in this area, so the procedure is not described here in detail. Brief instructions: -- quickly browse the README file and INSTALL files -- download and install all the dependencies of the package first. Use dpkg or apt-get to install the dependencies, if possible. -- do anything you were instructed to in README or INSTALL -- run `./configure --help' -- run ./configure with the appropriate arguments -- run `make' -- run `make test' or `make check' if appropriate -- optional step: run `make install', test it, run `make uninstall' (not available in every package!). The binaries are likely to be placed into /usr/local/bin or somewhere inside /usr/local. However, later, when building the Debian package, you should put everything outside `local'. Remember the modifications you have made to make the software compilable on your system. Possibly submit these modifications to the author of the software. 3. Read the documentation concerning Debian packaging ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ To be able to read UNIX manual pages (man pages) conveniently, you will need apt-get install man-db less Set export PAGER=less , and possibly update your ~/.bash_profile and ~/.bashrc with this line. Then type `man 1 man'. Verify that you can navigate up and down. Press `q' to quit. To be able to view documentation in info pages, you'll need apt-get install info To get help about info, run `info info'. Before building any Debian packages, please read the following documentation: -- read carefully: man 1 deb-make -- browse quickly: man 1 debstd (this contains the files in debian/*) -- read carefully: /usr/share/doc/debmake/HOWTO.first_time -- read carefully: /usr/share/doc/debmake/README.debian -- browse quickly: man 1 dch -- browse quickly: man 1 dpkg -- browse quickly: man 1 dpkg-buildpackage (for debian/*) -- browse quickly: /etc/dpkg/shlibs.override -- browse quickly: /etc/dpkg/shlibs.default Remember the location of following documentation, for later reading: -- man 1 debstd -- /usr/share/doc/debian-policy/policy.txt.gz: Debian Packaging Manual -- /usr/share/doc/debian/FAQ/index.html See also the official manual for creating packages: -- http://www.debian.org/doc/manuals/maint-guide/index.en.html 4. Run `autoconf' ~~~~~~~~~~~~~~~~~ Run `autoconf' only if there exists a `configure.in' file, but no `configure'. Also if there exists a `*.am' file, run `automake'. Most users don't need running `autoheader'. 5. Run `deb-make' ~~~~~~~~~~~~~~~~~ Run `deb-make' or `deb-make native' (if you don't plan creating a diff file) inside the package directory. If you'd like to create a diff file later, you have to know: `deb-make' creates the packagename-ver.sion.orig directory containing the original contents of the package. Overwrite this directory with the real original contents if you have modified anything after extracting the source .tar.gz. 6. Create the Makefile ~~~~~~~~~~~~~~~~~~~~~~ Create it unless it already exists. Only three targets are necessary. Example Makefiles are provided here (remove the first tab from each line, preserve other spaces and tabs exactly): Example Makefile for a simple C program (foo.c): .PHONY: all install clean all: gcc -s -O2 -W -Wall foo.c -o foo # ^^^ add -pedantic and/or -ansi if preferred. See also: man 1 gcc clean: rm -f core *~ DEADJOE *.o foo install: cp foo $(DESTDIR)/usr/bin/foo chmod 755 $(DESTDIR)/usr/bin/foo cp -p foo.man $(DESTDIR)/usr/man/man1/foo.1 chmod 644 $(DESTDIR)/usr/man/man1/foo.1 rm -rf $(DESTDIR)/usr/share/doc/foo cp -a docs $(DESTDIR)/usr/share/doc/foo Example Makefile for a Perl script (foo.pl): .PHONY: all install clean all: @echo "No need for build :-)" clean: ; install: grep -q '^=begin' foo.pl && pod2man foo.pl foo.1 [ -f foo.1 ] && cp -p foo.1 $(DESTDIR)/usr/man/man1/foo.1 chmod 644 $(DESTDIR)/usr/man/man1/foo.1 chmod 755 $(DESTDIR)/usr/bin/foo cp -p foo.man $(DESTDIR)/usr/man/man1/foo.1 You must install everything to $(DESTDIR), not `/'. Note that the Makefiles provided here are only templates, so you don't have to start from scratch. If you have some free time, start reading `info make', the documentation for GNU Make. 8. Modify Makefile.in or Makefile ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This is in Makefile syntax, so tabs at the beginning of the line are significant. Don't convert tabs to spaces or vica versa, and preserve the original indentation of each line. If there is a `Makefile.in' (and possibly a `configure' script), then modify `Makefile.in'. Otherwise modify `Makefile'. Always make a backup of _your_ modifications, because weird build scripts tend to overwrite Makefiles. If there exists an `install:' target, verify that it installs everything under @prefix, $(prefix), or $(DESTDIR). If not, add $(DESTDIR) before every target filename and directory name. Set the CFLAGS variable (that contains additional flags for the C compiler gcc) appropriate to your needs. Examples: CFLAGS = -s -O2 -W -Wall CLAGSS = -g -W -Wall CFLAGS = -s -O2 -W -Wall -ansi -pedantic CFLAGS = -s -O2 -W -Wall -ansi -pedantic -Wstrict-prototypes -Wtraditional -Wnested-externs -Winline -Wpointer-arith -Wbad-function-cast -Wcast-qual -Wmissing-prototypes -Wmissing-declarations -Wunused 9. Modify the debian/rules file ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This is also in Makefile syntax, so tabs at the beginning of the line are significant. Don't convert tabs to spaces or vica versa, and preserve the original indentation of each line. Modify the line containing `$(MAKE) install' to: (indent with a single tab character at the beginning) $(MAKE) install prefix=`pwd`/debian/tmp/usr DESTDIR=`pwd`/debian/tmp If there is a line shorly after `build:' containing `./configure', add the appropriate options for the `configure' script. Most of the time no options are necessary (except for --prefix=usr). Please consult the README and INSTALL files of the package and/or `./configure --help' for additional options. Update to line containing `$(MAKE) CFLAGS=' to `$(MAKE)', so it won't override the CFLAGS you've set in Makefile or Makefile.in. Add the following line (and any additional lines) to the `clean:' section: -rm -f core DEADJOE a.out -rm -f config.status config.cache config.h -rm -rf autom4te.cache To have `debian/rules source' build the source packages, add the following lines: .PHONY: source source: clean DIR="`pwd`";DIR="$${DIR##*/}"; cd .. && dpkg-source -b "$$DIR" As a better alternative of the above (for `debian/rules source'), if the packages has the file named `files', which stores all the filenames (no whitespace allowed) to be included into the Debian source package, add this instead: BASEDIRNAME=$(shell perl -ne '"(";if(m@^(\S+)[(]([^)]+?)(?:-\d+)?[)]@){print"$$1-$$2\n"}exit' debian/changelog) .PHONY: source source: files rm -rf dsrcdir mkdir dsrcdir mkdir 'dsrcdir/$(BASEDIRNAME)' tar c `cat files` | (cd 'dsrcdir/$(BASEDIRNAME)'; tar x) (cd dsrcdir; dpkg-source -b '$(BASEDIRNAME)') mv dsrcdir/*.tar.gz dsrcdir/*.patch dsrcdir/*.dsc ../ || true rm -rf dsrcdir Although the rule above seems to be complicated, but this complexity is needed to avoid the bad toplevel dirname in .tar.gz and the following warning: dpkg-source: warning: source directory `...' is not - `...' Change the `binary:' section (single-line) to: binary: $(checkdir) if test root = "`whoami`"; then $(MAKE) -f debian/rules binary-indep binary-arch; \ else fakeroot $(MAKE) -f debian/rules binary-indep binary-arch; fi 10. Edit the debian/control file ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Add/modify the following entries in the first (Source:) section: -- Maintainer: give your name and appropriate e-mail address -- Build-Depends: enumerate all Debian packages required for building this package. Always include the package `debmake'. Examples: Build-Depends: debmake, gcc, make, sed, bash Build-Depends: debmake, g++, perl, wget | wget-ssl, libz-dev Add/modify the following entries in the second (Binary:) section: -- Depends: remove `${shlibs:Depends}' unless you compile programs (and create ELF binaries). Add a comma and any dependencies (except for libraries needed for the ELF binaries). Examples: Depends: mtools, bash, grub, sed Depends: ${shlibs:Depends}, apache (>= 1.1) | apache-ssl -- Recommends: strong package recommendation (that most users need, even if they don't know about it) -- Suggests: weak package suggestion (other packages that enhance the functionality of this package) -- Replaces: packages that have one or more installed files that this package replaces -- Description: a single-line description of this package. Add a multi-line description after this line, indented with a space. Example: Description: convert raster images to EPS and PDF and others sam2p is a UNIX command line utility written in ANSI C++ that converts many raster (bitmap) image formats into Adobe PostScript or PDF files. The images are not vectorized. sam2p gives full control to the user to specify standards-compliance, compression, and bit depths. In some cases sam2p can compress an image 100 times smaller than the PostScript output of many other common image converters. sam2p provides ZIP, RLE and LZW (de)compression filters even on Level1 devices. . This is the second paragraph. -- Architecture: change ``any'' (which is incorrect) to ``all'' (architecture-independent). Don't change to ``i386'' or any other, specific architecture name: it will be changed upon package creation. Consult the Debian Packaging Manual (described in step 3) for the format of the `Depends:' and `Build-Depends:' entry. Consult /var/lib/dpkg/status for many examples of `Depends:' etc. Do not provide a `Version:' entry, deb-make will extract it from the debian/changelog file. 11. Modify the debian/dirs file ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Add all directories needed, but not created by the `install:' target in Makefile or Makefile.in. Example: usr/bin usr/sbin usr/share/man/man1 12. Modify the debian/changelog file ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Modify the line containing the version number, add a build version. Example: old line: sam2p (0.43) unstable; urgency=low new line: sam2p (0.43-1) unstable; urgency=low 13. Edit other debian/* files, as appropriate ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In most cases all other files are OK. The debian/*.ex files contain examples. If you need their functionality, rename them to without the .ex (example) extension, and modify them appropriately. 14. Remove unnecessary debian/*.ex files ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Only the following files should remain: -- README.debian -- changelog -- control -- copyright -- dirs -- rules All other entries, such as debian/tmp are temporary, they shouldn't be added to a version control system. 14b. Add debian/* to version control ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ If you are using a version control system (such as CVS or Subversion), now it is a good time to add debian/* (except for debian/*~). 15. Add a `dch -i' entry ~~~~~~~~~~~~~~~~~~~~~~~~ Make sure that your EDITOR shell variable is set correctly. Common settings are: export EDITOR=vi export EDITOR=emacs export EDITOR=joe export EDITOR=mcedit export EDITOR=nano export EDITOR=nano-tiny Optionally, add one of these editor settings to your ~/.bashrc and your ~/.bash_profile Run `dch -i' to add documentation for the new build version you've just created. Your editor will be started, and the cursor is positioned to the line beginning with ` * '. Add the appropriate documentation there. Example: sam2p (0.43-2) unstable; urgency=low * Added proper Description:, Depends: and Build-Depends: to debian/changelog, modified the Makefile to respect $(DESTDIR) etc. -- Szabó Péter Fri, 7 Feb 2003 14:11:17 +0100 sam2p (0.43-1) unstable; urgency=low * Initial Debian release. -- Szabó Péter Fri, 7 Feb 2003 14:04:44 +0100 Local variables: mode: debian-changelog End: Ensure that version information (`0.43-2' in the example) is correct at the _top_ of the file, and is larger than the one on the previus run of `debian/rules binary'. You can skip the documentation if you are absolutely in a hurry, but you always have to check the version numbers. Never save a file not conforming to the syntax, because it will prevent you building other binaries. If unsure, make a backup first, or look at the various /usr/share/doc/*/changelog.gz files. Use `dch -a' to add another documented change (an extra entry beginning with ` * ') to the current build version. 16. Run `debian/rules build' to build the binaries ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This may take a long time. It will run `configure' each time it is invoked. This is normal operation. If there are error messages, fix the errors, remove the file `build', possily issue `debian/rules clean', and do this step again. It might be possible to use `make' to make recompilation faster. 17. Run `debian/rules source' to build the source .tar.gz and .dsc files ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This step is optional. It is generally wise to build these source archives, because they can be uploaded into a Debian package repository, and your users will be able to recompile the package just by issuing apt-get -b source packagename See Debian package repositories later in this tutorial. 18. Create the .deb package files ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Verify that the build version is correct at the top of debian/changelog. Run rm -f *~ fakeroot debian/rules binary Try to install the ../*_*.deb package files just created to a Debian system. 19a. Check and lower shared library (shlibs) dependencies ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Check the shared library dependencies of the generated .deb file. For example, if it depends on `libc6 (>= 2.3.42)', because you have libc6 2.3.42 on your system, but you are sure that it works with any libc6 (>= 2.3.0), add the following line to the (possibly new) file debian/shlibs.local: libc 6 libc6 (>= 2.3.0) libm 1 libc6 (>= 2.3.0) libdl 6 libc6 (>= 2.3.0) Here the lonely `6' is to number 6 at the end of /lib/libc.so.6 . See also /etc/dpkg/shlibs.default and `man dpkg-shlibdeps' Don't forget to add debian/shlibs.local to `files'. Also verify by hand that library dependencies of .so files have also been added. 19b. Install the package with `dpkg -i' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ You must do it as root (not fakeroot). Run something like: dpkg -i ../packagename_version_i386.deb 20. Modify other files ~~~~~~~~~~~~~~~~~~~~~~ If something doesn't work properly with the installed package, modify files in the source directory, and go back to step 6. 21. Modify `files', update CVS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ If there exists a file `files' (_not_ `debian/files') containing all important filenames, add all `debian/*' files to it, except for debian/files* and debian/substvars -- run `debian/rules clean' first. After running `debian/rules clean', run `cvs add debian/*' to import these files to CVS (if applicable). 22. Create a diff/patch file ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This step is optional. Run something like debian/rules clean (cd ..; diff -ru packagename-ver.sion{.orig,} >packagename-ver.sion.patch) 23. Submit the .patch file to the author ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ If you are not the author of the software, send a .patch file to the author, so she may incorporate your porting and/or bug-fixing work into further versions of the software. 24. Publish the .deb package on your web site ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ , so others can benefit from your work. Do not forget the recompress the original source tree to a .tar.gz (step 17), and publish the sources too, so non-debian users can benefit your work, and the program will be available for those with different libc version. 25. Run `debian/rules source' again to build the source .tar.gz and .dsc files ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This step is optional. this is to make sure you're source packages are up to date. 25. Create a Debian package repository ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ , so anybody on your system can install your packages with `apt-get install', and recompile them with `apt-get -b source'. You don't have to be root to create a package repository. I explain only the simplest case, without subdirectories or package name collissions. S0. Run apt-get install dpkg-dev gzip bash S1. Create an empty directory that will hold all the Debian packages (source and binary) you plan to distribute. Let's call it `/var/ftp/debian-local'. Let it be on the machine `fooserver.org'. S2. Create an empty file `/var/ftp/debian-local/Override' S3. Create an _executable_ file `/var/ftp/debian-local/update.sh': #! /bin/bash -- set -ex MYDIR="${0%/*}"; [ "$MYDIR" != "$0" ] && cd "$MYDIR" [ -f update.sh ] [ -f Override ] dpkg-scanpackages . Override > Packages; gzip -f Packages dpkg-scansources . Override > Sources ; gzip -f Sources gzipped Packages and Sources will be mandatory for the FTP and HTTP repositories described later in this tutorial. S4. As `root@fooserver.org', add the following lines to /etc/apt/sources.list: deb file:/var/ftp/debian-local ./ deb-src file:/var/ftp/debian-local ./ It might be impotant where you place these lines in /etc/apt/sources.list, if there are package name or version conflicts. Put your lines to the beginning to give them priority. S5. Copy some binary packages (*.deb) to `/var/ftp/debian-local/' S6. Copy some source packages (*.tar.gz, *.dsc) to `/var/ftp/debian-local/' S7. Run /var/ftp/debian-local/update.sh S8. As `root@fooserver.org', run `apt-get update'. S9. As `root@fooserver.org', try compiling and installing some packages: apt-get -d install packagename apt-get install packagename apt-get -b source packagename S10. Repeat from step S5 if you have new packages to be added to the repository. 26. Create a networked Debian package repository ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ , so anybody on the internet can install your packages with `apt-get install', and recompile them with `apt-get -b source'. S21. Do the steps of {Create a Debian package repository} first. S22. Create an empty file `/var/ftp/debian-local/Release'. For comparison, here is a sample Release file from a Debian site: Archive: stable Version: 3.0r1a Component: contrib Origin: Debian Label: Debian Architecture: i386 S23. Set up an FTP server. Things should work with a HTTP server too, but that way is not described here. The possibly easiest way of setting up a temporary FTP server, if you are not root, is the following: # Do these in a new terminal window: wget http://www.inf.bme.hu/~pts/pts-ftpd-latest.tar.gz tar xzvf pts-ftpd-latest.tar.gz cd pts-ftpd-1* debian/rules build cp bftpd.noss /var/ftp/debian-local/pts-ftpd chmod 111 /var/ftp/debian-local/pts-ftpd cd /var/ftp/debian-local ./pts-ftpd -Na Now pts-ftpd is started. The log messages are written to the terminal. The first line contains the URL on which the server is available. Close the terminal window or press Ctrl- to stop it. The URL is: ftp://fooserver.org:2121/ Verify (e.g with lynx or wget) that this file is downloadable: ftp://fooserver.org:2121/Packages.gz S24. As `root@anymachine.org', add the following lines to /etc/apt/sources.list: deb ftp://fooserver.org:2121/ ./ deb-src ftp://fooserver.org:2121/ ./ If you have similar http:// or file:/ entries for fooserver.org, comment them out. S25. As `root@anymachine.org', run `apt-get update'. S26. As `root@anymachine.org', try compiling and installing some packages: apt-get -d install packagename apt-get install packagename apt-get -b source packagename S27. If you have new packages to be added to the repository: repeat steps S5--S7 of {Create a Debian package repository}, and then from step S25. S28. Publish a link to your repository on your home page. 27. Enjoy your new Debian packages! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This is the end of the step-by-step tutorial. FAQ """ Q1. How do I make two .deb files from a single .tar.gz? A1. Sorry, this is under-documented. Add multiple `Package: ' entries to the debian/control file. Duplicate some files in debian/*. Add appropriate Replaces: entries for the documentation files. Q2. How do I make two .deb files from a single .tar.gz, with different configure --options? A2. Modify the `build:' section of debian/rules accordingly. You are on your own. Q3. May I translate this documentation? A3. Yes. Please send a copy of the translation to me. Q4. How do I create new source packages (*_*.diff.gz, *_*.dsc) from *_*.orig.tar.gz? A4. Let's suppose that the extracted build directory is foo/apack-2.1, and you already have foo/apack_2.1.orig.tar.gz . Make sure you have the correct revision number in foo/apack-2.1/debian/changelog, use `dch -i' to add a new entry. Make sure you are the maintainer, edit the ``Maintainer:'' line in foo/apack-2.1/debian/control In the directory foo/, run dpkg-source -b apack-2.1 This command will generate the files foo/apack_2.1-42.diff.gz and foo/apack/apack_2.1-42.dsc . Copy these files to the same directory in your web server as the .deb files, and run dpkg-scansources there. Testimonials, feedbacks """"""""""""""""""""""" Michal Kocer wrote: I decided to switch from Red Hat to Debian and so I had to repack all my RPMs into .deb pakckages. I was googling about some quick tutorial and I find the one you've writen very usefull and straitforward. It was really the thing I needed to have my packages debianized. He also wrote: So, finaly I decided to share the content of your package with the Czech linux comunity via two short articles first. And then I'll (hopefully) put it together in the same form you have. This procedure is somewhat forcing me more ;). The first part (creation of debianized packages) was alredy writen and published on www.root.cz (which is one of the most popular ezin of Czech linux users). The second part (how to publish my .deb packages and FAQ) is not writen yet. In the Acknowledgement part of the article (http://www.root.cz/clanek/1960) I mentioned your tutorial as a main source for the article. The article is not only plain translation - it is somewhat shortened and some practical comments from my point of view were included. License """"""" This documentation is subject to and can be distributed under the GNU Free Documentation License Version 1.2, November 2002, or the newest version, at your choice. The neweset version is available from http://www.gnu.org/licenses/fdl.txt Improvement possibilities """"""""""""""""""""""""" Imp: include Step 3. Imp: apt preferences (prefer local packages over distrubution ones) Imp: multi-directory layout (such as on fourier:public_html) __EOF__ ~