2012-10-19 6 views
8

Ich versuche in meinem aktuellen Projekt ein nicht-rekursives make build-System zu implementieren. Was ich damit zu tun habe, sind Variablenbereiche. Zielspezifische Variablen passen nicht zu meinen Bedürfnissen, da Variablen oft Ziele und keine Voraussetzungen definieren. Was ich brauche, ist:GNU machen. Variablen mit einem auf ein einzelnes Makefile begrenzten Umfang

Makefile1:

SOMEVAR := original_value 
include Makefile2 
$(warning $(SOMEVAR)) 

Makefile2:

#some magic here to do what I want and make me happy 
SOMEVAR := included_value 
#and maybe here 

Und die Ausgabe ich will, ist 'original_value'.

Gibt es irgendwelche Strategien, um es real zu machen?

EDIT: Die einzige Lösung, die ich für den Moment gekommen ist, mich zu zwingen und zu organisieren, am Ende jeden einzelnen Makefile aller inlcudes zu platzieren und sofort variable Zuordnung verwenden: =

+0

Diese Lösung klingt ziemlich gut. Was stimmt damit nicht? Und was ist 'SOMEVAR', wofür wird es verwendet? – Beta

+1

Die Sache, die ich in dieser Lösung nicht mag, ist, dass es sehr wackelig ist. Wenn irgendein armer Typ, der meinen Platz einnehmen wird, die Idee und den Ort nicht bekommen wird woanders, wird er Tonnen von Überraschungen bekommen. –

+1

Wenn Makefile2 mehr als einmal enthalten ist, und es ein Rezept definiert, das auf '$ (SOMEVAR)' verweist , dann wird es fürchterlich zerbrechen --- Variablen innerhalb von Rezepten werden ausgewertet, wenn die Rezepte ausgeführt werden, was bedeutet, dass sie alle den letzten Wert von '$ (SOMEVAR)' sehen, nicht den Wert, den es hatte, als das Rezept definiert wurde. –

Antwort

5

Eine Strategie, die altmodische Lösung Bei Variablennamen-Kollisionen, wenn alles, was Sie haben, globale Variablen ist: Fügen Sie Ihren Variablennamen ein Präfix in einer Form von Namespaces von arom-man hinzu.

Makefile1:

Makefile1_SOMEVAR := original_value 
include Makefile2 
$(warning $(Makefile1_SOMEVAR)) 

Makefile2:

# no magic needed 
Makefile2_SOMEVAR := included_value 
# rest of Makefile2 uses $(Makefile2_SOMEVAR) of course 

Simsalabim, mit einer Konvention wie das, wie es ist, wenn jede Make-Datei ihre eigenen lokalen Variablen (oder zumindest seine eigenen Variablen in ein Namespace, der nicht mit anderen Makefiles kollidiert).

Verwandte Themen