logotipo

img_google
Mediterrania
Informática, inteligencia artificial, web, diseño, programación...
Tira ECOL
Sindicación
Directorios de Bitácoras
Contador de visitas

Site Counter
 
Introducción a make (parte I)
Make es una herramienta de GNU ampliamente utilizada a la hora de compilar proyectos en los que haya involucrados varios ficheros de código fuente y en los que unos dependan de otros. Es muy utilizada en el mundo UNIX/Linux.

Make se encarga de ayudarnos en la compilación, permitiendo compilar el proyecto entero, recompilando sólo aquello que haya sido modificado, y reduciendo la compilación a la simple ejecución de la orden make.

Os quiero presentar en 3 artículos cómo aprovecharse de las facilidades de make para compilar pequeños proyectos. Me basaré en el Makefile que estoy utlizando para el raytracer.

Para utlizar make debemos escribir un fichero makefile, en donde indicaremos tanto los ficheros a compilar, como el compilador, etcétera. Si el nombre del fichero makefile es Makefile o makefile bastará con ejecutar make a secas para que él sólo se encargue de buscar el fichero makefile en el directorio actual. Si por lo que sea no vamos a utlizar ninguno de esos dos nombres habrá que invocar a make con el argumento -f:
make -f nombre_del_fichero

Bien, veamos ahora la sintaxis de un fichero Makefile. Para ello supondremos que el fichero principal del proyecto (donde se encuentra el main) es raytracer.cpp. Junto con este, se encuentran las clases: Primitiva.cpp, FuenteLuminosa.cpp, RGB.cpp, Escena.cpp, Render.cpp y Algebra.cpp, todos con sus correspondientes .h. El binario final se llamará raytracer y para generarlo necesitaremos llamar al compilador más o menos así:
g++ -o raytracer Algebra.o FuenteLuminosa.o Camara.o Escena.o RGB.o Render.o Primitiva.o raytracer.cpp -lm -lGL -lGLU -lglut -Wno-deprecated -O3 -lfl

Esta orden la podemos incluir en el Makefile como sigue:
all: raytracer

raytracer: raytracer.cpp Algebra.o FuenteLuminosa.o Camara.o Escena.o RGB.o Render.o Primitiva.o
   g++ -o raytracer Algebra.o FuenteLuminosa.o Camara.o Escena.o RGB.o Render.o Primitiva.o raytracer.cpp -lm -lGL -lGLU -lglut -Wno-deprecated -O3 -lfl

Make, cuando lee un fichero Makefile busca la etiqueta all a la que siguen una serie de objetivos, los cuales busca y ejecuta. En este caso el único objetivo que hay es la regla raytracer la cuál ejecutará si alguno de los ficheros indicados después de los dos puntos ha sido modificado desde el último make realizado. Con ello se consigue compilar sólo cuando haga falta, es decir, cuando algo haya cambiado.

Como veis, para generar el binario dependemos de haber generado antes todos los ficheros objeto de las clases. Lo que haremos será crear una regla para cada clase que llame al compilador. Veamos el Makefile directamente:
all: raytracer

Algebra.o: Algebra.cpp Algebra.h
   g++ -c Algebra.cpp

Camara.o: Camara.cpp Camara.h
   g++ -c Camara.cpp

FuenteLuminosa.o: FuenteLuminosa.cpp FuenteLuminosa.h
   g++ -c FuenteLuminosa.cpp

RGB.o: RGB.cpp RGB.h
   g++ -c RGB.cpp

Primitiva.o: Primitiva.cpp Primitiva.h
   g++ -c Primitiva.cpp

Render.o: Render.cpp Render.h
   g++ -c Render.cpp

Escena.o: Escena.cpp Escena.h
   g++ -c Escena.cpp

raytracer: raytracer.cpp Algebra.o FuenteLuminosa.o Camara.o Escena.o RGB.o Render.o Primitiva.o
   g++ -o raytracer Algebra.o FuenteLuminosa.o Camara.o Escena.o RGB.o Render.o Primitiva.o raytracer.cpp -lm -lGL -lGLU -lglut -Wno-deprecated -O3 -lfl

Ahora el funcionamiento será el siguiente: al hacer make por primera vez de la regla all se pasará a la regla raytracer. La regla raytracer comprobará las dependencias: primero mirará si raytracer.cpp se ha modificado desde el último make. Imaginemos que no. Ahora pasará a la regla Algebra.o y comprobará las fechas de las dos dependecias de ésta (Algebra.cpp y Algebra.h). Si han sido modificados ejecutará el código asociado, es decir, generará de nuevo el fichero objeto. Así sucesivamente hasta el final de las dependencias de raytracer que llevará a ejecutar la orden de compilación final.

Espero que os sirva para comenzar a desenvolverse un poco con make. En el siguiente artículo veremos cómo utilizar variables para generalizar más los ficheros y hacerlos menos pesados.

Si tenéis cualquier duda no dudéis en consultarmela.


 
Comentario:
Tiene buena pinta el artículo, ánimo con los siguientes.

Por si os interesa, aquí hay unos apuntes explicados al detalle sobre MAKE: (enfocado a xbase)

http://apuntesc3.tripod.cl/tlink32/tlink01.html
No