Makefile 使用通配符和stem作为先决条件生成文件

Makefile 使用通配符和stem作为先决条件生成文件,makefile,gnu-make,Makefile,Gnu Make,所以我有一个Makefile: broken-%: $(wildcard src/%/*) @echo $* @echo $^ working-%: src/a/* @echo $* @echo $^ > make broken-a a > make working-a a src/a/main.java > $*是%(干)而$^是先决条件 目录结构是 │ Makefile │ └───src └───a

所以我有一个Makefile:

broken-%: $(wildcard src/%/*)
    @echo $*
    @echo $^

working-%: src/a/*
    @echo $*
    @echo $^
> make broken-a
a

> make working-a
a
src/a/main.java
> 
$*
%
(干)而
$^
是先决条件

目录结构是

│   Makefile
│
└───src
    └───a
            main.java
使用Makefile:

broken-%: $(wildcard src/%/*)
    @echo $*
    @echo $^

working-%: src/a/*
    @echo $*
    @echo $^
> make broken-a
a

> make working-a
a
src/a/main.java
> 
这两者应该有相同的输出,但它们没有

由于某种原因,
$(通配符src/%/*)
%
设置为
a
时将不返回任何内容。这可能是因为先决条件中的通配符是自动求值的,所以在调用
通配符
函数之前先求值
src/%/*


有人知道如何使其工作吗?

在第二阶段实际应用规则之前,模式不会展开,因此当make第一次解析文件时,您使用文本字符串
src/%/*
调用
通配符

可以用来解决这个问题

.SECONDEXPANSION:
broken-%: $$(wildcard src/%/*)
    @echo $*
    @echo $^