Programación en C/Herramientas externas útiles
Sistemas de construcción de código
editarmake
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