Suscribirse al Feed
02Mar

Construcción o creación (uso del comando make)

Cuando creamos pequeños programas como los que hemos hecho hasta ahora, no resulta muy difícil el proceso de compilación y enlace. Pero cuando se crean proyectos grandes, con varios archivos fuente (15, 30 o más) y librerías resultaría muy difícil o hasta imposible.

Linux viene con la utilería make de GNU. make lee de un archivo conocido como make toda la información que necesita para crear su programa. Ésta utilería es tan importante y popular que se ha especificado como estándar de POSIX.

make

make de GNU busca automáticamente un archivo make llamado GNUmakefile. Sino lo encuentra, busca makefile, y si tampoco lo encuentra busca Makefile, y si tampoco lo encuentra dice “que mierdas, no juegues conmigo que no me gusta perder tiempo” XD. Estos son los nombres predeterminados, pero puedes crear un archivo con el nombre que quieras y especificar al make que lo utilice. Los archivos make contienen información acerca de la compilación y enlace de su programa, con una sintaxis muy específica que make puede entender.

make tiene una gran variedad de reglas integradas. Por ejemplo, sabe que los archivos que terminan con .c son archivos fuente de C, y sabe cómo compilarlos para convertirlos en archivos objeto (.o). Puedes redefinir cualquiera de estas reglas si gustas. En el caso más simple, todo lo que necesitas especificar en tu archivo make es el nombre que va a tener su archivo ejecutable, así como los archivos .o que se necesitan para crearlo.

He aquí un archivo sencillo para make, que creará el programa de los dados:

juego:juego.o tirador.o
$(CC) -o $@ juego.o tirador.o

Ahora podrás crear el programa con tan solo un comando: make.

Hay ocasiones en las que hay que indicar como compilar cierto tipo de archivo, por ejemplo cuando se utilizan otro tipo de extensiones (.cpp, .cxx, .c++). El error que se generaría sería similar a este:

make: *** No hay ninguna regla para construir el objetivo 'juego.o', necesario para 'juego'. Alto.

Vamos a ver un ejemplo de archivo makefile en donde se especifica explícitamente como construir dichos archivos objeto:

juegodados: juego.o tirador.o
$(CC) -o $@ juego.o tirador.o
juego.o: juego.c
$(CC) -c juego.c
tirador.o: tirador.c
$(CC) -c tirador.c

Ahora veamos un archivo makefile aún más completo:

#Makefile para crear programa para tirar dados
CFLAGS = -O
OBJS = juego.o tirador.o
all=dado
juego: $(OBJS)
$(CC) $(CFLAGS) -o $@ $(OBJS)
juego.o: juego.c
$(CC) -c juego.c
tirador.o: tirador.c
$(CC) -c tirador.c
clean:
-$(RM) dado *.o

Este archivo make define una regla llamada clean, que se utiliza para eliminar todos los archivos previamente compilados (incluso el ejecutable) y empezar con un directorio limpio. Fíjate también que se pueden declarar una especie de variables (como CFLAGS, OBJS, etc.), que se pueden utilizar al momento de indicar algún comando. Además fíjate que se pueden utilizar comentarios con el símbolo #.

Y un último ejemplo más complejo no nos vendría mal. Vamos a ver como sería nuestro archivo makefile, si deseáramos utilizar bibliotecas compartidas (librerías dinámicas):

#Makefile para crear programa para tirar dados
#usando bibliotecas compartidas
CFLAGS = -O
OBJS = juego.o
LIBS=libtirar.so
all=dado
juego: $(OBJS) $(LIBS)
$(CC) $(CFLAGS) -o $@ $(OBJS) -L. -ltirar
juego.o: juego.c
$(CC) -c juego.c
tirador.o: tirador.c
$(CC) -fPIC -c $<
libtirar.so: tirador.o
-$(RM) libtirar*
$(CC) -shared -Wl,-soname,libtirar.so.1 \
-o libtirar.so.1.0 $<
ln -slibtirar.so.1.0 libtirar.so.1
ln -slibtirar.so.1 libtirar.so
clean:
-$(RM) dado *.o libtirar*

Importante!!!
Sino quieres tener problemas en el futuro lee esto: la sintaxis de make nos obliga a respetar los separadores. ¿qué son separadores? talvez te hayas fijado en la forma en que están tabulados los archivos. Esto no es maña mía ni mucho menos, esto es una regla para los archivos make; sino se tabularan lo más seguro es que en la ejecución del make apareciera este error:

makefile:2: *** falta un separador. Alto.

Así que por lo que más quieras: utiliza los separadores si quieres que funcione.

Opciones de línea de comandos de make

make tiene varias opciones útiles de línea de comandos. Por ej., si quieres especificar un archivo make alternativo, en lugar de los predeterminados, invoca a make de la siguiente forma:

make -f nombrearchivo

make es un programa muy sofisticado. Una de las cosas que hace es comprender las dependencias. Por ejemplo, sabe que los archivos .o se crean a partir de archivos .c. Tu programa puede consistir en varios archivos fuente .c. Si cambias uno, no es necesario volver a compilarlos todos cada vez que vayas a crearlo. Sólo necesitas volver a compilar el archivo fuente que haya cambiado. make comprende esto y compila solo aquellos archivos que no estén actualizados. Algunas veces será necesario que veas primero qué es lo que make necesita para crear el programa. Puedes hacer esto con el siguiente comando:
make -n
Esto le indica a make que analice el makefile y que reporte qué comandos emitirá para crear el programa. make no ejecutará ningún comando.

Etiquetas:

 

 

Antes de comentar... recuerda que no hago tareas

Te invito a subscribirte al feed RSS. ¿No sabes que es un lector de Feeds?

© 2007 - 2008 Dezinerfolio. Todos los derechos reservados.
Powered by Wordpress. Entradas RSS