如何从 GNU Make makefile 查询目标的先决条件?
例如,如果目标指定如下:
fred: wilma barney betty
我想打印fred
这样的先决条件:
$ make some_action fred
wilma barney betty
答案1
也许您正在寻找试运行?
make --dry-run fred
手册页为我们提供了有关试运行的信息:
-n, --just-print, --dry-run, --recon
Print the commands that would be executed, but do not
execute them.
所以它不会给你一个直接列表,而是一个间接列表,因为你知道他想要执行他所依赖的东西。
答案2
另一种可能性是“打印数据库”选项,尽管它会为您提供比您想要的更多的信息。从手册中:
‘-p’
‘--print-data-base’
Print the data base (rules and variable values) that results from reading the
makefiles; then execute as usual or as otherwise specified. This also prints the
version information given by the ‘-v’ switch (see below). To print the data base
without trying to remake any files, use ‘make -qp’. To print the data base of
predefined rules and variables, use ‘make -p -f /dev/null’. The data base output
contains file name and line number information for recipe and variable
definitions, so it can be a useful debugging tool in complex environments.
不过,公平的警告是:仔细检查这个烂摊子将要未经后期处理就变得残酷。
答案3
假设你的 Makefile 是这样的:
.PHONY: wilma barney betty fred: wilma barney betty
最新版本翻拍有一个--profile
输出数据的选项,可以将其转换为检查的依赖关系图。数据文件输出格式是 callgrind 使用的格式,因此需要另一个程序来根据输出的数据生成图表。看https://github.com/rocky/remake/tree/master/profile
在旧版本的重制中,您可以使用以下方法获取依赖项
$重制-X -f 生成文件 GNU Make 4.1+dbg0.91 专为 x86_64-unknown-linux-gnu 构建 版权所有 (C) 1988-2014 自由软件基金会, Inc. 版权所有 (C) 2015 洛基·伯恩斯坦。 许可证 GPLv3+:GNU GPL 版本 3 或更高版本 这是免费软件:您可以自由更改和重新分发它。 在法律允许的范围内,不提供任何保证。 正在读取生成文件... 更新 makefile.... 更新目标.... 文件“fred”不存在。 文件“wilma”不存在。 必须重做目标“威尔玛”。 成功重制目标文件“wilma”。 <- (/tmp/??:0) 威尔玛 重制<0>目标弗雷德·依赖 弗雷德:威尔玛·巴尼·贝蒂 重拍<1>辞职 重制版:就这样了,各位……
如果将发出的这些命令放入文件中,请说cmds.txt
:
target fred depend quit
然后你可以运行:
cat cmds.txt | remake -X -f Makefile
我将如何做一些更复杂的事情作为练习,例如编写采用依赖项名称并运行上述内容的程序。