1

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

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

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

我正在使用:

  • GNU 使 3.81
  • GNU 重击 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

4

2 回答 2

1

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

.PHONY: clean

如果你在运行make clean时得到输出

make: `clean' is up to date.

那么这可能是你的问题。

于 2010-06-15T20:22:01.987 回答
-1

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

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

于 2010-06-15T20:22:26.943 回答