Introducción a Patrones de Diseño en C++ con Qt4/1.9 El comando make
El comando make
[editar]En lugar de correr la línea de comando del compilador directamente, comenzaremos a usar make[1] que simplifica enormemente el proceso de construcción cuando un proyecto involucra múltiples archivos fuente y librerías.
Hemos visto antes que qmake (sin argumentos) lee un archivo de proyecto y construye un Makefile. El Ejemplo 1.8 es una vista medianamente comentada de el Makefile generado por un simple proyecto llamado qapp.
Ejemplo 1.8
[editar]# Extractos de un makefile ####### Compilador, herramientas y opciones CC = gcc # ejecutable para el compilador C CXX = g++ # ejecutable para el compilador C++ LINK = g++ # ejecutable para el enlazador # marcas para ser pasadas al compilador CFLAGS = -pipe -g -Wall -W -D_REENTRANT $(DEFINES) CXXFLAGS = -pipe -g -Wall -W -D_REENTRANT $(DEFINES) INCPATH = -I/usr/local/qt/mkspecs/default -I. \ -I$(QT4)/include/QtGui -I$(QT4)/include/QtCore \ -I$(QT4)/include # marcas del enlazador LIBS = $(SUBLIBS) -L$(QT4)/lib -lQtCore_debug -lQtGui_debug -lpthread LFLAGS = -Wl,-rpath,$(QT4)/lib # macros para realizar otras operaciones como parte de los pasos de construcción: QMAKE = /usr/local/qt/bin/qmake ####### Archivos HEADERS = # Si tenemos alguno, debería estar aquí. SOURCES = main.cpp OBJECTS = main.o [snip] QMAKE_TARGET = qapp DESTDIR = TARGET = qapp # Objetivo por defecto para construir first: all # para consstruir "first" debemos construir "all" ####### Reglas Implícitas .SUFFIXES: .c .o .cpp .cc .cxx .C .cpp.o: $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< ## Posibles objetivos para construir all: Makefile $(TARGET) # esto es como se construye "all" $(TARGET): $(OBJECTS) $(OBJMOC) # esto es como se construye qapp $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJMOC) $(OBJCOMP) \ $(LIBS) qmake: FORCE # ¡"qmake" es un objetivo también! @$(QMAKE) -o Makefile qapp.pro # ¿que hizo esto? dist: # Otro objetivo @mkdir -p .tmp/qapp \ && $(COPY_FILE) --parents $(SOURCES) $(HEADERS) \ $(FORMS) $(DIST) .tmp/qapp/ \ && (cd `dirname .tmp/qapp` \ && $(TAR) qapp.tar qapp \ && $(COMPRESS) qapp.tar) \ && $(MOVE) `dirname .tmp/qapp`/qapp.tar.gz . \ && $(DEL_FILE) -r .tmp/qapp clean:compiler_clean # otro objetivo más -$(DEL_FILE) $(OBJECTS) -$(DEL_FILE) *~ core *.core ####### Dependencias para reglas implícitas main.o: main.cpp
El comando make revisa las dependencias y realiza cada paso de construcción del Makefile. El nombre y ubicación del resultado final puede ser establecido con las variables del proyecto TARGET y target.path. Si TARGET no es especificado, el nombre por defecto dado es el nombre del directorio en el que el archivo del proyecto se aloja. Si target.path no se especifica, la localización por defecto es el directorio en el que el proyecto se ubica.
Limpiando Archivos
[editar]make puede limpiar los archivos generados por tí por medio de dos objetivos, clean y distclean. Observa cómo ambos son distintos:
src/qapp> make clean rm -f main.o rm -f *~ core *.core src/qapp> ls Makefile main.cpp qapp qapp.pro
src/qapp> make distclean rm -f qmake_image_collection.cpp rm -f main.o rm -f *~ core *.core rm -f qapp rm -f Makefile src/qapp> ls main.cpp qapp.pro
Después de un make distclean, los únicos archivos que restan son los de las fuentes que pueden ir dentro de una tarball para su distribución
Así como nosotros agregamos más codigo fuente, cabeceras o módulos de librerías para nuestro proyecto, editamos el archivo .pro y añadimos los nuevos elementos a las listas SOURCES, HEADERS, y LIBS. La misma documentación standard que aplica también para el código fuente de C++ debería ser aplicada a los archivos de proyecto (con los comentarios comenzando con #).
Pensemos en el archivo de proyecto como un mapa de nuestro proyecto, conteniendo referencias para todos los archivos y localizaciones requeridas para construir nuestra aplicación o librería. Como otros archivos fuente, este es tanto leible por humanos como por la máquina. El archivo .pro es el primer lugar para mirar cuando encontramos mensajes not found o undefined durante el proceso de construcción (especialmente en el momento del enlace). Para más detalles recomendamos que leas la Guía para qmake de Trolltech.
- ↑ Dependiendo de tu entorno de desarrollo, este programa puede tener algúnos otros nombres como mingw32-make, nmake, gmake, o unsermake.