J'ai le makefile suivant pour mon projet et j'aimerais le configurer pour les versions de version et de débogage. Dans mon code, j'ai beaucoup de #ifdef DEBUG
macros en place, il s'agit donc simplement de définir cette macro et d'ajouter le-g3 -gdwarf2
indicateurs aux compilateurs. Comment puis-je faire ceci?
$(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
Juste pour clarifier, quand je parle de versions de version / débogage, je veux pouvoir simplement taper make
et obtenir une version de version ou make debug
et obtenir une version de débogage, sans commenter manuellement les choses dans le fichier makefile.
.PHONY
Réponses:
Vous pouvez utiliser des valeurs de variable spécifiques à la cible . Exemple:
N'oubliez pas d'utiliser $ (CXX) ou $ (CC) dans toutes vos commandes de compilation.
Ensuite, «make debug» aura des indicateurs supplémentaires comme -DDEBUG et -g alors que «make» ne le sera pas.
D'un autre côté, vous pouvez rendre votre Makefile beaucoup plus concis comme d'autres articles l'avaient suggéré.
la source
Cette question est souvent apparue lors de la recherche d'un problème similaire, je pense donc qu'une solution entièrement mise en œuvre est justifiée. D'autant plus que moi (et je suppose que d'autres) ont eu du mal à rassembler toutes les différentes réponses.
Voici un exemple de Makefile qui prend en charge plusieurs types de build dans des répertoires séparés. L'exemple illustré montre les versions de débogage et de publication.
Les soutiens ...
la source
src
, modifiez la ligneSRCS = file1.c file2.c file3.c file4.c
à lireSRCS = src/file1.c src/file2.c src/file3.c src/file4.c
.Si par configure release / build, vous voulez dire que vous n'avez besoin que d'une seule configuration par makefile, alors c'est simplement une question et découpler CC et CFLAGS:
Selon que vous pouvez utiliser gnu makefile, vous pouvez utiliser conditionnel pour rendre cela un peu plus sophistiqué et le contrôler à partir de la ligne de commande:
puis utilisez:
Si vous avez besoin de contrôler les deux configurations en même temps, je pense qu'il est préférable d'avoir des répertoires de construction et un répertoire de construction / config.
la source
ifeq (DEBUG, 1)
) pour moi, laDEBUG
variable de parenthèses avait besoin enveloppé dans comme ceci:ifeq ($(DEBUG), 1)
.Notez que vous pouvez également simplifier votre Makefile, en même temps:
Vous n'avez plus besoin de répéter les noms de fichiers partout. Tous les fichiers .l passeront par flex et gcc, tous les fichiers .y passeront par bison et g ++, et tous les fichiers .cpp par uniquement g ++.
Listez simplement les fichiers .o avec lesquels vous vous attendez à vous retrouver, et Make se chargera de déterminer quelles règles peuvent satisfaire les besoins ...
pour mémoire:
$@
Le nom du fichier cible (celui avant les deux-points)$<
Le nom du premier (ou seul) fichier de prérequis (le premier après les deux points)$^
Les noms de tous les fichiers prérequis (séparés par des espaces)$*
La racine (le bit qui correspond au%
caractère générique dans la définition de règle.la source
$^
est pour tous les fichiers prérequis.vous pouvez avoir une variable
alors vous pouvez utiliser une instruction conditionnelle
la source
Compléter les réponses précédentes ... Vous devez référencer les variables que vous définissez info dans vos commandes ...
la source
ifeq (DEBUG, 1)
devrait être notéifeq ($(DEBUG), 1)
. Je suppose que cela faisait peut-être référence à votre réponse ici.Vous pouvez également ajouter quelque chose de simple à votre Makefile tel que
Puis compilez-le pour le débogage
make DEBUG=1
la source