打印目标的先决条件

1 makefile gnu-make

这很容易与这个问题重复,但据我所知,它还没有得到回答。

这是我的目标:能够将先决条件打印到目标。

我有某种解决方案,但对我来说感觉就像是黑客。

假设目标是all,并且它只有先决条件,位于名为 的文件中makefile-1

all: foo

all: bar baz
Run Code Online (Sandbox Code Playgroud)

我可以使用另一个名为的 makefile makefile-2

all:
ifeq ($(SHOW),yes)
    echo $^
else
    cat $^
endif
Run Code Online (Sandbox Code Playgroud)

当正确调用时,这会给我所需要的东西:

$ make -f makefile-1 -f makefile-2
cat foo bar baz
$ make -s SHOW=yes -f makefile-1 -f makefile-2
foo bar baz
Run Code Online (Sandbox Code Playgroud)

但我不确定如果先决条件实际上在原始 makefile 中有一个配方,或者是否有更好/更干净的方法,该怎么办。

小智 6

在不构建目标的情况下显示目标先决条件的一种更简单的方法可能是同时使用选项-p(如此处建议的那样)和-q选项,如GNU-Make 手册页上的建议(选项的长名称是--print-data-base):

make -qp | grep '^all:'
Run Code Online (Sandbox Code Playgroud)

这将打印数据库并仅选择具有目标all及其先决条件的行。如果该目标有一条规则,它将位于同一段落的末尾(如果我正确理解输出的格式)。

如果使用多个 makefile,则可以使用以下选项指定所有这些文件-f

make -f makefile-1 -f makefile-2 -qp
Run Code Online (Sandbox Code Playgroud)

这当然会从所有 makefile 中收集同一目标的先决条件,但目标不能在多个文件中指定规则。