Translation(s): none


Como crear un paquete de debian sin software de ayuda

 por Miriam Ruiz
 Version 0.3, 09-Ene-2005

Introduccion

Este documento esta dirigido a aquellas personas que quieren comprender el proceso de creacion de un paquete de Debian. No se asume que quien lo vaya a leer sea previamente capaz de empaquetar un programa, pero seria preferible que supiera hacerlo.

Este no es el documento mas adecuado para crear paquetes desde cero. Si ese esa es tu situacion, te recomiendo que leas la "Guía del Nuevo Desarrollador de Debian", en http://www.debian.org/doc/maint-guide/

Gracias a Helen Faulkner y Dafydd Harries por su ayuda constante, su apoyo y por ayudarme con este documento, y a Manoj Srivastava por su interes en ayudarme a aprender, asi como por su codigo, que ha sido una importante referencia para mi.

Agradezco de forma especial el apoyo de Debian-Women y de ChicasLinux.

NOTA: Este documento no debe ser entendido como "aqui hay una forma facil/buena de mantener tus paquetes", sino como "asi es como funciona por dentro el sistema de creacion de paquetes". Espero que sea util para alguien.

Descarga y descompresion del codigo fuente original

Vamos a construir un paquete de Debian desde el principio sin usar debdelper, yada, o cualquier programa parecido, simplemente con la ayuda de los paquete "dpkg" y "dpkg-dev".

El programa que he elegido para esta tarea se llama "roaddemo", esta disponible en http://rhk.dataslab.com/roaddemo/ y se distribuye bajo una licencia GNU GPL. Depende de OpenGL y SDL, y su proceso de construccion es el habitual "./configure && make && make install" (con una pequeña modificacion, ya que "make install" no funciona correctamente en este caso, pero nos servira igual para este tutorial).

El primer paso es crear un nuevo directorio en el que trabajaremos, y descargar el programa:

   $ mkdir roaddemo
   $ cd roaddemo
   $ wget -t 0 -c http://rhk.dataslab.com/roaddemo/roaddemo-1.0.1.tar.gz

Descomprimimos el fichero tar.tgz y lo renombramos de la forma correcta para crear un paquete de Debian, esto es "<paquete>_<version>.orig.tar.gz" :

   $ tar xvfz roaddemo-1.0.1.tar.gz
   $ mv roaddemo-1.0.1.tar.gz roaddemo_1.0.1.orig.tar.gz
   $ cd roaddemo-1.0.1

El codigo se descomprime en un directorio llamado roaddemo-1.0.1, que es consistente con la nomenclatura <paquete>-<version>. Si no fuera asi, tendriamos que renombrarlo (usando el comando "mv").

Comprobacion del sistema de compilado original

Vamos a comprobar que el programa compila perfectamente antes de intentar empaquetarlo:

   $ ./configure --prefix=/usr --mandir=\$${prefix}/share/man --infodir=\$${prefix}/share/info

Usaremos esas opciones inicialmente. Dedendera de como se haya realizado la configuracion del sistema autoconf el que se necesite modificarlas o no. Si el programador original ha hecho las cosas correctamente, el comando "./configure --help" deberia mostrarnos las opciones disponibles.

Ahora compilaremos el programa usando "make":

   $ make

Como parece que funciona correctamente, vamos a intentar instalarlo usando "make install".

La verdad es que no queremos que nuestro programa se instale realmente en nuestro directorio principal, asi que añadiremos el parametro "DESTDIR" para indicar en que lugar queremos que se instale realmente. Crearemos un directorio temporal para eso:

   $ mkdir tmp

Usaremos "pwd/tmp" para darle al programa un directorio absoluto en vez de uno relativo.

   $ make install DESTDIR=`pwd`/tmp

Este comando parece dar un error, pero normalmente deberia funcionar a la perfeccion, asi que no te precupes por este hecho. En este caso, el problema se soluciona añadiendo un nuevo parametro que le dice a "make" que es "LIBTOOL", lo que en cualquier caso deberia estar definido dentro. Este es un bug o error del programa original.

   $ make install DESTDIR=`pwd`/tmp LIBTOOL=libtool

Ahora tenemos el programa que queriamos dentro de "tmp/".

Es importante que eches un vistazo a los ficheros que se han instalado. Si trabajas desde la consola de comandos, hay uno llamado "tree" que es muy util para este tipo de cosas. El paquete de Debian correspondiente se llama igualmente "tree".

Es comun tener este tipo de problemas en el proceso de construccion de un paquete. A veces los archivos de "autoconf" o "automake" no hacen lo que deberian, a veces los parametros para "./configure" no son estandares y deberas averiguarlos. A veces solamente dispones de un "Makefile" normal y corriente y no hay rastro de "./configure". En este ultimo caso, tal vez tengas que modificarlo para que funcione el parametro "DESTDIR". No hay una solucion universal para todos los problemas, esa es la parte creativa del asunto.

Vamos a limpiar todo lo que hemos hecho hasta ahora:

   $ make distclean
   $ rm -rf tmp

Correccion de algunos bugs de la fuente

Si el programa estuviera correctamente programado no necesitarias modificar lo que voy a comentar en esta parte, pero como es un fallo bastante comun, voy a arreglarlo aqui por si acaso. El programa parece abrir un archivo llamado "road.bmp", que no es instalado por "make install", y tendremos que hacerlo a mano.

Dentro del codigo, se abre "road.bmp" sin una direccion absoluta, lo que hace que cuando el programa sea ejecutado lo intente cargar desde el directorio actual, cualquiera que este sea. De acuerdo con la politica de Debian, el archivo deberia estar en algun lugar de "/usr/share/<package name>", asi que lo pondremos en "/usr/share/roaddemo/road.bmp".

Vamos a modificar el codigo. Primero buscaremos en que parte del codigo fuente se usa ese archivo:

   $ grep road.bmp *.h *.c *.cpp *.cc *.hpp

Este comando da el siguiente resultado:

   roaddemo.cc:    if (load_texture("road.bmp", &road_tex_id) < 0)

Bien, ahi esta lo que debemos modificar. Cambia "road.bmp" en ese fichero por "/usr/share/roaddemo/road.bmp" y no toques nada mas.

La mejor forma de solucionar este tipo de problemas es mandar un parche al autor original del programa que defina los paths o rutas en tiempo de compilacion, o al menos notificarle la existencia del problema.

Es habitual que necesites modificar algo en el codigo cuando desarrolles un paquete, asi que estate alerta. Lo que es poco comun es que todo vaya suavemente y sin problemas. Es probable que encuentres y tengas que resolver problemas similares.

A pesar de que puedes cambiar cualquier cosa que necesites, no modifiques los ficheros mas de lo que sea necesario. Esto quiere decir que no cambies la indentacion del codigo, los retornos de carro o cualquier cosa que no sea necesaria. Cuando acabes de crear el paquete, tendras un fichero .diff.gz con los cambios entre los ficheros originales y los tuyos, y modificar ese tipo de cosas hace que sean excesivamente grandes y disminuye las probabilidades de que puedas aplicar los cambios posteriormente a nuevas versiones del programa.

Creacion de los archivos especificos de Debian

Vamos a crear ahora la parte de creacion del paquete. Debemos crear un directorio "./debian" y, al menos, los archivos siguientes: "debian/control", "debian/copyright", "debian/changelog" y "debian/rules".

   $ mkdir debian

De acuerdo con la politica de Debian, se requieren paginas de manual (man) para todos los binarios que haya en tu paquete. Tambien seria interesante añadir un icono y un archivo "debian/menu" con los datos necesarios para añadir el programa al menu, pero eso no es estrictamente necesario. Puesto que este tutorial no es sobre paginas de manual, no voy a tratar ese asunto aqui.

Archivo de control

"debian/control" debe tener una estructura parecida a lo siguiente:

 Source: <nombre del paquete>
 Section: <seccion>
 Priority: optional
 Maintainer: <mantenedor/a>
 Build-Depends: <dependencias para la creacion>
 Standards-Version: 3.6.1
 
 Package: <nombre del paquete>
 Architecture: any
 Depends: ${shlibs:Depends}
 Description: <insertar una descripcion de hasta 60 caracteres>
  <insertar una descripion larga, indentada por espacios>

Nuestro archivo "debian/copyright", ya que el programa se distribuye bajo la licencia GNU GPL:

 This package was debianized by <mantenedor/a> on
 <fecha y hora>.
 
 It was downloaded from <URI de origen>
 
 Upstream Author: <autor/a original>
 
 License:
 
    This package is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; version 2 dated June, 1991.
 
    This package is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
    along with this package; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
    02111-1307, USA.  
 
 On Debian GNU/Linux systems, the complete text of the GNU General
 Public License can be found in `/usr/share/common-licenses/GPL'.

Archivo de bitacora o "changelog"

Ahora el archivo "debian/changelog":

 <nombre del paquete> (<version del paquete>-<release>) unstable; urgency=low
 
   * Initial Release.
 
  -- <mantenedor/a>  <fecha y hora>

No voy a explicar como se construyen estos archivos. Echa un vistazo a la "Guía del Nuevo Desarrollador de Debian" ( http://www.debian.org/doc/maint-guide/ ).

Archivo de reglas o "rules"

Ahora vamos a por el archivo "debian/rules", donde se definen las reglas necesarias para la construccion del paquete.

"debian/rules" es en realidad un "Makefile", y se ejecuta mediante "/usr/bin/make". Puedes ejecutar el comando "info make", "man make" o echar un vistazo a http://www.gnu.org/software/make/manual/make.html si necesitas mas informacion sobre el sistema de construccion de "make".

El archivo "debian/rules" puede ser invocado con diferentes parametros: "build", "clean", "binary", asi que deberemos implementarlos todos ellos.

Descripcion del archivo "rules"

Definiciones iniciales

Antes de nada, añadiremos una linea para que el sistema sepa que se trata de un script de "make" en caso de que sea ejecutado directamente:

   #!/usr/bin/make -f

Ahora definiremos en una veriable el nombre del paquete para simplificar la gestion del archivo "debian/rules":

   # Nombre del paquete
   package=roaddemo

En algun momento de la ejecucion deberemos asegurarnos de que estamos en el directorio correcto y que estamos ejecutando el scrito como "root" (o mediante el comando "fakeroot>"), por lo que definiremos un par de funciones:

   # Funcion para comprobar que estamos en el directorio correcto
   define checkdir
        @test -f debian/rules -a -f roaddemo.cc || \
        (echo Not in correct source directory; exit 1)
   endef

   # Funcion para comprobar si somos root
   define checkroot
        @test $$(id -u) = 0 || (echo necesitas privilegios de root; exit 1)
   endef

"checkdir" comprueba que exista un archivo "debian/rules", asi como que tambien exista otro con el nombre "roaddemo.cc" en el directorio actial. "checkroot" comprueba que seamos "root". Estas funciones han sido tomadas tal cual del sistema de construccion de paquetes de from Manoj Srivastava y pueden ser usadas bajo licencia GNU GPL.

A continuacion definimos nuestros directorios de trabajo:

   # Directorio superior del codigo fuente (gracias Manoj)
   SRCTOP    := $(shell if [ "$$PWD" != "" ]; then echo $$PWD; else pwd; fi)
   # Directorio destino donde se instalaran los archivos
   DESTDIR    = $(SRCTOP)/debian/$(package)

"SRCTOP" ses el directorio superior de nuestro codigo fuente, y "DESTDIR" es el lugar en el que el paquete sera instalado temporalmente, es decir, el directorio "debian/roaddemo/".

Definiremos algunos otros directorios que nos simplificaran el trabajo mas tarde:

   # Definicion de directorios
   BIN_DIR = $(DESTDIR)/usr/bin
   GAMES_DIR = $(DESTDIR)/usr/games
   SHARE_DIR = $(DESTDIR)/usr/share/roaddemo
   DOCS_DIR = $(DESTDIR)/usr/share/doc/roaddemo
   MAN_DIR = $(DESTDIR)/usr/share/man/man1
   MAN_GAMES_DIR = $(DESTDIR)/usr/share/man/man6
   MENU_DIR = $(DESTDIR)/usr/lib/menu
   PIXMAPS_DIR = $(DESTDIR)/usr/share/pixmaps

"BIN_DIR" y "GAMES_DIR" es donde deberan ir los archivos ejecutables para los programas convencionales y los juegos respectivamente. "SHARE_DIR" es donde estaran instalados los archivos independientes de la plataforma. "DOCS_DIR" es para la documentacion, "MAN_DIR" y "MAN_GAMES_DIR" son para las paginas de manual (man), "MENU_DIR" es donde pondremos lor archivos de gestion del menu y "PIXMAPS_DIR" es donde deberan ir los iconos de los programas.

Reglas

Vamos ahora a continuar con la implementacion de los comandos. Puedes mirar en http://www.debian.org/doc/debian-policy/ch-source.html#s-debianrules para ver que reglas es necesario implementar:

  1. Reglas con marcas temporales (Stamp Rules)

 configure-stamp:
        $(checkdir)
        ./configure --host=$(DEB_HOST_GNU_TYPE) --build=$(DEB_BUILD_GNU_TYPE) --prefix=/usr --mandir=\$${prefix}/share/man --infodir=\$${prefix}/share/info
        touch configure-stamp
 
 build-stamp: configure-stamp
        $(checkdir)
        -rm -f build-stamp
        $(MAKE)
        touch build-stamp
 
 # Reglas para Debian
 
 build: build-stamp
 
 clean: stamp-configure
        $(checkdir)
        -rm -f *-stamp
        $(MAKE) distclean
        -rm -rf debian/$(package)
        -rm -f debian/files
        -rm -f debian/substvars
 
 binary-indep: build
 
 # Definiciones para la instalacion
 INST_OWN = -o root -g root
 MAKE_DIR  = install -p -d $(INST_OWN) -m 755
 INST_FILE = install -c    $(INST_OWN) -m 644
 INST_PROG = install -c    $(INST_OWN) -m 755 -s
 INST_SCRIPT = install -c  $(INST_OWN) -m 755
 
 binary-arch: build
        $(checkdir)
        $(checkroot)
 
        # Instalacion del programa
        $(MAKE) install DESTDIR=$(DESTDIR) LIBTOOL=libtool
 
        # Instalacion de los recursos del programa
        $(MAKE_DIR) $(SHARE_DIR)
        $(INST_FILE) road.bmp $(SHARE_DIR)
 
        $(MAKE_DIR) $(DESTDIR)/DEBIAN
        
        # Instalacion de la documentacion
        $(MAKE_DIR) $(DOCS_DIR)
        $(INST_FILE) debian/copyright $(DOCS_DIR)/copyright
        $(INST_FILE) debian/changelog $(DOCS_DIR)/changelog.Debian
        $(INST_FILE) README $(DOCS_DIR)/README
        
        # Instalacion de las paginas de manual (man)
        #$(MAKE_DIR) $(MAN_GAMES_DIR)
        #$(INST_FILE) roaddemo.6 $(MAN_GAMES_DIR)
        
        # Instalacion de menus e iconos
        #$(MAKE_DIR) $(MENU_DIR)
        #$(INST_FILE) debian/menu $(MENU_DIR)/roaddemo
        #$(MAKE_DIR) $(PIXMAPS_DIR)
        #$(INST_FILE) debian/roaddemo.xpm $(PIXMAPS_DIR)
 
        # Instalacion de los scripts de gestion del paquete
        #$(INST_SCRIPT) debian/postinst $(DESTDIR)/DEBIAN
        #$(INST_SCRIPT) debian/postrm $(DESTDIR)/DEBIAN
 
        # Compresion de la documentacion (gracias Helen)
        gzip -9 $(DOCS_DIR)/changelog.Debian
        #gzip -9 $(MAN_GAMES_DIR)/roaddemo.6
 
        # Eliminacion de los simbolos de los ejecutables ("strip") (gracias Helen)
        strip -R .comment $(BIN_DIR)/roaddemo
 
        # Averiguar las dependencias de librerias/bibliotecas compartidas (gracias Helen)
        dpkg-shlibdeps $(package)
 
        # Generacion del archivo de control (gracias Helen)
        dpkg-gencontrol -isp -P$(DESTDIR)
 
        # Creacion del archivo DEBIAN/md5sums (gracias Helen)
        cd $(DESTDIR) && find . -type f ! -regex '.*DEBIAN/.*' -printf '%P\0' | xargs -r0 md5sum > DEBIAN/md5sums
 
        # Creacion del paquete .deb (gracias Helen)
        dpkg-deb -b $(DESTDIR) ../

Acabaremos con una parte bastante generica:

 # Debajo de aqui hay una parte bastante generica
 
 binary: binary-indep binary-arch
 
 .PHONY: binary binary-arch binary-indep clean build

Las reglas "phony" son aquellas que no producen como resultado un archivo con el mismo nombre que la regla -- por ejemplo si escribes "make foo", y no se genera un archivo o directorio con el nombre "foo", en ese caso se trata de una regla "phony" (gracias, daf).

Explicacion

Ahora vamos con la explicacion de cada una de las partes:

"stamp-configure" comprueba que estamos en el directorio correcto y realiza las operaciones de conficuracion iniciales.

El proposito de las etiquetas *-stamp es evitar repetir las mismas operaciones varias veces. Cuando "make" necesita decidir que hacer, mira la hora de modificacion de los ficheros en cuestion. Como es obvio, esto no funciona cuando una regla no crea un archivo. Si ejecutas "./debian/rules build", y posteriormente "./debian/rules binary", "make" no sabra la segunda vez lo que ya has ejecutado la primera. Si, por el contrario, creas una regla "build-stamp", y haces que "build" dependa de ella, y realizas la operacion "touch build-stamp" cuando hayas terminado de compilar, "make" dispone con ello de una forma de averiguar si la compilacion ya se ha realizado (gracias de nuevo, daf).

"build" depende de que "stamp-configure" sea ejecutado antes. Si no lo ha sido, el sistema llama a esa regla automaticamente antes de compilar ("info make" para mas informacion). Tras ello, realiza la compilacion.

"clean" limpia los directorios de los restos de compilaciones previas. Puesto que se usa "make distclean" fpara ello, la regla ha de depender de que "stamp-configure" halla sido llamada antes. Tras ejecutar "make distclean", aun tenemos que eliminar alguno de los archivos temporales que el sistema de creacion de paquetes crea dentro del directorio "./debian" directory, esto es, el directorio de instalacion temporal "debian/roaddemo/" completo y los archivos "debian/files" y "debian/substvars".

"binary" crea, instala y construye todos los paquetes. Depende de "binary-indep" y de "binary-arch".

"binary-indep" crea, intala y construye los paquetes que son independientes de la platforma, como los scripts en perl o python, que no necesitan ser compilados para cada una de las plataformas. No necesitamos realizar ninguna operacion dentro de esta regla en nuestro caso.

"binary-arch" crea, intala y construye los paquetes que son dependientes de la platforma, como los programas compilados como es nuestro caso. En primer lugar comprobamos que estamos en el directorio adecuado y que somos "root" (o que estemos usando "fakeroot"). A continuacion ejecutamos "make install" para instalar el programa. Puesto que el sistema original de instalacion ignora el fichero "road.bmp", lo movemos a mano hasta su directorio destino: "/usr/share/roaddemo/". Recuerda que hemos modificado el codigo fuente con anterioridad para que lo vaya a abrir a esa direccion.

La parte de control del paquete ha de ir en un directorio llamado "debian/roaddemo/DEBIAN", asi que lo creamos. A continuacion copiamos los ficheros de documentacion al directorio "/usr/share/doc/roaddemo", incluyendo "debian/copyright" y "debian/changelog" (este ultimo renombrado a "changelog.Debian", por si acaso existe un fichero llamado "changelog" del autor original).

En caso de que tuvieramos paginas de manual (man), las instalariamos. De igual forma tambien instalariamos los scripts del sistema de gestion de menues y los iconos si disponemos de ellos. Una nota sobre los iconos: no hay ningun problema en añadir un nuevo archivo de tipo .xpm, ya que es un formato de tipo texto. El sistema de empaquetamiento de Debian no soporta la creacion de nuevos archivos en formato binario de forma directa, como pueden ser los .bmp, .png o .ico por ejemplo. Si necesitas añadirlos, deberas usar los comandos "uuencode" y "uudecode" de la forma apropiada.

A continuacion añadimos los scripts de gestion de la instalacion/eliminacion del paquete, En caso de que hayamos añadido un elemento del menu, necesitaremos al menos de las lineas necesarias en "postinst" y "postrm" para actualizar el sistema de menues. Si no estamos añadiendo elementos al menu, para instalar nuestro programa no los necesitaremos.

Ahora vamos con la parte finel. Comprimimos "changelog.Debian", asi como las paginas de manual (si tenemos alguna), eliminamos ("strip") los simbolos de depuracion de los binarios ejecutables, averiguamos las dependencias de librerias/bibliotecas compartidas (con "dpkg-shlibdeps") y generar el archivo de control (con "dpkg-gencontrol"). Tras ello creamos un archivo "debian/roaddemo/DEBIAN/md5sums" con las sumas "md5sum" de cada uno de los ficheros del paquete (para poder comprobarlos posteriormente), y finalmente creamos el paquete .deb en el directorio "../".

Recuerda que "debian/rules" debe ser ejecutable, por lo que no te olvides de hacer:

   $ chmod +x debian/rules

Adicion del menu

Si deseas que tu programa sea añadido automaticamente al sistema de menues de Debian, necesitaras crear un archivo "debian/menu", que debera ser algo parecido a:

 ?package(roaddemo):needs="x11" section="Games/Toy" \
        title="Road Demo" command="roaddemo" \
        icon="/usr/share/pixmaps/roaddemo.xpm"

O, si no quieres asignarle ningun icono:

 ?package(roaddemo):needs="x11" section="Games/Toy" \
        title="Road Demo" command="roaddemo"

Si añades un menu, ten en cuenta que tambien tienes que añadir en los scripts de gestion del paquete "debian/postinst" y "debian/postrm" los comandos necesarios para actualizar el sistema de menues:

Archivo "debian/postinst":

 #!/bin/sh
 set -e
 if [ "$1" = "configure" ] && [ -x /usr/bin/update-menus ]; then update-menus ; fi

Archivo "debian/postrm":

 #!/bin/sh
 set -e
 if [ "$1" = "configure" ] && [ -x /usr/bin/update-menus ]; then update-menus ; fi

Tienes informacion adicional sobre el sistema de menues en "/usr/share/doc/menu/html/index.html", dentro de los archivos de tu sistema Debian. Alli encontraras tambien la lista de posibles secciones que puedes usar.

Construccion del paquete

Ya hemos creado el paquete, vamos a comprobarlo:

En primer lugar eliminamos los resultados de intentos anteriores:

   $ debian/rules clean

Y creamos el paquete:

   $ debuild

Si todo va correctamente, deberiamos ver archivos nuevos en el directorio "../":

   $ ls ..
   roaddemo-1.0.1               roaddemo_1.0.1-1_i386.changes
   roaddemo_1.0.1-1.diff.gz     roaddemo_1.0.1-1_i386.deb
   roaddemo_1.0.1-1.dsc         roaddemo_1.0.1.orig.tar.gz
   roaddemo_1.0.1-1_i386.build

A continuacion vamos a comprobar si hay alguna irregularidad en el paquete usando los comandos "lintian" y "linda":

   $ lintian ../roaddemo_1.0.1-1_i386.deb
   $ linda ../roaddemo_1.0.1-1_i386.deb

Palabras finales

A pesar de que esto comenzo siendo un ejercicio personal para aprender el funcionamiento por dentro del sistema de empaquetamiento de Debian, se ha convertido en un tutorial completo que tal vez pueda ser util para otra gente. No podria haberlo realizado sin la ayuda de Debian-Women y Debian-Mentors. Lo mismo puedo decir respecto a Helen and Dafydd, no podria haberlo realizado sin vuestra ayuda. No me refiero solamente a escribir este documento sino, y mas importante para mi, aprender y comprender las cosas que he escrito aqui. Gracias.

Archivos completos

debian/control

-- CUT HERE --

 Source: roaddemo
 Section: games
 Priority: optional
 Maintainer: Miriam Ruiz <little_miry@yahoo.es>
 Build-Depends: libsdl1.2-dev, libgl-dev
 Standards-Version: 3.6.1
 
 Package: roaddemo
 Architecture: any
 Depends: ${shlibs:Depends}
 Description: Simple demo using opengl and SDL
  Bezier-road demo ported from glut to SDL.
  .
  Use the right mouse button to select one of the
  endpoints or control points, then click and drag
  with the left mouse button to move the point.

-- CUT HERE --

debian/copyright

-- CUT HERE --

 This package was debianized by Miriam Ruiz <little_miry@yahoo.es> on
 Sat,  8 Jan 2005 20:09:28 +0000.
 
 It was downloaded from http://www.newimage.com/~rhk/roaddemo/
 
 Upstream Author: Ray Kelm <rhk@newimage.com>
 
 License:
 
    This package is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; version 2 dated June, 1991.
 
    This package is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
    along with this package; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
    02111-1307, USA.  
 
 On Debian GNU/Linux systems, the complete text of the GNU General
 Public License can be found in `/usr/share/common-licenses/GPL'.

-- CUT HERE --

debian/changelog

-- CUT HERE --

 roaddemo (1.0.1-1) unstable; urgency=low
 
   * Initial Release.
 
  -- Miriam Ruiz <little_miry@yahoo.es>  Sat,  8 Jan 2005 20:09:28 +0000

-- CUT HERE --

debian/rules

-- CUT HERE --

 #!/usr/bin/make -f
 
 # Debian Rules by Miriam Ruiz <little_miry@yahoo.es>
 #    January 2005
 #
 # Thanks for their help and for some of their code go to:
 #    * Manoj Srivastava
 #    * Helen Faulkner
 #    * Dafydd Harries
 #    * Gregory Pomerantz
 
 ###############################################################################
 ##
 ## This program is free software; you can redistribute it and/or modify
 ## it under the terms of the GNU General Public License as published by
 ## the Free Software Foundation; either version 2 of the License, or
 ## (at your option) any later version.
 ##
 ## This program is distributed in the hope that it will be useful,
 ## but WITHOUT ANY WARRANTY; without even the implied warranty of
 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 ## GNU General Public License for more details.
 ##
 ## You should have received a copy of the GNU General Public License
 ## along with this program; if not, write to the Free Software
 ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 ##
 ###############################################################################
 
 # Name of the package
 package=roaddemo
 
 # Function to check if we're in the correct dir (thanks Manoj)
 define checkdir
        @test -f debian/rules -a -f roaddemo.cc || \
        (echo Not in correct source directory; exit 1)
 endef
 
 # Function to check if we're root (thanks Manoj)
 define checkroot
        @test $$(id -u) = 0 || (echo need root priviledges; exit 1)
 endef
 
 # Top directory of the source code (thanks Manoj)
 SRCTOP    := $(shell if [ "$$PWD" != "" ]; then echo $$PWD; else pwd; fi)
 # Destination directory where files will be installed
 DESTDIR    = $(SRCTOP)/debian/$(package)
 
 # Definition of directories
 BIN_DIR = $(DESTDIR)/usr/bin
 GAMES_DIR = $(DESTDIR)/usr/games
 SHARE_DIR = $(DESTDIR)/usr/share/roaddemo
 DOCS_DIR = $(DESTDIR)/usr/share/doc/roaddemo
 MAN_DIR = $(DESTDIR)/usr/share/man/man1
 MAN_GAMES_DIR = $(DESTDIR)/usr/share/man/man6
 MENU_DIR = $(DESTDIR)/usr/lib/menu
 PIXMAPS_DIR = $(DESTDIR)/usr/share/pixmaps
 
 # Stamp Rules
 
 configure-stamp:
        $(checkdir)
        ./configure --host=$(DEB_HOST_GNU_TYPE) --build=$(DEB_BUILD_GNU_TYPE) --prefix=/usr --mandir=\$${prefix}/share/man --infodir=\$${prefix}/share/info
        touch configure-stamp
        
 build-stamp: configure-stamp
        $(checkdir)
        -rm -f build-stamp
        $(MAKE)
        touch build-stamp
 
 # Debian rules
 
 build: build-stamp
 
 clean: stamp-configure
        $(checkdir)
        -rm -f *-stamp
        $(MAKE) distclean
        -rm -rf debian/$(package)
        -rm -f debian/files
        -rm -f debian/substvars
 
 binary-indep: build
 
 # Definitions for install
 INST_OWN = -o root -g root
 MAKE_DIR  = install -p -d $(INST_OWN) -m 755
 INST_FILE = install -c    $(INST_OWN) -m 644
 INST_PROG = install -c    $(INST_OWN) -m 755 -s
 INST_SCRIPT = install -c  $(INST_OWN) -m 755
 
 binary-arch: build
        $(checkdir)
        $(checkroot)
 
        # Install Program
        $(MAKE) install DESTDIR=$(DESTDIR) LIBTOOL=libtool
 
        # Install Program Resources
        $(MAKE_DIR) $(SHARE_DIR)
        $(INST_FILE) road.bmp $(SHARE_DIR)
 
        $(MAKE_DIR) $(DESTDIR)/DEBIAN
        
        # Install Docs
        $(MAKE_DIR) $(DOCS_DIR)
        $(INST_FILE) debian/copyright $(DOCS_DIR)/copyright
        $(INST_FILE) debian/changelog $(DOCS_DIR)/changelog.Debian
        $(INST_FILE) README $(DOCS_DIR)/README
        
        # Install Manpages
        #$(MAKE_DIR) $(MAN_GAMES_DIR)
        #$(INST_FILE) roaddemo.6 $(MAN_GAMES_DIR)
        
        # Install Menu and Icon
        #$(MAKE_DIR) $(MENU_DIR)
        #$(INST_FILE) debian/menu $(MENU_DIR)/roaddemo
        #$(MAKE_DIR) $(PIXMAPS_DIR)
        #$(INST_FILE) debian/roaddemo.xpm $(PIXMAPS_DIR)
 
        # Install Package Scripts
        #$(INST_SCRIPT) debian/postinst $(DESTDIR)/DEBIAN
        #$(INST_SCRIPT) debian/postrm $(DESTDIR)/DEBIAN
 
        # Compress Docs (thanks Helen)
        gzip -9 $(DOCS_DIR)/changelog.Debian
        #gzip -9 $(MAN_GAMES_DIR)/roaddemo.6
 
        # Strip the symbols from the executable (thanks Helen)
        # TODO: the stripping part in binary-arch should honor the DEB_BUILD_OPTIONS environment variable and not strip stuff when it includes 'nostrip'
        strip -R .comment $(BIN_DIR)/roaddemo
 
        # Work out the shared library dependancies (thanks Helen)       
        dpkg-shlibdeps $(package)
 
        # Generate the control file (thanks Helen)
        dpkg-gencontrol -isp -P$(DESTDIR)
 
        # Make DEBIAN/md5sums (thanks Helen)
        cd $(DESTDIR) && find . -type f ! -regex '.*DEBIAN/.*' -printf '%P\0' | xargs -r0 md5sum > DEBIAN/md5sums
 
        # Create the .deb package (thanks Helen)
        dpkg-deb -b $(DESTDIR) ../
 
 # Below here is fairly generic really
 
 binary: binary-indep binary-arch
 
 .PHONY: binary binary-arch binary-indep clean build

-- CUT HERE --