Página siguiente Página anterior Índice general

2. Entender los makefiles

Una de las cosas que debes entender a fondo es el fichero rules, este fichero contiene todos los pasos que se van ha dar para la construcion de paquete, de manera que se pueda automatizar al maximo.

Este fichero no es en realidad mas que otra cosa que un guion del make, similar a los fichero Makefile que se encuentran en muchos de los codigos fuente.

Si estas familiarizado con los ficheros Makefile, quiza te puedas saltar esta seccion, echale un vistazo al del paquete hello, y si no lo ves claro sigue leyendo.

Estos guiones, estan compuestos por una serie de objetivos, de objetivos que hay que hacer antes y de pasos necesarios para conseguir ese objetivo. Si alguna vez has recompilado el kernel ( supongo que si, no creo que de otra manera estubieses leyendo esto ), recordaras que haces make clean, make xconfig, clean, xconfig son objetivos, y make que es el programa que interpreta los guiones, se encarga de cumplir esos objetivos.

Veamos ahora algunas partes:


#!/usr/make -f

Esta linea, tiene que ser la primera y simplemente sirve para que, despues de dar permisos de ejecucion al fichero, podamos ejecutarlo directamente, de otra manera tendriamos que ejecutar make -f nombre del fichero (make busca por defecto el fichero Makefile, si el guion tiene otro nombre hay que indicarselo).


# Esto es un gracioso comentario ;-)

Creo que no hace falta decir mas.


objetivo: objetivo_anterior_a_realizar otro_objetivo
        paso uno a ejecutar
        - un paso que no importa que falle
        otro paso mas

Aqui tenemos una definicion completa de los pasos a realizar para conseguir un objetivo, pero antes definamos objetivo:

Objetivo es un fichero, asi de simple, si ese fichero existe entonces make considera que no es necesario volver a hacerlo, y acaba. Si ese fichero no existe, entonces primero mira a ver si son necesario otros objetivos antes que ese ( son las palabras que aparecen en esa linea tras los dos puntos.

Si todos los objetivos anteriores estan cumplidos empieza a ejecutar los pasos necesarios, notese que es MUY IMPORTANTE que EL PRIMER CARACTER de las lineas de pasos SEA UN TABULADOR ya que de otra manera no funciona. Los pasos los ejecuta como si los teclease en la linea de comandos, en esto se comporta parecido a un guion del bash.

Un detalle interesante es que si cualquiera de los pasos falla, el make para la construcion del objetivo y muestra un mensaje de error. una escepcion a esto es cuando antes del comando hay un guion '-' en este caso make continuara aunque falle el paso.

De manera similar a los guiones del bash podemos definir variables, y usarlas si ponemos $(nombre).

Otra cosa que se puede hacer definir varias acciones a una variable, si usamos


define nombre
        pasos de los que consta nombre
        mas pasos
endef

Analicemos ahora un trozo de un fichero rules para aclarar un par de cosas:


#!/usr/bin/make -f
# based on the sample debian/rules file for GNU hello by Ian Jackson.
# I used debmake, but I change it a lot.
# Alvaro Alea, 1999, <aleasoft@geocites.com>

package=siag

build:
        $(checkdir)
        ./configure --prefix=/usr
        make CFLAGS="-O2 -g -Wall"
        touch build

Fijese en que para construir build se dan cuatro pasos, primero se ejecuta $(checkdir) que es definido mas adelante ( no importa el orden )

Despues se ejecuta ./configure --prefix=/usr, note que todas las ordenes del rules se suponen que estan realizadas desde el raiz del codigo fuente, aunque el fichero rules se encuentra en el directorio debian que cuelga de este.

luego se llama a make ( se puede llamar recursivamente sin problemas ) que como no se le pasan el fichero a usar, utilizara el Makefile que halla en el directorio raiz del codigo fuente, y como no se le pasa ningun objetivo ejecutara el primero que pille, el tercer detalle es que es posible sobreescribir las definiciones de variables desde fuera, en este caso CFLAGS .

despues hay un touch build, touch actualiza la fecha del fichero que se le pase como parametro, y si no existe, crea uno de 0 bytes, notese que build es tambien el nombre del fichero objetivo, esto se hace por que aunque el objetivo se llama build, lo normal es que el fichero que se cree se llame de otra forma.


clean:
        $(checkdir)
        -rm -f build
        -make distclean
        dh_clean

Aqui lo unico destacable es que el objetivo clean, aparte de ejecutar las ordenes necesarias para limpiar el arbol de codigo fuente, borra build ( solo si existe, tiene un guion antes para indicar que continue si falla al borrarlo).


binary-indep: checkroot build
        $(checkdir)

En este objetivo vemos como antes de realizarlo, realiza checkroot ( por cuestiones de permisos, para construir ciertas partes del paquete es necesario ser root, o al menos parecerlo ) y despues build, para continuar con el proceso.


.
.
.
.PHONY: binary binary-arch binary-indep clean checkroot

La ultima linea indica que objetivos no van a crear un fichero con el nombre del objetivo, normalmente se deja como esta.

Y para acabar, no estaria de mas que le echases un vistazo al rules del paquete hello, a la pagina man del make (que esta en español) y la ayuda que ofrece el programa info ( que es la que se actualiza ).


Página siguiente Página anterior Índice general