Makefile 和 rm -f file.{ext1,ext2,ext3} 问题

发布于 2024-09-05 15:26:12 字数 654 浏览 4 评论 0原文

你能解释一下为什么 Makefile 规则:

clean:
    rm -f foo.{bar1,bar2,bar3}

不会导致删除文件:foo.bar1 foo.bar2 和 foo.bar3 吗? 我相信我在各种 Makefile 中多次看到类似的模式,但我目前正在编写自己的 Makefile,并且无法使该规则正常工作(没有文件被删除)。

我正在使用:

  • gnu make 3.81
  • gnu bash 4.1.5

Bash 正如我怀疑的那样评估该模式:

$ echo test.{a,b,c}
test.a test.b test.c

谢谢!

更新

感谢大卫的提示,我找到了上述问题的解决方案。 gnu make 默认使用 /bin/sh,这就是为什么 a.{1,2,3} 不会被计算为 a.1 a.2 a.3。

要使“make”使用 bash 而不是 sh,请将以下行添加到您的 Makefile 中:

SHELL=/bin/bash

从现在开始,a.{1,2,3} 将被视为 a.1 a.2 a.3

Could you explain me, why Makefile rule:

clean:
    rm -f foo.{bar1,bar2,bar3}

does not result in removing files: foo.bar1 foo.bar2 and foo.bar3?
I believe I saw pattern like that many times in various Makefiles, but I'm currently writing my own Makefile and can't make that rule work correctly (no files are removed).

I'm using:

  • gnu make 3.81
  • gnu bash 4.1.5

Bash evals that pattern as I suspect:

$ echo test.{a,b,c}
test.a test.b test.c

Thanks!

UPDATE

Thank to David's hint I found solution for the problem described above.
The gnu make uses the /bin/sh by default and that is why a.{1,2,3} isn't evaluated to a.1 a.2 a.3.

To make 'make' use bash instead of sh add following line to your Makefile:

SHELL=/bin/bash

from now a.{1,2,3} will be considered as a.1 a.2 a.3

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

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

发布评论

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

评论(2

孤城病女 2024-09-12 15:26:12

目录中是否有名为 clean 的文件?如果是这样,make 将认为该目标是最新的并且不会运行相应的命令。要解决这个问题,请将此行添加到您的 makefile 中:

.PHONY: clean

如果您运行 make clean 时得到输出

make: `clean' is up to date.

,那么这可能是您的问题。

Is there a file named clean in the directory? If so, make will consider that target up to date and won't run the corresponding command. To fix that, add this line to your makefile:

.PHONY: clean

If when you run make clean you get the output

make: `clean' is up to date.

then that's probably your problem.

妄断弥空 2024-09-12 15:26:12

这是因为这里没有调用 shell,而是直接调用 rm。由于 shell 执行了 {} 替换,因此 rm “看到”的是原始 foo.{bar1,bar2,bar3} 字符串。由于没有这样的文件,所以什么也没有发生。

您应该使用 GNUmake 的字符串宏之一来让它为您执行扩展。

It's because the shell isn't being invoked here, but rather rm is directly. Since the shell does the {} substitution, what rm 'sees' is the raw foo.{bar1,bar2,bar3} string. As there's no such file, nothing happens.

You should use one of GNUmake's string macros to have it perform the expansion for you.

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