отсутствует ошибка разделителя в make-файле при добавлении дополнительного пространства внутри foreach - PullRequest
2 голосов
/ 04 января 2011
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.
Проблема в части, которая пытается автоматически сгенерировать правила для каталогов.
Когда я запускаю его, я получаю «пропавший разделитель». ошибка.
Когда я удаляю пробел между запятой и $ (eval), это работает.

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

Спасибо
Гур

1 Ответ

3 голосов
/ 04 января 2011

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

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

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

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

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

до:

THIS_MAKE := $(lastword $(MAKEFILE_LIST))
...