Programación en C/Herramientas externas útiles

De Wikilibros, la colección de libros de texto de contenido libre.
Ir a la navegación Ir a la búsqueda

Sistemas de construcción de código[editar]

make[editar]

make es un programa para la construcción de código. Su función principal es evitarnos recompilar archivos innecesariamente. Se basa en reglas de dependencia, que especifican qué ficheros dependen de cuales, y órdenes de construcción.

Para ver un ejemplo sencillo. En la sección anterior vimos un programa que dependía de tres ficheros objeto, los cuales dependían a su vez de ficheros fuente y ficheros de cabecera. Así, sólo será necesario enlazar de nuevo el programa cuando cambie alguno de los ficheros objeto. Esto lo podemos expresar, con dependencias, de esta manera:


programa: fuente1.o fuente2.o fuente3.o

Igualmente, los ficheros objeto dependen de los ficheros fuente y los ficheros de cabecera de una manera que podemos expresar como:

fuente1.o: fuente1.c fuente1.h cabecera.h
fuente2.o: fuente2.c cabecera.h
fuente3.o: fuente3.c cabecera.h

De esta manera, si hacemos un cambio en fuente2.c, la regla para fuente2.o lo detectará y recompilará fuente2.o, y a continuación la regla para programa detectará el cambio en fuente2.o y reenlazará programa.

Para ello, make necesita saber también cómo reconstruir sus objetivos. Estas órdenes (que, ojo, van siempre precedidas de un tabulador, no de espacios) son las mismas que usaríamos a mano y que vimos en el capítulo anterior:

programa: fuente1.o fuente2.o fuente3.o
        gcc -o programa fuente1.o fuente2.o fuente3.o

fuente1.o: fuente1.c fuente1.h cabecera.h
        gcc -c -o fuente1.o fuente1.c

fuente2.o: fuente2.c cabecera.h
        gcc -c -o fuente2.o fuente2.c

fuente3.o: fuente3.c cabecera.h
        gcc -c -o fuente3.o fuente3.c

Todas estas órdenes van en fichero, el fichero de make, cuyo nombre suele ser makefile. Utilizando la versión de GNU de make es más normal llamarlo Makefile, ya que aunque el programa buscará primero si existe el nombre con minúscula, el capitalizado aparecerá más arriba al listar un directorio.

Una vez escrito el Makefile, para construir nuestro programa basta con ejecutar make:

$ make
gcc -c -o fuente1.o fuente1.c
gcc -c -o fuente2.o fuente2.c
gcc -c -o fuente3.o fuente3.c
gcc -o programa fuente1.o fuente2.o fuente3.o

Esto se debe a que, si no especificamos un objetivo para make, el programa tomará como objetivo por defecto el de la primera regla que hayamos escrito en el Makefile.

Si teniéndolo todo ya compilado ejecutamos make de nuevo veremos:

$ make
make: `programa' está actualizado.

Y si ahora hacemos un cambio en fuente2.c, al ejecutar make una vez más tendremos:

$ make
gcc -c -o fuente2.o fuente2.c
gcc -o programa fuente1.o fuente2.o fuente3.o

De esta manera, el programa nos ahorra recompilar o reenlazar los ficheros cuyas dependencias no hayan cambiado. Para ello, make se fija en la fecha y hora de la última actualización de cada fichero. Si ésta es posterior a la de todas sus dependencias, make no reconstruirá el objetivo. Si, en cambio, alguna de las dependencias de un fichero es posterior a él, el programa ejecutará las instrucciones que le hemos dado para reconstruir el objetivo.

Y como en todo lo que hemos visto hasta ahora, los comentarios son muy importantes. En un Makefile (o makefile) éstos se hacen con el carácter #:

######
# Makefile
#
# (c) Envite, 2004
# para el wikilibro "Programación en C (fundamentos)"
# bajo licencia FDL
#####

#Regla para construir el programa
programa: fuente1.o fuente2.o fuente3.o
        gcc -o programa fuente1.o fuente2.o fuente3.o

#Reglas para construir los ficheros objeto
fuente1.o: fuente1.c fuente1.h cabecera.h
        gcc -c -o fuente1.o fuente1.c

fuente2.o: fuente2.c cabecera.h
        gcc -c -o fuente2.o fuente2.c

fuente3.o: fuente3.c cabecera.h
        gcc -c -o fuente3.o fuente3.c

Sistemas de control de versiones[editar]

  • Subversion