使用通配符和目标文件名代码中的stem变量作为先决条件的Makefile

7

我有一个Makefile:

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

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

$*%(词干),而$^是先决条件。

目录结构如下:

│   Makefile
│
└───src
    └───a
            main.java

使用Makefile:

> make broken-a
a

> make working-a
a
src/a/main.java
> 

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

由于一些原因,将 % 设置为 a$(wildcard src/%/*) 返回为空。可能是因为前提中的通配符自动计算,所以在调用 wildcard 函数之前,src/%/* 已经被计算了?

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


在我写这篇文章的时候,这个问题和被采纳的答案都有4个赞。非常好的问题和优秀的答案! - TallChuck
1个回答

6

只有当规则在第二个阶段实际应用时,模式才会被扩展开,因此在make首次解析文件时,您调用wildcard时使用的是字面字符串src/%/*

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接