Tengo el siguiente archivo MAKE para mi proyecto y me gustaría configurarlo para las versiones de lanzamiento y depuración. En mi código, tengo muchas #ifdef DEBUG
macros instaladas, por lo que es simplemente una cuestión de configurar esta macro y agregar las -g3 -gdwarf2
banderas a los compiladores. ¿Cómo puedo hacer esto?
$(CC) = g++ -g3 -gdwarf2
$(cc) = gcc -g3 -gdwarf2
all: executable
executable: CommandParser.tab.o CommandParser.yy.o Command.o
g++ -g -o output CommandParser.yy.o CommandParser.tab.o Command.o -lfl
CommandParser.yy.o: CommandParser.l
flex -o CommandParser.yy.c CommandParser.l
gcc -g -c CommandParser.yy.c
CommandParser.tab.o: CommandParser.y
bison -d CommandParser.y
g++ -g -c CommandParser.tab.c
Command.o: Command.cpp
g++ -g -c Command.cpp
clean:
rm -f CommandParser.tab.* CommandParser.yy.* output *.o
Solo para aclarar, cuando digo versiones de lanzamiento / depuración, quiero poder escribir make
y obtener una versión de lanzamiento o make debug
una versión de depuración, sin comentar manualmente las cosas en el archivo MAKE.
.PHONY
Respuestas:
Puede usar valores variables específicos del objetivo . Ejemplo:
Recuerde usar $ (CXX) o $ (CC) en todos sus comandos de compilación.
Luego, 'make debug' tendrá banderas adicionales como -DDEBUG y -g donde 'make' no lo hará.
En una nota al margen, puede hacer que su Makefile sea mucho más conciso como lo habían sugerido otras publicaciones.
fuente
Esta pregunta ha aparecido a menudo cuando se busca un problema similar, por lo que creo que se justifica una solución completamente implementada. Especialmente porque yo (y supondría que otros) me han costado unir todas las respuestas.
A continuación se muestra un Makefile de ejemplo que admite varios tipos de compilación en directorios separados. El ejemplo ilustrado muestra las versiones de depuración y lanzamiento.
Soporta ...
fuente
src
, entonces modifique la líneaSRCS = file1.c file2.c file3.c file4.c
para leerSRCS = src/file1.c src/file2.c src/file3.c src/file4.c
.Si al configurar release / build, quiere decir que solo necesita una configuración por archivo MAKE, entonces es simplemente una cuestión y desacoplar CC y CFLAGS:
Dependiendo de si puede usar gnu makefile, puede usar condicional para hacer esto un poco más elegante y controlarlo desde la línea de comandos:
y luego usa:
Si necesita controlar ambas configuraciones al mismo tiempo, creo que es mejor tener directorios de compilación y un directorio / config de compilación.
fuente
ifeq (DEBUG, 1)
) para mí, laDEBUG
variable necesaria envuelto en paréntesis, así:ifeq ($(DEBUG), 1)
.Tenga en cuenta que también puede simplificar su Makefile, al mismo tiempo:
Ahora no tiene que repetir nombres de archivos por todas partes. Cualquier archivo .l pasará a través de flex y gcc, cualquier archivo .y pasará a través de bison y g ++, y cualquier archivo .cpp a través de solo g ++.
Simplemente enumere los archivos .o con los que espera terminar, y Make hará el trabajo de descubrir qué reglas pueden satisfacer las necesidades ...
para el registro:
$@
El nombre del archivo de destino (el anterior a los dos puntos)$<
El nombre del primer (o único) archivo de requisitos previos (el primero después de los dos puntos)$^
Los nombres de todos los archivos de requisitos previos (separados por espacios)$*
La raíz (el bit que coincide con el%
comodín en la definición de la regla.fuente
$^
es para todos los archivos de requisitos previos.puedes tener una variable
entonces puedes usar una declaración condicional
fuente
Completando las respuestas de antes ... Debe hacer referencia a las variables que define información en sus comandos ...
fuente
ifeq (DEBUG, 1)
debería indicarseifeq ($(DEBUG), 1)
. Supongo que puede haber estado refiriéndose a su respuesta aquí.También puede agregar algo simple a su Makefile como
Luego compílalo para depurar
make DEBUG=1
fuente