2010-01-24 17 views
48

Ich benutze ein Makefile GNU-make, um ein C-Projekt mit mehreren Zielen zu erstellen (all, clean, und ein paar projektspezifische Ziele). Während des Debuggens möchte ich einige Flags an einen einzelnen Build anhängen, ohne das Makefile dauerhaft zu bearbeiten (z. B. Debugging-Symbole hinzufügen oder ein Präprozessor-Flag setzen).An GNU-Variablen über die Befehlszeile anhängen

In der Vergangenheit habe ich getan, dass wie folgt (die Debug-Symbole am Beispiel):

make target CFLAGS+=-g 

Leider ist dies nicht auf die CFLAGS Variable angehängt, sondern es Clearing- und es kompilieren zu stoppen . Gibt es eine saubere Methode, dies zu tun, ohne eine Art Dummy-Variable zu definieren, die am Ende von CFLAGS und LDFLAGS angehängt ist?

Antwort

65

Überprüfen Sie die override directive. Sie werden wahrscheinlich das Makefile einmal ändern müssen, aber es sollte tun, was Sie wollen.

Beispiel Make-Datei:

override CFLAGS += -Wall 

app: main.c 
    gcc $(CFLAGS) -o app main.c 

Beispiel Befehlszeilen:

$ make 
gcc -Wall -o app main.c 
$ make CFLAGS=-g 
gcc -g -Wall -o app main.c 
+0

Danke für den Referenzlink. Das sieht nach einer der besseren Lösungen für das Problem aus. –

20

Für die Aufzeichnung @Carl Norum Antwort wird vorangestellt die Variable, von der Kommandozeile Perspektive.

brauchte ich einen Weg tatsächlich anzuhängen und kam mit:

override CFLAGS := -Wall $(CFLAGS) 
6

Nur eine Anmerkung, wie ich verwirrt habe - diese Datei sein lassen testmake:

$(eval $(info A: CFLAGS here is $(CFLAGS))) 

override CFLAGS += -B 

$(eval $(info B: CFLAGS here is $(CFLAGS))) 

CFLAGS += -C 

$(eval $(info C: CFLAGS here is $(CFLAGS))) 

override CFLAGS += -D 

$(eval $(info D: CFLAGS here is $(CFLAGS))) 

CFLAGS += -E 

$(eval $(info E: CFLAGS here is $(CFLAGS))) 

Dann:

Mit den override Direktiven aus der testmake Datei gelöscht:

$ make -f testmake 
A: CFLAGS here is 
B: CFLAGS here is -B 
C: CFLAGS here is -B -C 
D: CFLAGS here is -B -C -D 
E: CFLAGS here is -B -C -D -E 
make: *** No targets. Stop. 
$ make -f testmake CFLAGS+=-g 
A: CFLAGS here is -g 
B: CFLAGS here is -g 
C: CFLAGS here is -g 
D: CFLAGS here is -g 
E: CFLAGS here is -g 
make: *** No targets. Stop. 

So

  • wenn eine Variable verwendet override einmal, kann es nur mit einer anderen Aussage mit override angehängt werden (die normalen Zuweisungen werden ignoriert);
  • wenn es überhaupt keine override gibt; Wenn versucht wird, (wie in +=) von der Befehlszeile anzufügen, überschreibt jede Instanz dieser Variable.
9

Es gibt zwei Möglichkeiten, Variablen zu übergeben zu machen:

  • Verwenden von Befehlszeilenargumente:

    make VAR=value 
    
  • -Umgebung:

    export VAR=var; make 
    

    oder (besser, weil es ändert die Umgebung nur für den aktuellen Comman d)

    VAR=var make 
    

Sie sind etwas anders. Der erste ist stärker. Es bedeutet, dass Sie wissen, was Sie wollen. Die zweite kann wie ein Hinweis betrachtet werden. Unterschied zwischen ihnen ist über Operatoren = und += (ohne override). Diese Operatoren werden ignoriert, wenn eine Variable in der Befehlszeile definiert ist, aber nicht ignoriert wird, wenn die Variable in der Umgebung definiert ist. Daher schlage ich vor, Sie ein Makefile zu haben, mit:

CC ?= gcc 
    CFLAGS += -Wall 
    INTERNAL_VARS = value 

und nennen Sie es mit:

CFLAGS=-g make 

Hinweis, wenn Sie -Wall zurückzuziehen möchten, können Sie verwenden:

make CFLAGS= 

Bitte verwenden Sie kein Schlüsselwort override, sonst haben Sie keine Möglichkeit, eine von override betroffene Variable zu ändern.

Verwandte Themen