Archivo make

El archivo make es un archivo de texto al que hace referencia el mandato make que describe la construcción de los destinos; contiene información como las dependencias a nivel del fuente y las dependencias del orden de construcción.

El CDT puede generar automáticamente un archivo make, en cuyo caso los proyectos se llaman proyectos make gestionados. Algunos proyectos, los proyectos make estándar, le permiten definir un archivo make propio.

Archivo make de ejemplo

# Un archivo make de ejemplo
# Este archivo make muestra y explica
# macros make, expansiones de macro,
# reglas, destinos, dependencias, mandatos, objetivos
# destinos artificiales, regla de patrón, regla de dependencia.

# Los comentarios empiezan por una almohadilla, # , y terminan al final de la línea.

# Esta es una macro make simple.
LINK_TARGET = test_me.exe

# Esta es una macro make que utiliza la barra inclinada invertida para ampliar a múltiples líneas.
# Esto permite modificar rápidamente más archivos de objeto.
OBJS =  \
 Test1.o \
 Test2.o \
 Main.o

# Esta es una macro make definida por dos expansiones de macro.
# Las expansiones de macro se pueden tratar como sustitución de texto de la macro make.
# Las expansiones de macro empiezan por $ y se escriben entre paréntesis, ().
REBUILDABLES = $(OBJS) $(LINK_TARGET)

# NO hace falta definir las macros make antes de las correspondientes expansiones de macro,
# pero, por lo general, deben definirse antes de que aparezcan en las reglas.
# Por lo tanto, las macros make suelen aparecer en primer lugar en un archivo make.

# Esta es una regla simple (que sirve para borrar o "hacer limpieza" del entorno de construcción).
# Tienen un destino que se llama "clean" (a la izquierda de los dos puntos ":", en la primera línea),
# no tiene dependencias (parte derecha de los dos puntos),
# y consta de dos mandatos (sangrados por tabulares en las líneas que siguen).
# El espacio que hay antes de los dos puntos no es necesario, pero se ha dejado por cuestión de claridad.
clean :
 rm -f $(REBUILDABLES)
 echo Clean done

# Hay dos destinos estándar que probablemente se encontrarán en el archivo make:
# "all" y "clean", porque suelen ser objetivos de la línea de mandatos.
# Asimismo, estos dos destinos son normalmente artificiales, porque, en general, no
# se corresponden con archivos reales que se llamen "all" o "clean".

# La regla de "all" sirve para construir incrementalmente el sistema.
# Lo hace expresando una dependencia de los resultados de ese sistema,
# que a su vez tienen reglas y dependencias propias.
all : $(LINK_TARGET)
 echo All done

# No existe un orden necesario para la lista de reglas que figuran en el archivo make.
# Make construirá su propio árbol de dependencias y solo ejecutará cada regla una vez que
# se hayan ejecutado satisfactoriamente las reglas de sus dependencias.

# Esta es una regla que utiliza macros make incorporadas en el mandato:
# $@ hace expandir al destino de la regla, que es "test_me.exe" en este caso.
# $^ hace expandir a las dependencias de la regla, que en este caso son los tres archivos
# main.o, test1.o y test2.o.
$(LINK_TARGET) : $(OBJS)
 g++ -g -o $@ $^

# Esta es una regla de patrón, que a menudo se utiliza para la línea de compilación.
# Indica cómo crear un archivo con un sufijo .o, dado un archivo que tenga un sufijo .cpp.
# El mandato de la regla utiliza algunas macros make incorporadas:
# $@ para el destino que coincide con el patrón
# $lt; para la dependencia que coincide con el patrón
%.o : %.cpp
 g++ -g -o $@ -c $<

# Estas son reglas de dependencia, es decir, reglas sin mandatos.
# Las reglas de dependencias indican que si cambia un archivo situado a la derecha de los dos puntos,
# se debe considerar que el destino situado a la izquierda de los dos puntos ha quedado desfasado.
# Los mandatos para hacer que un destino desfasado se actualice se encuentran en otro lugar
# (en este caso, junto a la regla de patrón anterior).
# Las reglas de dependencias se emplean a menudo para capturar dependencias de archivos de cabecera.
Main.o : Main.h Test1.h Test2.h
Test1.o : Test1.h Test2.h
Test2.o : Test2.h

# Además de poder capturar las dependencias manualmente, existen algunos
# generadores de dependencias automatizados. Esta es una posibilidad (transformada en comentario)...
# %.dep : %.cpp
#        g++ -M $(FLAGS) $< > $@
# include $(OBJS:.o=.dep)

Preguntas más frecuentes (P+F)

La vista Consola puede ser de gran utilidad a la hora de depurar una construcción.

P1. La vista Consola indica Error al lanzar constructor?. ¿Qué significa?

Error al lanzar constructor (make k clean all )
(Exec error:Lanzamiento fallido)

Los más probable es que el mandato de construcción (que, por omisión, es make?) no esté en su vía de acceso. Puede ponerlo en su vía de acceso y reiniciar Eclipse.
También puede cambiar su mandato de construcción por otro que esté en su vía de acceso. Si está utilizando las herramientas MinGW para compilar, debe sustituir el mandato de compilación por mingw32-make?.

P2. La vista Consola indica No hay una regla para el destino make X?.

make -k clean all
make: *** No hay una regla para el destino make `clean'.
make: *** No hay una regla para el destino make `all'.

Por omisión, el programa make busca un archivo que normalmente se llama Makefile? o makefile?. Si no lo puede encontrar en el directorio de trabajo, o si el archivo está vacío o no contiene reglas para los objetivos de la línea de mandatos (clean? y all?, en este caso), el programa fallará normalmente emitiendo un mensaje de error parecido a los que se han mostrado.

Si ya tiene un archivo make válido, quizá tenga que cambiar el directorio de trabajo de la construcción. El directorio de trabajo por omisión del mandato de construcción es el directorio raíz de los proyectos. Puede cambiarlo especificando un directorio de construcción alternativo en las propiedades del proyecto make. O bien, si el archivo make ha cambiado de nombre (por ejemplo, archivoConstrucción.mk), puede especificar el nombre estableciendo que el mandato de construcción por omisión sea make f archivoConstrucción.mk.

Si no tiene un archivo make válido, cree un archivo nuevo que se llame Makefile en el directorio raíz. Luego puede añadir el contenido del Makefile de ejemplo (más arriba) y modificarlo según convenga.

P3. La vista Consola indica falta separador?.

make -k clean all
makefile:12: *** falta separador. Stop.

Según la sintaxis estándar de los archivos make, cada línea de una regla de construcción debe ir precedida de un carácter de tabulación. Por accidente, el carácter de tabulación se sustituye a menudo por espacios, y como no se nota a simple vista la diferencia en el sangrado, este problema no se suele detectar. En el ejemplo proporcionado, el mensaje de error puede señalar la línea 12 del archivo makefile?; para arreglar el problema, inserte una tabulación al principio de esa línea.

P4. La vista Consola indica "Destino `all' no rehecho debido a errores".

make -k clean all
make: *** [clean] Error 255
rm -f Test1.o Test2.o Main.o test_me.exe
g++ -g -o Test1.o -c Test1.cpp
make: *** [Test1.o] Error 255
make: *** [Test2.o] Error 255
make: *** [Main.o] Error 255
g++ -g -o Test2.o -c Test2.cpp
g++ -g -o Main.o -c Main.cpp
make: Destino `all' no rehecho debido a errores.

Aquí, la culpa se debe probablemente a que g++ no se encuentra en la vía de acceso.

El mandato make produce el Error 255 como resultado de que la shell de mandatos no puede encontrar un mandato para una regla determinada.
Los mensajes de la corriente de salida de error estándar (las líneas que indican el Error 255) y la corriente de salida estándar (las demás líneas) se fusionan aquí en la vista Consola.

P5. ¿Qué indica el distintivo -k?

El distintivo -k indica que el mandato make debe seguir aplicando las otras reglas independientes aunque falle una de ellas. Esto resulta útil para construir proyectos de gran tamaño.

Puede eliminar el distintivo -k activando Propiedades de proyecto > Proyecto C/C++ make > Constructor Make > Detener al producirse el primer error de construcción

P6. La vista Consola tiene este aspecto:

mingw32-make clean all
process_begin: CreateProcess((null), rm -f Test1.o Test2.o Main.o test_me.exe, ...) ha fallado.
make (e=2): El sistema no puede localizar el archivo especificado.

mingw32-make: *** [clean] Error 2
rm -f Test1.o Test2.o Main.o test_me.exe

Este mensaje quiere decir que mingw32-make no ha podido localizar el programa de utilidad "rm". Por desgracia, MinGW no viene con "rm". Para corregir este problema, sustituya la regla de borrado (clean) del archivo make por la siguiente:

clean :
	-del $(REBUILDABLES)
	echo Clean done

El menos inicial indica que make debe considerar que la regla clean es satisfactoria incluso si el mandato del resulta anómalo. Esto puede ser aceptable, porque el mandato del fallará si todavía no existen (o si ya han dejado de existir) los archivos especificados que deben suprimirse.

Declaración de copyright de IBM