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)之间的空格时,它可以工作。
我真的很想明白为什么。
谢谢,
古尔
答案 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))