Makefile

Makefile
Información sobre la plantilla
Makelo1.jpg
Herramienta de generación o automatización de código
CreadorJCSC-II
Fecha de Creación2011

Make. Herramienta de generación o automatización de código, muy usada en los sistemas operativos tipo Unix/Linux.

Por defecto lee las instrucciones para generar el programa u otra acción del fichero makefile. Las instrucciones escritas en este fichero se llaman dependencias. La herramienta make se usa para las labores de creación de fichero ejecutable o programa, para su instalación, la limpieza de los archivos temporales en la creación del fichero,todo ello especificando unos parámetros iniciales (que deben estar en el makefile) al ejecutarlo.

Estructura de un makefile

200px] Interfaz Makefiles

Los makefiles son los ficheros de texto que utiliza make para llevar la gestión de la compilación de programas. Se podrían entender como los guiones de la película que quiere hacer make, o la base de datos que informa sobre las dependencias entre las diferentes partes de un proyecto. Todos los Makefiles están ordenados en forma de reglas, especificando qué es lo que hay que hacer para obtener un módulo en concreto. El formato de cada una de esas reglas es el siguiente:

  • Objetivo
  • Dependencias
  • Comandos

En objetivo definimos el módulo o programa que queremos crear, después de los dos puntos y en la misma línea podemos definir qué otros módulos o programas son necesarios para conseguir el objetivo. Por último, en las líneas siguientes y sucesivas indicamos los comandos necesarios para llevar esto a cabo. Es muy importante que los comandos estén separados por un tabulador del comienzo de línea. Algunos editores como el mcedit cambian los tabuladores por 8 espacios en blanco, y esto hace que los Makefiles generados así no funcionen. Un ejemplo de regla podría ser el siguiente: juego : ventana.o motor.o bd.o

gcc –O2 –c juego.c –o juego.o gcc –O2 juego.o ventana.o motor.o bd.o –o juego

Para crear “juego” es necesario que se hayan creado “ventana.o”, “motor.o” y “bd.o” (típicamente habrá una regla para cada uno de esos ficheros objeto en ese mismo Makefile). En los siguientes apartados se analizará un poco más a fondo la sintaxis de los Makefiles.

Formato del archivo Makefile

Un archivo Makefile es un archivo de texto en el cual se distinguen cuatro tipos básicos de declaraciones:

  • Comentarios.
  • Variables.
  • Reglas explicitas.
  • Reglas implícitas.

Comentarios

Al igual que en los programas, contribuyen a un mejor entendimiento de las reglas definidas en el archivo. Los comentarios se inician con el carácter #, y se ignora todo lo que contiene después de ella, hasta el final de línea. # Este es un comentario

Variables

Se definen utilizando el siguiente formato:

nombre = dato

De esta forma, se simplifica el uso de los archivos Makefile. Para obtener el valor se emplea la variable encerrada entre paréntesis y con el carácter $ al inicio, en este caso todas las instancias de $(nombre) serán reemplazadas por dato. Por ejemplo, la siguiente definición

SRC = main.c

origina la siguiente línea:

gcc $(SRC)

y será interpretada como:

gcc main.c

Sin embargo, pueden contener más de un elemento dato. Por ejemplo:

{{{1}}}

Hay que notar que make hace distinción entre mayúsculas y minúsculas.

Reglas explícitas

Estas le indican a make que archivos dependen de otros archivos, así como los comandos requeridos para compilar un archivo en particular. Su formato es:

       archivoDestino: archivosOrigen
              comandos  # Existe una carácter TAB (tabulador) antes de cada comando.

Esta regla indica que, para crear archivoDestino, make debe ejecutar comandos sobre los archivos archivosOrigen. Por ejemplo:

       main: main.c funciones.h
             gcc -o main main.c funciones.h

significa que, para crear el archivo de destino main, deben existir los archivos main.c y funciones.h y que, para crearlo, debe ejecutar el comando:

       gcc -o main main.c funciones.h

Reglas implícitas

Son similares a las reglas explicitas, pero no indican los comandos a ejecutar, sino que make utiliza los sufijos (extensiones de los archivos) para determinar que comandos ejecutar. Por ejemplo:

       funciones: funciones funciones.h

origina la siguiente línea:

       $(CC) $(CFLAGS) -c funciones.c funciones.h

Existe un conjunto de variables que se emplean para las reglas implícitas, y existen dos categorías: aquellas que son nombres de programas (como CC) y aquellas que tienen los argumentos para los programas (como CFLAGS). Estas variables son provistas y contienen valores predeterminados, sin embargo, pueden ser modificadas, como se muestra a continuación:

       CC = gcc

CFLAGS = -Wall -O2

En el primer caso, se ha indicado que el compilador que se empleará es gcc y sus parámetros son -Wall -O2.

Mejorando los Makefiles con variables automáticas

Existen algunas variables automáticas que permiten escribir los archivos Makefiles de una forma genérica, de esta

Makefile

forma, si se requiere modificar el nombre de un archivo o regla, solo sea necesario realizar los cambios en un solo lugar, o en la menor cantidad posible y así evitar errores.

Las variables automáticas más empleadas son: $<. El nombre del primer prerrequisito. $*. En la definición de una regla implícita, tiene el valor correspondiente al texto que reemplaza el símbolo %. $?. El nombre de todos los prerrequisitos. $@. El nombre del archivo del objetivo de la regla. Ejemplo: %.pdf: %.ps ps2pdf $<

%.zip: %.pdf echo $*.zip $<

PDF = documento1.pdf documento2.pdf ZIP = documento1.zip documento2.zip

pdf: $(PDF)

paquete: $(PDF) tar zcvf $@.tar.gz $?

zip: $(ZIP)

clean: rm -f *.pdf *.tar

En el ejemplo, se han definido dos reglas implícitas. La primera indica como convertir un archivo PostScript a PDF y la segunda, como comprimir un archivo PDF en formato ZIP. También se han definido cuatro reglas, dos de ellas son implícitas (pdf y zip), donde solo se han indicado sus prerrequisitos y las otras dos (paquete y clean) son explícitas. Cuando se ejecute la regla paquete, make analizará las dependencias, es decir, verificará si existen los correspondientes archivos PDF, sino, los construye, y luego para a ejecutar el comando indicado en la regla. La variable $? será expandida a "documento1.pdf documento2.pdf" y la variable $@ seré expandida a "paquete". De esta forma, el comando a ejecutar seré: tar zcvf paquete.tar.gz documento1.pdf documento2.pdf En el caso de la regla zip, al resolver las dependencias se ejecutará: zip documento1.zip documento1.pdf zip documento2.zip documento2.pdf

Es decir, el patrón buscado es "documento1" y "documento2", el cual corresponde a la expresión %. Dicha operación se realizar por cada archivo .pdf

Fuentes