76 votes

Ajouter à GNU make des variables via la ligne de commande

Je suis à l'aide d'un GNU-faire Makefile pour construire un projet C avec plusieurs cibles (all, clean, et un peu de projet objectifs spécifiques). Dans le processus de débogage, je tiens à ajouter des indicateurs à une construction unique sans permanence éditer le fichier Makefile (par exemple, ajouter les symboles de débogage ou de définir un préprocesseur drapeau).

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

make target CFLAGS+=-g

Malheureusement, ce n'est pas l'ajout de l' CFLAGS variable, mais au lieu de cela, l'effacement et de l'arrêter à partir de la compilation. Est-il un moyen propre de faire cela sans définir une sorte de variable muette ajouté à la fin de l' CFLAGS et LDFLAGS?

96voto

Carl Norum Points 114072

Découvrez la directive de substitution . Vous aurez probablement besoin de modifier le makefile une fois, mais il devrait faire ce que vous voulez.

Exemple de makefile:

 override CFLAGS += -Wall

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

Exemple de lignes de commande:

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

33voto

aib Points 18608

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

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

 override CFLAGS := -Wall $(CFLAGS)
 

9voto

sdaau Points 6262

Juste une remarque, que je n'ai pas compris - 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)))

Alors:

$ 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 l' override directives supprimés à partir de l' testmake le fichier:

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

Donc,

  • si une variable est utilisée override une fois, il ne peut être ajouté avec un autre énoncé avec override (normal affectations seront ignorés);
  • quand il n'y a pas eu d' override à tous, en essayant d'ajouter (comme en +=) à partir de la ligne de commande remplace chaque occurrence de cette variable.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X