Makefiles
Automatizan la compilación de programas con múltiples unidades de compilación y múltiples objetivos
Archivos de texto
Se corren con la herramienta GNU/Make
Elementos de un makefile
- declaración de variables
- definiciones de objetivos
Veamos los objetivos
objetivo: requisitos
acciones
Los requisitos son nombres de archivos y otros objetivos
Una primera aplicación del verificador.
Vamos a crear un programa de consola que reciba una lista de palabras como argumentos e imprima solo aquellas que son palíndromos.
Ejemplo
$ ./palindromos a aba aab baa aBA baba bab
a
aba
bab
El programa
Usando el verificador de palindromo y lo que vimos de argv y argc el programa es fácil de escribir.
Veamos el pseudocódigo:
si no hay argumentos
explicar el funcionamiento
salir
para cada argumento
si es palíndromo, imprimir la palabra
El código
/* palindromos.c */
#include <stdio.h>
#include "palindromo.h"
int main(int argc, char **argv) {
int i = 1;
if (argc == 1) {
puts("uso: ./palindromo palabras+");
puts("\n\tImprime las palabras que son palíndromo.");
return -1;
}
for (; i < argc; ++i)
if (es_palindromo(argv[i]) == 1)
puts(argv[i]);
return 0;
}
Compilar
Es fácil de codear, complicado de compilar. Bah igual que antes.
palindromo.c $ \rightarrow $ palindromo.o
palindromos.c + palindromo.o $ \rightarrow $ palindromos
Entra make en escena
Tenemos 2 objetivos de mínima. 3 si profesamos la ingeniería del software y queremos volver a casa temprano regularmente.
- compilar la implementacion de palindromo
- testearla
- generar el programa
Hagamos un Make
palindromos: palindromo.o
cc palindromos.c palindromo.o -o palindromos
palindromo.o: palindromo.c
cc -c palindromo.o
palindromo_tests: palindromo.o
cc palindromo_tests.c palindromo.o -o palindromo_tests
Ejecutamos
$ make
$ ./palindromo aba
aba
Correr los tests
Para asegurarnos de correr los tests podemos agregar al Makefile el objetivo tests:
tests: palindromo_tests
./palindromo_tests
Y ejecutando make tests compila y corre los tests.
Limpieza
Si el proceso de compilación falla, podemos seguir viendo los ejecutables anteriores. Esto puede generar confusiones.
El objetivo clean borra los archivos ejecutables y los .o
clean:
rm -rf palindromos palindromo_tests *.o
Todos juntos
Podemos agregar el objetivo all arriba de todo con los tests y la generación del ejecutable.
De esta manera al correr solo make corre todo. Si sólo queremos correr los tests corremos make tests.
Para limpiar y subir el código make clean.
Hagamos un Make Grande Esta Vez
all: tests palindromos
palindromos: palindromo.o
cc palindromos.c palindromo.o -o palindromos
palindromo.o: palindromo.c
cc -c palindromo.c
palindromo_tests: palindromo.o
cc palindromo_tests.c palindromo.o -o palindromo_tests
tests: palindromo_tests
./palindromo_tests
clean:
rm -rf palindromos palindromo_tests *.o
Resumiendo
- Los makefiles nos permiten automatizar el proceso de compilación.
- Para eso establecemos objetivos con un requerimientos.
- Permiten automatizar la ejecución de tests.
- Permiten automatizar la limpieza de binarios.
Aprender más
Esto es la punta del iceberg del Makefile.
Se usan para compilar de todo.
Dos apuntes para continuar:
- https://josemariasola.github.io/ssl/papers/Make.pdf
- https://makefiletutorial.com/