3 Stimmen

Fehler beim fehlenden Trennzeichen in einem Makefile, wenn innerhalb von foreach ein zusätzliches Leerzeichen hinzugefügt wird

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 $$@ im dst_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).

3voto

Maxim Egorushkin Punkte 125210

Das liegt daran, dass Sie das Tabulator-Symbol als Befehlstrennzeichen in Ihrem Makro verwenden müssen. Da Sie keins haben, wird der Fehler "fehlendes Trennzeichen" angezeigt.

Korrektur (Verwendung des Befehlstrennzeichens ; in derselben Zeile):

define dst_dir_rule
$(1): ; -mkdir -p $$@ # as a one liner

Sie können auch vereinfachen:

THIS_MAKE := $(word $(words $(MAKEFILE_LIST)), $(MAKEFILE_LIST))

zu:

THIS_MAKE := $(lastword $(MAKEFILE_LIST))

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X