生成文件目标规则和 PHONY 的问题



我知道这可以通过不同的方式完成,但我实际上正在寻找更多关于makefiles的信息。

我希望能够调用make somefile.txt并运行给定的脚本。

在我当前的文件夹中,我有:

生成文件

%.txt:
# perl -pe "s/#.*//g; s/^n//g; s/n/t/g;" .txt
echo "Hi"

当我打电话给make时,我得到了

make: `somefile.txt' is up to date.

我知道我需要使用.PHONY,但是我在尝试将其与%.txt一起使用时遇到麻烦。

我已经尝试过诸如

files = *.txt
.PHONY = $(files)
%.txt:
# perl -pe "s/#.*//g; s/^n//g; s/n/t/g;" .txt
echo "Hi"

但这实际上并没有奏效。

(a(传统的方法是让你的真实目标有一个虚假的目标作为先决条件。 虚假目标最初总是被认为是过时的,因此任何依赖于虚假目标的东西也将始终被认为是过时的。 "力"是用于此目的的目标的常规名称。

例如

.PHONY: force
force:
%.txt: force
echo "Hi at $$(date)" > $@

如示例中所示,这不需要虚假目标具有配方。

如果你不想在 makefile 中列出要构建的目标,而只是在命令行上给出它们,你可以使用这个:

.PHONY: $(MAKECMDGOALS)

变量MAKECMDGOALS将设置为您在命令行上给出的目标集。

重要的是要了解生成文件不是 shell,因此仅将*.txt粘贴到生成文件中的任何位置并不总是会扩展它。 只有生成文件的特定区域直接使用 shell glob。

如果你想总是扩展它,你可以使用 make 的wildcard函数,如下所示:

files = $(wildcard *.txt)

最新更新