2016-05-11 1 views
2

Ich begann in letzter Zeit in Details des Makefile zu graben. Ich verstehe, dass ': =' unmittelbar und '=' verschoben ist. Ich brauche jedoch einige vereinfachte Szenarien/Beispiele, wann ich eine gegenüber der anderen verwenden muss, um den Unterschied voll zu schätzen.Szenarien für die Verwendung von ': =' vs '=' in Makefile? (Mit Beispielen, wenn möglich)

+2

': =' wird nur einmal ausgewertet, während '=' bei jeder Referenz neu ausgewertet wird. Betrachten Sie dieses Szenario: 'TEMPFILE = $ (shell mktemp/tmp/XXXXXXXX)'. Wenn Sie auf 'TEMPFILE' verweisen, wird es in jeder Referenz anders sein. Wenn das beabsichtigt ist, wird '=' funktionieren. Wenn die Absicht darin besteht, auf die zuvor erzeugte "TEMPFILE" zu verweisen, da der gewünschte Effekt darin besteht, dieselbe Datei während der gesamten Schritte in dem "Makefile" zu verwenden, sollte stattdessen ": =" verwendet werden. – alvits

Antwort

2

Wenn .foo und .bar Dateien hatte genau das gleiche Rezept würden Sie es nicht haben wollen zweimal zu schreiben, rekursiv erweitert Variablen zur Rettung:

foobar = do_stuff [email protected] 
%.foo: 
    $(foobar) 
%.bar: 
    $(foobar) 

Sofern Sie rekursive Erweiterung benötigen, einfach erweitert Variablen sollte standardmäßig verwendet werden, da sie einfacher zu verstehen und robuster sind.

some_deps = stuff I really want 
some_other_deps = $(some_deps) some more 

### [...] 

some_deps = unrelated stuff 

foo: $(some_other_deps) # Oops, should have used := for some_other_deps 

Sie können weitere Beispiele in der manual finden.

+0

Vielen Dank für die Bezugnahme auf diesen Abschnitt des Handbuchs. Ich habe diesen Teil total vermisst. – MIbrah

Verwandte Themen