我看到了问题“如果没有指定目标,“make”应用程序如何知道要构建的默认目标?”,这解释了默认目标是第一个不带有“.”的目标。
如何让 make告诉我目标是什么?
上下文:我有一个递归 make 系统,其中包含各种 makefile。如果我将一个新目标添加到我的顶级 Makefile(或我的公共包含文件)中,它将成为默认目标。我想添加.DEFAULT_GOAL: original-default-target
,但我不知道
original-default-target
是。
make -d
会产生lot 调试输出。如果您在此搜索第一次出现的“更新目标”,并查看提到的下一个目标,这似乎是默认目标。 例如:
$ make -d | grep -A2 -m1 'goal targets'
Updating goal targets....
Considering target file 'all'.
File 'all' does not exist.
这意味着,至少对于此 Makefile,当前默认目标是
all
。然后可以通过将
.DEFAULT_GOAL: all
添加到顶级 Makefile 来强制执行。
--query
和
--print-database
模式下一起运行 make,然后 grep 进行
.DEFAULT_GOAL
分配。该变量以及一些示例和其他特殊变量记录在特殊变量。
make -qp | grep ^".DEFAULT_GOAL := " | tail -n 1
由于--query
模式不执行文件,因此与Roger的答案相比有两个优点:
.DEFAULT_GOAL
tail -n 1
位才能可靠地获得正确的输出。 makefile 中类似
$(info .DEFAULT_GOAL := fake-goal)
的输出首先发送到 stdout。在完全解析 makefile 并展开变量之后,最后打印变量和规则。因此,标准输出上的最后一个
.DEFAULT_GOAL
实例就是您正在寻找的真正实例。
警告: makefile 实际上是在解析时执行的脚本,无论是否处于 --query
/
--dry-run
模式。函数被扩展了,所以像
$(shell BOOM)
这样的东西在 makefile 解析时被扩展了。在不执行任何操作的情况下,不可能可靠地解析 makefile 并确定默认目标。仅在您信任的 makefile 上运行
make
,或对其进行沙箱处理。相关问题: