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?

Author: Michael Koval, 2010-01-25

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 
 73
Author: Carl Norum,
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)
 22
Author: aib,
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.

 11
Author: Jezz,
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 z override (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.
 6
Author: sdaau,
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