2010-01-24 4 views
48

J'utilise un Makefile GNU-make pour construire un projet C avec plusieurs cibles (all, clean, et quelques cibles spécifiques au projet). Dans le processus de débogage, je voudrais ajouter des drapeaux à une seule construction sans modifier en permanence le Makefile (par exemple ajouter des symboles de débogage ou définir un drapeau de préprocesseur).Ajout à des variables GNU make via la ligne de commande

Dans le passé, je l'ai fait que comme suit (en utilisant l'exemple des symboles de débogage):

make target CFLAGS+=-g 

Malheureusement, ce n'est pas l'ajout à la variable CFLAGS, mais au contraire, la compensation et l'empêcher de compilation . Existe-t-il une façon propre de le faire sans définir une sorte de variable fictive ajoutée à la fin de CFLAGS et LDFLAGS?

Répondre

65

Consultez le override directive. Vous aurez probablement besoin de modifier le makefile une fois, mais il devrait faire ce que vous voulez.

Exemple makefile:

override CFLAGS += -Wall 

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

Exemple lignes de commande:

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

Merci pour le lien de référence. Cela ressemble à l'une des meilleures solutions pour le problème. –

20

Pour mémoire, réponse les prepends de @Carl Norum la variable, du point de vue de la ligne de commande.

je besoin d'un moyen d'ajouter réellement et est venu avec:

override CFLAGS := -Wall $(CFLAGS) 
6

Juste une note, que je me suis confus - Que ce soit le fichier 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))) 

Puis:

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

Avec les override directives supprimées du fichier testmake:

$ 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. 

Ainsi,

  • si une variable utilisée override une fois, il ne peut être ajouté avec une autre déclaration avec override (les affectations normales seront ignorées);
  • lorsqu'il n'y a pas eu override du tout; essayer d'ajouter (comme dans +=) à partir de la ligne de commande écrase chaque instance de cette variable.
9

Il y a deux façons de passer des variables à faire:

  • en utilisant des arguments de ligne de commande:

    make VAR=value 
    
  • Utilisation environnement:

    export VAR=var; make 
    

    ou (mieux parce que il change l'environnement seulement pour le comman courant d)

    VAR=var make 
    

Ils sont légèrement différentes. Le premier est plus fort. Cela signifie que vous savez ce que vous voulez. La seconde peut être considérée comme un indice. La différence entre eux concerne les opérateurs = et += (sans override). Ces opérateurs sont ignorés lorsqu'une variable est définie sur la ligne de commande, mais ne sont pas ignorés lorsque la variable est définie dans l'environnement. Ainsi, je vous suggère d'avoir un Makefile avec:

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

et appelez avec:

CFLAGS=-g make 

avis, si vous voulez retirer -Wall, vous pouvez utiliser:

make CFLAGS= 

Merci de ne pas utiliser le mot-clé override, sinon vous n'aurez aucun moyen de changer une variable affectée par override.

Questions connexes