2011-01-04 5 views
2
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>[email protected] 

tmp/dir/file: | tmp/dir 
echo world>[email protected] 

define dst_dir_rule 
$(1): 
-mkdir -p [email protected] 

endef 
$(foreach dir,$(dir $(FILE_LIST)), $(eval $(call dst_dir_rule,$(dir)))) 

#end of makefile 

Das obige Makefile sollte die Dateien in der Variablen FILE_LIST erstellen.
Das Problem ist mit dem Teil, der versucht, Regeln für die Verzeichnisse automatisch zu generieren.
Wenn ich es ausführe, bekomme ich einen "fehlenden Separator". Error.
Wenn ich den Abstand zwischen dem Komma und dem $ (eval) löschen, funktioniert es.fehlender Separatorfehler in einem Makefile, wenn zusätzlicher Platz innerhalb von foreach hinzugefügt wird

Ich würde wirklich gerne verstehen, warum.

Danke,
Gur

+0

Nach dem Raum vor Ersetzen von die make recipe Zeilen mit Tab (welche Anomalie ich vermute, kommt von copy & paste) einschließlich vor '-mkdir -p $$ @' in der 'dst_dir_rule' Funktion auf, ich hatte kein Problem, diese make-Datei auszuführen. Ich benutze GNU make Version 3.81 (wie mit Ubuntu 12.04 ausgeliefert). – FooF

Antwort

3

Das ist, weil Sie Tabulatorsymbol als Befehlsseparator in Ihrem Makro verwenden müssen. Da Sie keinen haben, gibt es den Fehler "fehlende Trennzeichen".

Fix (verwendet; Befehlsseparator auf derselben Zeile):

define dst_dir_rule 
$(1): ; -mkdir -p [email protected] # as a one liner 

Sie können auch vereinfachen:

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

zu:

THIS_MAKE := $(lastword $(MAKEFILE_LIST)) 
+0

Danke für den One-Liner-Regeltipp. Ich denke nicht, dass dies das Problem ist, da es ohne den Platz funktioniert. Ich benutze altes "make" bei der Arbeit, das das letzte Wort nicht unterstützt. Ich habe versucht, es zu Hause mit einer neueren Marke zu reproduzieren, und es funktionierte mit und ohne den Platz, also ist es vielleicht ein alter Fehler, der seither behoben wurde. – Gur

+0

Nein, es hat nicht mit make 3.81 funktioniert, bis ich die Änderung vorgenommen habe. –

Verwandte Themen