为什么我的Makefile模式规则多次运行其配方?

Bre*_*ent 1 makefile gnu-make

根据gnu make文档,模式规则的“ ...配方仅执行一次即可创建所有目标。” 但是,我有以下Makefile

.PHONY: entrypoint
entrypoint: test_1.cpp test_2.cpp

test_%.cpp:
    echo $@
Run Code Online (Sandbox Code Playgroud)

运行make会产生:

echo test_1.cpp
test_1.cpp
echo test_2.cpp
test_2.cpp
Run Code Online (Sandbox Code Playgroud)

我是新手,可能是我误会了一些东西,但是如果说清楚的话,文档似乎会产生误导。

$ make -v
GNU Make 4.0
...
Run Code Online (Sandbox Code Playgroud)

Mad*_*ist 5

您误读了文档。这意味着,该配方仅运行一次,前提是将创建该规则中的所有目标模式。

由于您的规则中只有一个目标模式(test _%。cpp`),因此可以知道每次运行该配方时都会创建一个与该模式匹配的输出文件。要创建与该模式匹配的不同目标,它将运行配方的多个实例。

如果您有这样的规则:

%.x %.y %.z :
        dothings
Run Code Online (Sandbox Code Playgroud)

然后进行会认为配方的一次调用dothings将创建所有匹配该模式的目标(例如,foo.xfoo.y,和foo.z)。

将此与如下明确规则进行对比:

foo.x foo.y foo.z :
        dothings
Run Code Online (Sandbox Code Playgroud)

“在这里制作”与您编写的内容完全相同:

foo.x :
        dothings
foo.y :
        dothings
foo.z :
        dothings
Run Code Online (Sandbox Code Playgroud)

也就是说,要建立所有这三个目标,它将运行配方三遍。

没有办法告诉make“请运行一次此配方,它将产生可能与模式匹配的每个目标foo_%.cpp”。