jorge_pasto
Usuario (Argentina)

Hola a todos, antes que nada quiero comentar que luego de muchos años de utilizar taringa! mas como una wiki que como una red social he optado por crear mi primer post como un tutorial. Por tanto, luego de buscar por estos lados un tutorial de como craar un archivo make y no encontrarlo, he decidido aportar lo que aprendí en estos días. A continuación pasaré a explicar brevemente que es un archivo make, como utilizarlo y mediante un ejemplo como se compone. 1) ¿Qué es un archivo MAKE? Un archivo make (makefile) es un archivo de texto el cual contiene una sintaxis determinada que son utilizados por MAKE para la gestión de la compilación de programas que mayormente estan compuestos por varios archivos de código. MAKE (según wikipedia) es una herramienta de gestión de dependencias, típicamente, las que existen entre los archivos que componen el código fuente de un programa, para dirigir su recompilación o "generación" automáticamente. Si bien es cierto que su función básica consiste en determinar automáticamente qué partes de un programa requieren ser recompiladas y ejecutar los comandos necesarios para hacerlo, también lo es que Make puede usarse en cualquier escenario en el que se requiera, de alguna forma, actualizar automáticamente un conjunto de archivos a partir de otro, cada vez que éste cambie. 2) ¿Cómo crear un archivo MAKE? Un archivo make, debe ser creado en el directorio raíz del proyecto llevando como nombre la palabra clave makefile el cual contendrá el conjunto de reglas o instrucciones de compilación a realizar. 3) ¿Qué contiene un archivo MAKE? El archivo make, desarrollado de una manera prolija y eficiente, podemos describirlo en dos partes. Por un lado contiene la declaración de variables y por otro el conjunto de reglas. 4) Ejemplo. Para ejemplificar el uso de un archivo MAKE, utilizaré la siguiente estructura de proyecto. Como se ve en la imagen, el proyecto contiene dos archivos C++ y dos librerias. El ejemplo lo planifiqué de este modo para lograr el mayor uso de la herramienta make 4.1) Ejemplo - Declaración de variables. Como regla general, se recomienda la utilización de variables, por ejemplo para describir el tipo de codificación, nombres comunes, etc. Para ello procederemos a declarar, primero como compilaremos el programa CXX = g++ Si utilizaremos flags o directivas determinadas, tambien se recomienda la utilización de variables, las cuales podrían ser CXXFLAGS = -std=c++11 Luego pasaremos a declarar variables propias de los nombres que utilizaremos en el programa tal como DIRECTORIO = librerias LIB_1= libreria1 LIB_2 = libreria1 CODIGO1 = codigo1 CODIGO2 = codigo2 Por último, ya podremos, a modo de ejemplo utilizar las varibles para definir la locación de las librerias a utilizar, tal como LIBS = $(DIRECTORIO)/$(LIB_1).o $(DIRECTORIO)/$(LIB_2).o 4.2) Ejemplo - Creación de reglas. A continuación detallaremos las reglas, las cuales son las palabras claves que se utilizaran al momento de invocar a make. En cada regla se definirán las "tareas" que queramos que realice el makefile. Por ejemplo, nuestro make compilará los codigos por separado, creará los archivos objetos de las librerias, eliminará los archivos temporales del directorio principal y también realizará todas estas tareas en conjunto. Para definir una regla, se realiza escribiendo el nombre seguido de dos puntos (":") y debajo luego de un TAB la tarea que queremos que realice. Entonces por ejemplo para el codigo1.cpp queremos realizar una compilacion como la siguiente g++ librerias/libreria1.o librerias/libreria2.o codigo1.cpp -o codigo1 -std=c++11 Por tanto definiremos la siguiente regla codigo1: $(CXX) $(LIBS) $(CODIGO1).cpp -o $(CODIGO1) $(CXXFLAGS) Analogamente para el codigo1.cpp codigo2: $(CXX) $(LIBS) $(CODIGO2).cpp -o $(CODIGO2) $(CXXFLAGS) En cuanto a las librerias, debemos crear un makefile en el directorio correspondiente donde se encuentren y luego invocarlo desde el principal (este archivo se crea de forma analogá al que detallamos aquí). El cual contendrá la suguiente regla crear: $(CXX) -c $(LIB_1).cpp $(CXX) -c $(LIB_2).cpp Para invocarla desde el código principal debemos indicar que se ubica en un subdirectorio, para ello se procede de la siguiente forma. libs: $(MAKE) -C $(DIRECTORIO) crear Como se detallo mas arriba, también incluiremos una instrucción que limpie los archivos que creemos que no son necesarios, para ello creamos una regla como la siguiente clean: rm *.o *.~ *~ Y por último, creamos una regla que realice todas las tareas en conjunto. En definitiva, nuestro código quedará como el siguiente Como se ve en la imagen, tambien utilizo una directiva .PHONY: codigo1 codigo2 libs all Esto sirve para indicarle a make que realice las reglas mas allá que no lo crea necesario, es decir, si los archivos que queremos crear ya están creados make se da cuenta y opta por no realizar la operación. Aunque esto es muy útil de obviar al momento de desarrollar un proyecto. 5) Utilización del archivo MAKE. Ahora que ya tenemos creado nuestro archivo, podemos proceder a utilizarlo de la siguiente forma. Si queremos crear solamente las librerias o alguno de los códigos en particular, utilizamos ~/proyecto/librerias$make libs ~/proyecto$make codigo1 ~/proyecto$make codigo2 Si queremos solamente realizar una "limpieza" ~/proyecto/librerias$make clean Y si deseamos realizar todas las tareas al mismo tiempo ~/proyecto/librerias$make all 6) Para saber mas sobre la herramienta make * http://es.wikipedia.org/wiki/Make * http://www.gnu.org/software/make/ * http://arco.esi.uclm.es/~david.villa/doc/repo/make/make.html * http://macprogramadores.org/?q=tutoriales Bueno, espero que haya sido de ayuda. Cualquier consulta comenten!