Makefile 通配符目标扩展

Makefile wildcard target expansion

我是 GNU Make 的新用户。我想获取 Golang 文件列表并使用 Make 构建每个文件。

我想创建一个目标,它将接收 apt Go 文件作为参数。 在我写的代码片段中,程序的控制从未达到 %.go 目标。

这是一个文件的片段。

EXECUTABLES := $(wildcard cmd/*/*/*.go)

%.go:
    echo "Build the go file"

build: $(EXECUTABLES)
    echo $<

输出:

echo cmd/abc/handler/main.go
cmd/abc/handler/main.go

我将脚本修改为此,但我遇到了同样的问题。还尝试用 *.gocmd/abc/handler/main.go[ 替换 %.go =13=]

这是上述变体之一。

%.go:
    echo "Hello world"

build: $(wildcard cmd/*/*/*.go)
    echo $<

这里有什么我可能遗漏的吗?

你有一个规则告诉 make 如何构建一个 .go 文件。但是,您已经 拥有 一个 .go 文件。 Make 不必构建它,它是您编写的源文件。该规则没有先决条件,因此就 make 而言,如果文件存在,它是最新的(它不依赖于任何其他文件)。

所以,当你要求 make 构建那个文件时,make 看起来会说“这个文件已经存在,它不依赖于任何东西,所以你让我做的事情已经完成了,我没有需要 运行 任何命令。

编写 makefile 时,您必须从 end 开始考虑它。您想最终得到什么?那是你写的第一个目标。那么什么文件被用作最终结果的输入呢?这些是该目标的先决条件。根据先决条件创建目标需要哪些命令?这就是食谱。

然后一旦有了这些,您就会考虑这些先决条件,将它们视为目标。 他们有什么先决条件?您需要什么命令才能将 那些 先决条件变成 那个 目标?

然后你一直这样倒退,直到你到达一个所有先决条件都是无法从任何东西构建的原始源文件的地方,然后你就完成了。