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

发布于 2024-10-10 00:09:05 字数 606 浏览 6 评论 0原文

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

鲜血染红嫁衣 2024-10-17 00:09:05

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

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

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

您还可以将:简化

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

为:

THIS_MAKE := $(lastword $(MAKEFILE_LIST))

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):

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

You can also simplify:

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

to:

THIS_MAKE := $(lastword $(MAKEFILE_LIST))
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文