THIS_MAKE := $(word $(words $(MAKEFILE_LIST)), $(MAKEFILE_LIST))
MAKER := $(MAKE) -f $(THIS_MAKE)
FILE_LIST=tmp/file tmp/dir/file
all:
rm -rf tmp
$(MAKER) copy_files
copy_files: $(FILE_LIST)
tmp/file: | tmp
echo hello>$@
tmp/dir/file: | tmp/dir
echo world>$@
define dst_dir_rule
$(1):
-mkdir -p $$@
endef
$(foreach dir,$(dir $(FILE_LIST)), $(eval $(call dst_dir_rule,$(dir))))
#end of makefile
Das obige Makefile sollte die Dateien in der Variable FILE_LIST erstellen.
Das Problem liegt in dem Teil, der versucht, automatisch Regeln für die Verzeichnisse zu erstellen.
Wenn ich es ausführe, erhalte ich die Fehlermeldung "fehlendes Trennzeichen".
Wenn ich das Leerzeichen zwischen dem Komma und dem $(eval) lösche, funktioniert es.
Ich würde wirklich gerne verstehen, warum.
Danke,
Gur
0 Stimmen
Nach dem Ersetzen des Leerzeichens vor den Make-Rezeptzeilen durch Tabulator (eine Anomalie, von der ich annehme, dass sie vom Kopieren und Einfügen stammt), einschließlich vor
-mkdir -p $$@
imdst_dir_rule
Funktion hatte ich keine Probleme, diese Make-Datei auszuführen. Ich verwende GNU make Version 3.81 (wie mit Ubuntu 12.04 ausgeliefert).