Dołączanie do GNU make zmiennych za pomocą wiersza poleceń
Używam GNU-make Makefile do budowania projektu C z kilkoma celami (all
, clean
, i kilka konkretnych celów projektu). W procesie debugowania chciałbym dodać kilka flag do jednej kompilacji bez trwałej edycji pliku Makefile (np. dodać symbole debugowania lub ustawić flagę preprocesora).
W przeszłości robiłem to w następujący sposób (używając przykładu symboli debugowania):
make target CFLAGS+=-g
Niestety, nie jest to dodawanie do zmiennej CFLAGS
, ale zamiast, wyczyszczenie i powstrzymanie kompilacji. Czy istnieje czysty sposób na zrobienie tego bez zdefiniowania jakiejś fałszywej zmiennej dołączonej do końca CFLAGS
i LDFLAGS
?
4 answers
Sprawdź override directive . Prawdopodobnie będziesz musiał zmodyfikować plik makefile raz, ale powinien robić to, co chcesz.
Przykład makefile:
override CFLAGS += -Wall
app: main.c
gcc $(CFLAGS) -o app main.c
Przykładowe linie poleceń:
$ make
gcc -Wall -o app main.c
$ make CFLAGS=-g
gcc -g -Wall -o app main.c
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-24 23:44:21
Dla przypomnienia, @Carl Norum ' s answer prepends zmienna, z perspektywy linii poleceń.
Potrzebowałem sposobu, aby faktycznie dołączyć i wymyśliłem:
override CFLAGS := -Wall $(CFLAGS)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-27 12:47:22
Istnieją dwa sposoby przekazywania zmiennych do wykonania:
-
Użycie argumentów wiersza poleceń:
make VAR=value
-
Użycie środowiska:
export VAR=var; make
Or (lepiej, bo zmienia środowisko tylko dla bieżącego polecenia)
VAR=var make
Są nieco inne. Pierwszy jest silniejszy. To znaczy, że wiesz, czego chcesz. Drugi może być uważany za podpowiedź. Różnica między nimi dotyczy operatorów =
i +=
(Bez override
). Te operatory są ignorowane, gdy zmienna jest zdefiniowana w wierszu poleceń, ale nie są ignorowane, gdy zmienna jest zdefiniowana w środowisku. Dlatego proponuję mieć Makefile z:
CC ?= gcc
CFLAGS += -Wall
INTERNAL_VARS = value
I wywołaj to przez:
CFLAGS=-g make
Uwaga, Jeśli chcesz wycofać -Wall
, możesz użyć:
make CFLAGS=
Proszę nie używać słowa kluczowego override
, w przeciwnym razie nie będzie można zmienić zmiennej, której dotyczy override
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-21 13:58:52
Tylko notka, jak się pomyliłem-niech to będzie plik 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)))
Potem:
$ 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.
Z dyrektywami override
usuniętymi z pliku 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.
Więc,
- jeśli zmienna została użyta
override
raz, może być dodana tylko do innej instrukcji zoverride
(normalne przypisania będą ignorowane); - gdy nie było
override
w ogóle; próba dodania (jak w+=
) z linii poleceń nadpisuje każdą instancję tego zmienna.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-17 04:06:12