Ich bin verwirrt durch den Unterschied zwischen der "shell
" MAKE-Funktion und "$$
". In der Dokumentation finde ich:
Die Shell-Funktion nimmt ein einziges Argument, das (wie alle Argumente) erweitert wird und zu einer Subshell zur Ausführung übergeben. Die Standardausgabe des Befehls wird dann gelesen und als Wert der Funktion zurückgegeben.
Ich glaubte, dies war genau was "$$" wurde als gut, aber in diesem kleinen Beispiel tun:
a = $(shell find . -maxdepth 1 -type f -name "Makefile")
b = $$(find . -maxdepth 1 -type f -name "Makefile")
.PHONY: all A B
all: A B
A: $(a)
@echo "Target: $(@)"
@echo "Prereq: $(<)"
@echo "Var a: $(a)"
@echo "Var b: $(b)"
B: $(b)
@echo "Target: $(@)"
@echo "Prereq: $(<)"
@echo "Var a: $(a)"
@echo "Var b: $(b)"
der Ausgang ist der folgende:
Target: A
Prereq: Makefile
Var a: ./Makefile
Var b: ./Makefile
make: *** No rule to make target '$(find)', needed by 'B'. Stop.
Hinweis hier, dass es sagt "Keine Regel zu Ziel '$ (finden)'", als ob das Argument noch nicht erweitert wurde. (Ich habe auch versucht, die Variable einfach zu erweitern, "b:=$$(...)
", aber das änderte nichts).
Ich hoffe, dass jemand das Wissen hat, mehr darüber zu erarbeiten, was mir wie ein subtiler Unterschied erscheint, aber wahrscheinlich ist viel tiefer, als ich in dieser Zeit verstehen kann.
Vielen Dank für eine gründliche Antwort, das Beispiel ist ausgezeichnet.Ich muss zugeben, dass die Erweiterung von Variablen für mich immer etwas magisch war. –