在foreach中添加额外空间时,makefile中缺少分隔符错误

时间:2011-01-04 15:30:58

标签: makefile gnu-make

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

上面的makefile应该在FILE_LIST变量中创建文件 问题在于尝试自动为目录生成规则的部分 当我运行它时,我得到一个“缺少分隔符”。错误。
当我删除逗号和$(eval)之间的空格时,它可以工作。

我真的很想明白为什么。

谢谢,
古尔

1 个答案:

答案 0 :(得分:3)

这是因为您需要在宏中使用制表符号作为命令分隔符。因为你没有它会产生“缺少分隔符”错误。

修复(使用;同一行上的命令分隔符):

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

您还可以简化:

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

为:

THIS_MAKE := $(lastword $(MAKEFILE_LIST))