Makefile
|
Estructura de un makefile

- 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
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:
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

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