使用通配符和主干作为先决条件的 Makefile

Tom*_*Tom 7 makefile gnu-make

所以我有一个 Makefile:

\n\n
broken-%: $(wildcard src/%/*)\n    @echo $*\n    @echo $^\n\nworking-%: src/a/*\n    @echo $*\n    @echo $^\n
Run Code Online (Sandbox Code Playgroud)\n\n

$*%(主干)并且$^是先决条件

\n\n

目录结构是

\n\n
\xe2\x94\x82   Makefile\n\xe2\x94\x82\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80src\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80a\n            main.java\n
Run Code Online (Sandbox Code Playgroud)\n\n

使用生成文件:

\n\n
> make broken-a\na\n\n> make working-a\na\nsrc/a/main.java\n> \n
Run Code Online (Sandbox Code Playgroud)\n\n

这两个应该有相同的输出,但事实并非如此。

\n\n

由于某种原因$(wildcard src/%/*)%set toa没有返回任何内容。可能是因为先决条件中的通配符是自动评估的,所以src/%/*是在wildcard调用函数之前评估的?

\n\n

有谁知道如何让它工作?

\n

use*_*267 7

在第二阶段实际应用规则之前,模式不会扩展,因此当第一次通过 make 解析文件时,您将使用wildcard文字 string进行调用src/%/*

可以使用二次扩展来解决这个问题

.SECONDEXPANSION:
broken-%: $$(wildcard src/%/*)
    @echo $*
    @echo $^
Run Code Online (Sandbox Code Playgroud)