Programación en C/Herramientas externas útiles
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