2016-04-13 3 views
0

Ich habe ein Makefile, das mein Projekt erstellt.Warum erstellt mein Makefile nach einem Release-Build keinen Debug-Ordner?

Es baut gut, wenn mit make genannt, aber wenn ich versuche und mach ein make debug danach, es nicht versucht, auch das Debug-Ausgabe-Verzeichnis zu erstellen, die die Verknüpfung nicht bedeutet, auch wenn ich make clean dazwischen baut nennen.

Der Debug-Build funktioniert, wenn ich den "Freigabe" -Ordner jedoch lösche.

Weiß jemand, warum das passiert?

Makefile

EXEC_DIR = ../../../../Bin/linux/release/ 
EXECUTABLE = $(EXEC_DIR)/prog 
CC = g++ 
DEBUG = -g -D_DEBUG 

... 

CFLAGS = -Wall -c $(INCLUDE_DIRS) -std=c++11 
LFLAGS = -Wall 

... 

all : $(EXECUTABLE) 

debug : EXEC_DIR = ../../../../Bin/linux/debug/ 
debug : EXECUTABLE = $(EXEC_DIR)/prog 
debug : CFLAGS += $(DEBUG) 
debug : LFLAGS += $(DEBUG) 
debug : $(EXECUTABLE) 

$(EXECUTABLE) : $(OBJS) | $(EXEC_DIR) 
    $(CC) $(LFLAGS) $(OBJS) -o $(EXECUTABLE) 

$(EXEC_DIR) : 
    mkdir -p $(EXEC_DIR) 

... 

clean : 
    -rm *.o *~ 
+1

Die Zeile 'debug: EXEC_DIR = ../../../../ Bin/linux/debug /' tut nicht, was Sie denken, dass es tut. Was es tut, ist, dass es 'EXEC_DIR' nur für den Bereich des 'debug'-Ziels (nicht global für das Makefile) setzt. – John

+1

Selbst wenn das wie erwartet funktionierte, würde "make" immer noch nichts * anderes * als die ausführbare Datei wiederherstellen, da sich keine der Quelldateien geändert hat. –

+0

Aber mehr zu dem Punkt, den der Wert von 'EXEC_DIR' für das' debug' Ziel gesetzt ist, ist nicht wirksam während der 'debug: EXECUTABLE =' Zuweisungslinie. Das ist das Problem. Sehen Sie sich die Ausgabe von 'make -p' für das' debug'-Ziel an, um das zu sehen. –

Antwort

1

Also, was Sie tun, ist eine Target Variable zu schaffen, die in den Rahmen der debug Rezepte nur dann wirksam ist (nicht seine Unter Rezepte). Was Sie wollen wahrscheinlich zu tun ist Linien wie folgt haben:

ifeq ($(filter debug,$(MAKECMDGOALS)),debug) 
    EXEC_DIR = ../../../../Bin/linux/debug/ 
    OBJ_DIR = ../../../../Bin/linux/debug/objs 
    ... 
endif 

und prepend $(OBJ_DIR), um alle Ihre Objektdateien dann. Dies kommt um die nicht wiederherstellenden Quelldateien herum, die Etan erwähnt hat.

+0

Also sollte dies am Anfang der Datei sein, nachdem 'EXEC_DIR' und' OBJ_DIR' normalerweise für den Release-Build deklariert wurden? – Cameron

+0

Entweder am Anfang einer Datei mit einem else oder nach den anderen Deklarationen (da die letzte Deklaration Vorrang hat) – John

+0

Wie rufe ich das dann auf? – Cameron

Verwandte Themen