2011-01-04 1 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 

Файл makefile должен создавать файлы в переменной FILE_LIST.
Проблема с частью, которая пытается автоматически генерировать правила для каталогов.
Когда я запускаю его, я получаю «отсутствующий разделитель». ошибка.
Когда я удаляю пробел между запятой и $ (eval), он работает.Отсутствует ошибка разделителя в файле makefile при добавлении дополнительного пространства внутри foreach

Я бы очень хотел понять, почему.

Спасибо,
Гур

+0

После замены пространство перед make make recipe lines с вкладкой (какая аномалия, которую я предполагаю, происходит от копирования и вставки), в том числе перед '-mkdir -p $$ @' в функции 'dst_dir_rule' on, у меня не было проблем с запуском этого файла make. Я использую GNU make версии 3.81 (как поставляется с Ubuntu 12.04). – FooF

ответ

3

Это потому, что вам нужно использовать вкладку символ в качестве разделителя команд в макросе. Поскольку у вас его нет, он дает ошибку «missing separator».

Фикс (используя, разделитель команд на одной строке):

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

Кроме того, можно упростить:

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

к:

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

Спасибо за подсказку с одним концом. Я не думаю, что это проблема, хотя она работает без пространства. Я использую древний «make» на работе, который не поддерживает ключевое слово. Я попытался воспроизвести его дома с новым дизайном, и он работал с пространством без него, и, возможно, это была некоторая старая ошибка, которая была исправлена ​​с тех пор. – Gur

+0

Нет, это не сработало с 3.81 до тех пор, пока я не внес изменения. –