如何发现make中的默认目标?

问题描述 投票:0回答:2

我看到了问题“如果没有指定目标,“make”应用程序如何知道要构建的默认目标?”,这解释了默认目标是第一个不带有“.”的目标。

如何让 make

告诉我目标是什么?

上下文:我有一个递归 make 系统,其中包含各种 makefile。如果我将一个新目标添加到我的顶级 Makefile(或我的公共包含文件)中,它将成为默认目标。我想添加

.DEFAULT_GOAL: original-default-target

,但我不知道
original-default-target

    

gnu-make
2个回答
3
投票
运行

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 来强制执行。


0
投票
一种不依赖于解析调试输出(未记录,因此可能会更改)的可靠方法是在

--query

--print-database
 模式下一起运行 make,然后 grep 进行 
.DEFAULT_GOAL
 分配。该变量以及一些示例和其他特殊变量记录在
特殊变量

make -qp | grep ^".DEFAULT_GOAL := " | tail -n 1
由于

--query

模式不执行文件,因此与Roger的答案相比有两个优点:

    没有运行任何食谱
  1. 目录不会递归,不会产生子目录。你得到当前目录Makefile的
  2. .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
,或对其进行沙箱处理。

相关问题:

  • 要求 makefile 打印变量值
  • Makefile DEFAULT_GOAL 变量
© www.soinside.com 2019 - 2024. All rights reserved.