在 foreach 内添加额外空间时 makefile 中缺少分隔符错误
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) 之间的空格时,它起作用了。
我真的很想了解为什么。
谢谢,
古尔
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
The makefile above should create the files in the FILE_LIST variable.
The problem is with the part that tries to automatically generate rules for the directories.
When I run it I get a "missing separator." error.
When I delete the space between the comma and the $(eval) it works.
I would really like to understand why.
Thanks,
Gur
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这是因为您需要在宏中使用制表符作为命令分隔符。由于您没有它,因此会产生“缺少分隔符”错误。
修复(在同一行使用 ; 命令分隔符):
您还可以将:简化
为:
This is because you need to use tab symbol as command separator in your macro. As you don't have one it yields "missing separator" error.
Fix (using ; command separator on the same line):
You can also simplify:
to: