[ anterior ] [ Contenidos ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ] [ 12 ] [ 13 ] [ siguiente ]


APT HOWTO
Capítulo 5 - Building from source


5.1 Descargando los paquetes fuente

Es muy común en el mundo del software libre estudiar el código fuente o corregir código erróneo. Para lograr esto, necesita descargar el código fuente del programa. El sistema APT provee de una manera fácil de obtener código fuente de muchos programas contenidos en la distribución, incluyendo todos los archivos necesarios para crear un .deb para el programa.

Otro uso común de las fuentes de Debian es el de adaptar la versión más reciente de un programa, de la versión inestable. Compilar un programa en la versión estable generará .debs con las dependencias ajustadas para acoplarse a los paquetes en la distribución.

Para lograr esto una entrada deb-src en el archivo /etc/apt/sources.list debe apuntar hacia "unstable". Esta línea debe estar habilitada (sin comentar). Vea a la sección El archivo /etc/apt/sources.list, Sección 3.1.

Aptitude, the Debian Package Manager is mainly targeted at binary packages. To use source packages we'll need to use apt-get instead. To download a source package, you would use the following command:

     $ apt-get source packagename

Esto descargará tres archivos: un .orig.tar.gz, un .dsc y un .diff.gz. En el caso de paquetes especiales para Debian, el último de estos archivos no es descargado y el primero generalmente no tendrá el "orig" en el nombre.

El archivo .dsc es utilizado por dbpkg-source para descomprimir el paquete en el directorio packagename-version. Con cada paquete descargado existe un directorio debian/ que contiene los archivos necesarios para crear un paquete .deb.

Para automáticamente compilar el paquete cuando está siendo descargado, sólo agrega -b a la línea de comando así.

     $ apt-get -b source packagename

Si decide no crear el archivo .deb mientras descarga el paquete, puede crearlo después ejecutando:

     $ dpkg-buildpackage -rfakeroot -uc -b

Notice that to build most packages you'll need at least the following packages: devscripts, dpkg-dev, debhelper, fakeroot, take a look at Instalando paquetes, Sección 4.4 and install them before proceeding. Most packages will also depend on compilation tools, so it may be useful to install the build-essential package as well. Other packages may be needed, take a look at Paquetes necesarios para la compilación de un paquete fuente, Sección 5.2 for more information.

To install the package built by the commands above one must use the package manager directly. Take a look at Installing manually downloaded or locally created debian packages, Sección 4.5. A useful tool is provided by the devscripts package: debi. If you run debi from inside the source package directory it will look for the .changes file at the parent directory to discover what are the binary packages the package produces and will run dpkg to install all of them. While this is not very useful if your source package produces conflicting packages, it might be in most circunstances. Of course you need root powers in order to perform this.

Hay una diferencia entre el apt-get source y las otras opciones. La opción source puede ser utilizada por usuarios normales, sin necesitar de poderes especiales de root. Los archivos son descargados a un directorio desde el cual el comando apt-get source package es ejecutado.


5.2 Paquetes necesarios para la compilación de un paquete fuente

Normalmente, librerías compartidas y ciertos encabezados son necesarios para lograr una compilación exitosa. Todos los paquetes fuente tienen un campo en sus archivos de control llamado "Build-Depends:" el cual indica que paquetes son necesarios adicionalmente para que el paquete sea compilado.

APT tiene un método sencillo para descargar estos paquetes. Sólo ejecuta apt-get build-dep package, donde "package" es el nombre del paquete que vas a compilar, por ejemplo:

     # apt-get build-dep gmc
     Reading Package Lists... Done
     Building Dependency Tree... Done
     The following NEW packages will be installed:
       comerr-dev e2fslibs-dev gdk-imlib-dev imlib-progs libgnome-dev libgnorba-dev
       libgpmg1-dev
     0 packages upgraded, 7 newly installed, 0 to remove and 1 not upgraded.
     Need to get 1069kB of archives. After unpacking 3514kB will be used.
     Do you want to continue? [Y/n]

Los paquetes que serán instalados son los paquetes necesarios para que gmc sea compilado correctamente. Es importante observar que este comando no busca el paquete fuente del programa a ser compilado. Necesitará entonces ejecutar apt-get source para obtenerlo.

Si quiere solamente saber cuales paquetes se requieren para crear un cierto paquete, hay una variante del comando apt-cache show (vease Obteniendo información de los paquetes., Capítulo 6, que enseña, entre otra información, la línea Build-Depends que enlista estos paquetes.

     # apt-cache showsrc
     package

5.3 Trabajando con paquetes

If you want to build a package for debuging purposes to, for example, report a bug -- or fix one, you can use simple environment variables that are supported by most Debian packages.

To build a package which contains unstriped binaries[6] all you need to do is prefix it with DEB_BUILD_OPTIONS=nostrip. Optimizations can also make debuging harder, so you can disable them by adding the noopt string to the DEB_BUILD_OPTIONS variable too. Example:

     $ dpkg-buildpackage -rfakeroot -uc -b

5.4 Customizing package build options

If what you want is to customize the way the package is built you'll have to go about editing the debian/rules file. This means: inside the main directory created when the source package is extracted there will be a debian directory, which contains many files. One of them is special: the rules file.

This file is usually a Makefile that has targets to configure, build, install and create the package. For example, if I want to have the luola[7] built without sound I can, after downloading and extracting its source edit the debian/rules file that looks like this:

     [...]
     configure: configure-stamp
     configure-stamp:
     	dh_testdir
     	# Add here commands to configure the package.
     	./configure $(confflags) \
     		--prefix=/usr \
     		--mandir=share/man \
     		--infodir=share/info \
     		--datadir=share/games \
     		--bindir=games \
     		--enable-sound
     #		 --enable-sdl-gfx	
     
     	touch configure-stamp
     [...]

See the --enable-sound switch? If I remove it or replace it with --disable-sound and then rebuild the package using the technique described on Descargando los paquetes fuente, Sección 5.1 I'll have a luola package that is built with no sound.

If you really want to work with source packages on a daily basis I would suggest reading the Debian New Maintainers Guide and the Debian Policy, mainly. Other documentation available from the Debian Developers Corner may be useful too.


5.5 But hey, I do not want to use the Debian stuff!

Sometimes, people want to use a specific version of a program available only on source code, with no Debian package. But the packaging system can be a trouble when doing this. Suppose you want to compile a new version of your email server. All is fine, but many packages in Debian depend on an MTA (Mail Transfer Agent). Since you installed something you compiled by yourself, the packaging system doesn't know about it.

Aquí es donde equivs entra a la escena. Para utilzarlo, instale el paquete con ese nombre. Lo que hace es crear un paquete vacio que posibilita el satisfacer las dependencias, haciendo que el sistema de administración de paquetes crea que las dependencias han sido satisfechas.

Antes de iniciar, es bueno recordarle que hay maneras más seguras de compilar un programa que esta ya empaquetedo para Debian con diferentes opciones, y que no se debería utilizar equivs para reemplazar dependencias si no sabe lo que hace. Consulte Building from source, Capítulo 5 para mas informacion.

Continuemos con el ejemplo del MTA, usted acaba de instalar su postfix recién compilado y ahora instalará mutt. De repente descubre que mutt quiere instalar otro MTA. Pero usted ya tiene el suyo.

Vaya a algún directorio (/tmp, por ejemplo) y ejecute:

     # equivs-control name

Sustituya name por el nombre del archivo de control que quiera crear. El archivo será creado como se muestra:

     Section: misc
     Priority: optional
     Standards-Version: 3.0.1
     
     Package: <enter package name; defaults to equivs-dummy>
     Version: <enter version here; defaults to 1.0>
     Maintainer: <your name and email address; defaults to username>
     Pre-Depends: <packages>
     Depends: <packages>
     Recommends: <packages>
     Suggests: <package>
     Provides: <(virtual)package>
     Architecture: all
     Copyright: <copyright file; defaults to GPL2>
     Changelog: <changelog file; defaults to a generic changelog>
     Readme: <README.Debian file; defaults to a generic one>
     Extra-Files: <additional files for the doc directory, comma separated>
     Description: <short description; defaults to some wise words>
      long description and info
      .
      segundo párrafo

Nosotros sólo necesitamos modificar esto para hacer lo que queremos. Eche un vistazo al formato del campo y a sus descripciones, no hay necesidad de explicar cada una, vamos a hacer lo que se necesita:

     Section: misc
     Priority: optional
     Standards-Version: 3.0.1
     
     Package: mta-local
     Provides: mail-transport-agent

Si, eso es todo. mutt depende de mail-transport-agent, este es un paquete virtual provisto por todos los MTA, yo podría simplemente nombrar el paquete mail-transport-agent, pero prefiero usar el esquema de paquetes virtuales, utilizando "Provides".

The Conflicts and Replaces fields are needed, too, so that APT and dpkg will understand they should remove the currently installed MTA package in favour of the new one you're installing.

Ahora sólo necesita crear el paquete:

     # equivs-build name
     
     dh_testdir
     touch build-stamp
     dh_testdir
     dh_testroot
     dh_clean -k
     # Add here commands to install the package into debian/tmp.
     touch install-stamp
     dh_testdir
     dh_testroot
     dh_installdocs
     dh_installchangelogs
     dh_compress
     dh_fixperms
     dh_installdeb
     dh_gencontrol
     dh_md5sums
     dh_builddeb
     dpkg-deb: building package `name' in `../name_1.0_all.deb'.
     
     The package has been created.
     Attention, the package has been created in the current directory,

E instalar el .deb creado.

Como se puede ver, hay muchos usos para equivs. Se puede crear un paquete my-favorites el cual dependiera en los paquetes que usted usualmente instala, por ejemplo. Sólo deje volar su imaginación, pero sea cuidadoso.

Es importante recalcar que hay archivos de control ejemplo en /usr/share/doc/equivs/examples. Revíselos.


[ anterior ] [ Contenidos ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ] [ 12 ] [ 13 ] [ siguiente ]


APT HOWTO

2.0.2 - October 2006

Gustavo Noronha Silva kov@debian.org
Hugo Mora h.mora@melix.com.mx