Mam następujący plik makefile dla mojego projektu i chciałbym go skonfigurować do wydania i debugowania kompilacji. W moim kodzie mam wiele #ifdef DEBUG
makr, więc wystarczy ustawić to makro i dodać -g3 -gdwarf2
flagi do kompilatorów. W jaki sposób mogę to zrobić?
$(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
Dla wyjaśnienia, kiedy mówię o kompilacjach do wydania / debugowania, chcę mieć możliwość wpisania make
i pobrania kompilacji wydania lub kompilacji make debug
do debugowania, bez ręcznego komentowania rzeczy w pliku makefile.
.PHONY
Odpowiedzi:
Możesz użyć wartości zmiennych specyficznych dla celu . Przykład:
Pamiętaj, aby używać $ (CXX) lub $ (CC) we wszystkich poleceniach kompilacji.
Wtedy 'make debug' będzie miał dodatkowe flagi, takie jak -DDEBUG i -g, gdzie jako 'make' nie będzie.
Na marginesie, możesz uczynić Makefile dużo bardziej zwięzłym, tak jak sugerowały to inne posty.
źródło
To pytanie często pojawiało się podczas poszukiwania podobnego problemu, więc czuję, że w pełni wdrożone rozwiązanie jest uzasadnione. Zwłaszcza, że ja (i przypuszczam, że inni) zmagaliśmy się ze złożeniem wszystkich różnych odpowiedzi.
Poniżej znajduje się przykładowy plik Makefile, który obsługuje wiele typów kompilacji w oddzielnych katalogach. Zilustrowany przykład przedstawia kompilacje debugowania i wydania.
Obsługuje ...
źródło
src
, zmodyfikuj wierszSRCS = file1.c file2.c file3.c file4.c
do odczytuSRCS = src/file1.c src/file2.c src/file3.c src/file4.c
.Jeśli przez konfigurację wydania / kompilacji masz na myśli tylko jedną konfigurację na plik makefile, to jest to po prostu kwestia oddzielenia CC i CFLAGS:
W zależności od tego, czy możesz użyć pliku makefile GNU, możesz użyć warunkowego, aby uczynić to nieco bardziej wyszukanym i sterować nim z wiersza poleceń:
a następnie użyj:
Jeśli chcesz kontrolować obie konfiguracje w tym samym czasie, myślę, że lepiej jest mieć katalogi kompilacji i jeden katalog kompilacji / config.
źródło
ifeq (DEBUG, 1)
) dla mnie,DEBUG
zmienna potrzebne owinięte w nawiasach tak:ifeq ($(DEBUG), 1)
.Pamiętaj, że jednocześnie możesz uprościć swój plik Makefile:
Teraz nie musisz wszędzie powtarzać nazw plików. Wszystkie pliki .l przejdą przez flex i gcc, wszystkie pliki .y przejdą przez bison i g ++, a wszystkie pliki .cpp tylko przez g ++.
Po prostu wymień pliki .o, które spodziewasz się na końcu, a Make wykona pracę polegającą na ustaleniu, które reguły mogą zaspokoić potrzeby ...
dla przypomnienia:
$@
Nazwa pliku docelowego (przed dwukropkiem)$<
Nazwa pierwszego (lub jedynego) pliku wymagań wstępnych (pierwszego po dwukropku)$^
Nazwy wszystkich plików wymagań wstępnych (oddzielone spacjami)$*
Temat (bit, który pasuje do%
symbolu wieloznacznego w definicji reguły.źródło
$^
dotyczy wszystkich wstępnie wymaganych plików.możesz mieć zmienną
wtedy możesz użyć instrukcji warunkowej
źródło
Uzupełniając odpowiedzi z wcześniejszych ... Musisz odwołać się do zmiennych, które definiujesz w swoich poleceniach ...
źródło
ifeq (DEBUG, 1)
powinna byćifeq ($(DEBUG), 1)
. Domyślam się, że mogło to odnosić się do twojej odpowiedzi tutaj.Możesz także dodać coś prostego do swojego Makefile, na przykład
Następnie skompiluj go do debugowania
make DEBUG=1
źródło