ошибка отсутствия разделителя в make-файле при добавлении дополнительного пространства внутри foreach

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

Приведенный выше make-файл должен создавать файлы в переменной FILE_LIST.
Проблема заключается в той части, которая пытается автоматически генерировать правила для каталогов.
Когда я запускаю его, я получаю "отсутствующий разделитель". error.
Когда я удаляю пробел между запятой и $(eval), все работает.

Очень хотелось бы понять почему.

Спасибо,
Гур


person Gur    schedule 04.01.2011    source источник
comment
После замены пробела перед строками рецепта make на вкладку (которая, как я полагаю, возникает из-за копирования и вставки), в том числе перед -mkdir -p $$@ в функции dst_dir_rule, у меня не было проблем с запуском этого файла make. Я использую GNU make версии 3.81 (поставляется с Ubuntu 12.04).   -  person FooF    schedule 16.10.2012


Ответы (1)


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

Исправить (используя разделитель команд ; в той же строке):

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

Вы также можете упростить:

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

to:

THIS_MAKE := $(lastword $(MAKEFILE_LIST))
person Maxim Egorushkin    schedule 04.01.2011
comment
Спасибо за совет по правилу одного вкладыша. Я не думаю, что это проблема, поскольку он работает без пробела. Я использую на работе старую марку, которая не поддерживает lastword. Я попытался воспроизвести его дома с более новой маркой, и она работала с пробелом и без него, так что, возможно, это какая-то старая ошибка, которая была исправлена ​​с тех пор. - person Gur; 04.01.2011
comment
Нет, это не работало с make 3.81, пока я не внес изменения. - person Maxim Egorushkin; 05.01.2011