Jaka jest różnica między: = i = w Makefile?

Odpowiedzi:

80

Jest to opisane w dokumentacji GNU Make, w sekcji zatytułowanej 6.2 Dwa rodzaje zmiennych .

Krótko mówiąc, zmienne zdefiniowane za pomocą :=są rozwijane raz, ale zmienne zdefiniowane za pomocą =są rozwijane za każdym razem, gdy są używane.

Greg Hewgill
źródło
4
Czy zatem słuszne byłoby stwierdzenie, że: = jest bardziej wydajne? A może wydajność nie jest tak naprawdę czynnikiem w przypadku plików Makefiles?
Ungeheuer
3
@Ungeheuer To nie jest problem, ponieważ wywołanie procesu ( makegłówne zadanie) ma znacznie większy narzut niż takie wewnętrzne rozwiązywanie zmiennych.
Kirill Bulygin
68

Proste zadanie :=

Proste wyrażenie przypisania jest oceniane tylko raz, przy pierwszym wystąpieniu. Na przykład, jeśli CC :=${GCC} ${FLAGS}podczas pierwszego spotkania zostanie oszacowane, gcc -Wto za każdym razem ${CC}zostanie zastąpione przez gcc -W.

Przypisanie rekurencyjne =

Wyrażenie przypisania rekurencyjnego jest oceniane za każdym razem, gdy zmienna zostanie napotkana w kodzie. Na przykład instrukcja podobna CC = ${GCC} {FLAGS}zostanie oceniona tylko wtedy, gdy ${CC} file.czostanie wykonana akcja podobna . Jeśli jednak zmienna GCCzostanie ponownie przypisana, tj. GCC=c++Wtedy ${CC}zostanie przekonwertowana na c++ -Wpo ponownym przypisaniu.

Przypisanie warunkowe ?=

Przypisanie warunkowe przypisuje wartość do zmiennej tylko wtedy, gdy nie ma ona wartości

Dołączanie +=

Załóżmy, że CC = gccwtedy operator dołączania jest używany tak, jak CC += -w
wtedy CCma wartośćgcc -W

Więcej informacji znajdziesz w tych samouczkach

Amjad
źródło
„Proste wyrażenie przypisania jest oceniane tylko raz, przy pierwszym wystąpieniu”: aby było jasne, interpretacja / ocena ma miejsce, gdy zmienna jest zdefiniowana, a nie za pierwszym razem, gdy jest używana.
Michael Burr