2016-07-15 10 views
0

Wenn ich ein Makefile verwenden, ohne variable Ziele, die Dinge funktionierenStellen Wiederaufbau immer Abhängigkeiten

preamble: 
     mkdir -p data 
     touch [email protected] 

data/a: preamble 
     touch [email protected] 

data/b: data/a 
     touch [email protected] 

data/c: data/a 
     touch [email protected] 

data/d: data/b data/c 
     touch [email protected] 

diamond: data/a data/b data/c data/d 
     touch [email protected] 

.PHONY: clean 
clean: 
     rm -rf ${data} diamond preamble 

Allerdings, wenn ich eine Zielvariable Aufgaben beteiligt sind, immer laufen einzuführen.

data="data" 
preamble: 
     mkdir -p ${data} 
     touch [email protected] 

${data}/a: preamble 
     touch [email protected] 

${data}/b: data/a 
     touch [email protected] 

${data}/c: data/a 
     touch [email protected] 

${data}/d: data/b data/c 
     touch [email protected] 

diamond: ${data}/a ${data}/b ${data}/c ${data}/d 
     touch [email protected] 

.PHONY: clean 
clean: 
     rm -rf ${data} diamond preamble 

Diese werden immer

ausgeführt
touch "data"/a 
touch "data"/b 
touch "data"/c 
touch "data"/d 
touch diamond 

Was ist der richtige Weg, Variablen in Ziel aufzunehmen?

Antwort

1

Ich empfehle, keine Anführungszeichen zu verwenden. Das Makefile benötigt sie nicht und sie sind verwirrende Dateinamen.

Es ist üblich, $ (DATA) mit Klammern anstelle von geschweiften Klammern $ {DATA} zu sagen.

Auch in der Praxis empfehle ich die Verwendung von Variablennamen in Großbuchstaben. Rufen Sie es Daten anstelle von Daten auf.

+0

drrr. das funktioniert. Ich frage mich, warum Zitate in Make – NinjaGaiden

+2

@ user3589054 nicht funktionieren - in 'make' ist alles eine Zeichenfolge. Zitate werden als wörtliche Zitate behandelt. Die Zuweisung von 'VAR = Strings mit Leerzeichen wie dieser funktioniert 'funktioniert wie erwartet. – alvits