Ich habe das folgende Makefile für mein Projekt und möchte es für Release- und Debug-Builds konfigurieren. In meinem Code sind viele #ifdef DEBUG
Makros vorhanden. Es geht also nur darum, dieses Makro zu setzen und -g3 -gdwarf2
den Compilern die Flags hinzuzufügen . Wie kann ich das machen?
$(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
Um zu verdeutlichen, wenn ich Release- / Debug-Builds sage, möchte ich in der Lage sein, einfach make
einen Release-Build oder make debug
einen Debug-Build einzugeben und abzurufen, ohne die Dinge im Makefile manuell auskommentieren zu müssen.
.PHONY
Antworten:
Sie können zielspezifische Variablenwerte verwenden . Beispiel:
Denken Sie daran, in all Ihren Kompilierungsbefehlen $ (CXX) oder $ (CC) zu verwenden.
Dann hat 'make debug' zusätzliche Flags wie -DDEBUG und -g, während 'make' dies nicht tut.
Nebenbei bemerkt, Sie können Ihr Makefile viel prägnanter gestalten, als andere Beiträge vorgeschlagen hatten.
quelle
Diese Frage ist häufig bei der Suche nach einem ähnlichen Problem aufgetreten, daher halte ich eine vollständig implementierte Lösung für gerechtfertigt. Zumal ich (und ich würde andere annehmen) Schwierigkeiten hatte, all die verschiedenen Antworten zusammenzusetzen.
Unten finden Sie ein Beispiel für ein Makefile, das mehrere Build-Typen in separaten Verzeichnissen unterstützt. Das abgebildete Beispiel zeigt Debug- und Release-Builds.
Unterstützt ...
quelle
src
, ändern Sie dieSRCS = file1.c file2.c file3.c file4.c
zu lesende ZeileSRCS = src/file1.c src/file2.c src/file3.c src/file4.c
.Wenn Sie mit configure release / build nur eine Konfiguration pro Makefile benötigen, ist dies einfach eine Frage der Entkopplung von CC und CFLAGS:
Abhängig davon, ob Sie gnu makefile verwenden können, können Sie bedingt verwenden, um dies ein bisschen schicker zu machen, und es über die Befehlszeile steuern:
und dann benutze:
Wenn Sie beide Konfigurationen gleichzeitig steuern müssen, ist es meiner Meinung nach besser, Build-Verzeichnisse und ein Build-Verzeichnis / Konfiguration zu haben.
quelle
ifeq (DEBUG, 1)
für mich zum Laufen zu bringen ( ), muss dieDEBUG
Variable in Klammern gesetzt werden :ifeq ($(DEBUG), 1)
.Beachten Sie, dass Sie gleichzeitig Ihr Makefile vereinfachen können:
Jetzt müssen Sie Dateinamen nicht mehr überall wiederholen. Alle .l-Dateien werden über flex und gcc übertragen, alle .y-Dateien werden über Bison und g ++ und alle .cpp-Dateien nur über g ++ weitergeleitet.
Listen Sie einfach die .o-Dateien auf, mit denen Sie voraussichtlich enden werden, und Make wird herausfinden, welche Regeln die Anforderungen erfüllen können ...
für die Aufzeichnung:
$@
Der Name der Zieldatei (die vor dem Doppelpunkt)$<
Der Name der ersten (oder einzigen) vorausgesetzten Datei (die erste nach dem Doppelpunkt)$^
Die Namen aller erforderlichen Dateien (durch Leerzeichen getrennt)$*
Der Stamm (das Bit, das mit dem%
Platzhalter in der Regeldefinition übereinstimmt .quelle
$^
ist für alle die erforderlichen Dateien.Sie können eine Variable haben
dann können Sie eine bedingte Anweisung verwenden
quelle
Vervollständigen der Antworten von früher ... Sie müssen auf die Variablen verweisen, die Sie in Ihren Befehlen definieren ...
quelle
ifeq (DEBUG, 1)
werden sollteifeq ($(DEBUG), 1)
. Ich vermute, es hat sich hier auf Ihre Antwort bezogen.Sie können Ihrem Makefile auch etwas Einfaches hinzufügen, z
Kompilieren Sie es dann zum Debuggen
make DEBUG=1
quelle