Makefile 将先决条件打印到目标

Makefile 将先决条件打印到目标,makefile,gnu-make,Makefile,Gnu Make,这很容易是一个副本,但它没有得到回答,因为我所看到的 我的目标是:能够将先决条件打印到目标 我有一些解决办法,但对我来说,这就像是一个黑客 假设目标是all,在名为makefile-1的文件中,它只有先决条件: all: foo all: bar baz 我可以使用另一个名为makefile-2的makefile: all: ifeq ($(SHOW),yes) echo $^ else cat $^ endif 当正确调用时,这类函数提供了我所需要的: $ make -f

这很容易是一个副本,但它没有得到回答,因为我所看到的

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

我有一些解决办法,但对我来说,这就像是一个黑客

假设目标是
all
,在名为
makefile-1
的文件中,它只有先决条件:

all: foo

all: bar baz
我可以使用另一个名为
makefile-2
的makefile:

all:
ifeq ($(SHOW),yes)
    echo $^
else
    cat $^
endif
当正确调用时,这类函数提供了我所需要的:

$ make -f makefile-1 -f makefile-2
cat foo bar baz
$ make -s SHOW=yes -f makefile-1 -f makefile-2
foo bar baz

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

在不构建目标的情况下,向目标显示先决条件的更简单方法可能是同时使用
-p
选项(如建议的)和
-q
选项,如上所示(选项的长名称为
--打印数据库
):

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

如果使用多个makefile,可以使用
-f
选项指定所有makefile:

make -f makefile-1 -f makefile-2 -qp

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

在不构建目标的情况下,向目标显示先决条件的更简单方法可能是同时使用
-p
选项(如建议的)和
-q
选项,如上所示(选项的长名称为
--打印数据库
):

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

如果使用多个makefile,可以使用
-f
选项指定所有makefile:

make -f makefile-1 -f makefile-2 -qp

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

您想在不构建目标的情况下仅获取其先决条件吗?@EtanReisner是的,完全正确。我知道这有点奇怪。也许我需要更详细地描述我的实际问题,但经验告诉我,由于问题是“基于意见”的,所以很容易导致问题结案。你需要在“内部制造”中这样做吗?您需要为任意生成文件执行此操作吗?
make-p
是否出于某种原因而不做你想做的事(或者至少不给你想要的信息)?“我认为你需要更清楚地知道你在这里到底想做什么,你的目标是什么。”埃坦雷斯纳我没有想清楚。我可能需要的是
make-qp | grep'^all:'
来获取目标
all
及其先决条件的行。链接问题的答案中提到了
-p
选项;我应该删除我的问题吗?要么删除这个问题,要么将其作为一个答案写下来(相信另一个答案),并接受它。你想在不建立目标的情况下,只获得它的先决条件吗?@EtanReisner是的,没错。我知道这有点奇怪。也许我需要更详细地描述我的实际问题,但经验告诉我,由于问题是“基于意见”的,所以很容易导致问题结案。你需要在“内部制造”中这样做吗?您需要为任意生成文件执行此操作吗?
make-p
是否出于某种原因而不做你想做的事(或者至少不给你想要的信息)?“我认为你需要更清楚地知道你在这里到底想做什么,你的目标是什么。”埃坦雷斯纳我没有想清楚。我可能需要的是
make-qp | grep'^all:'
来获取目标
all
及其先决条件的行。链接问题的答案中提到了
-p
选项;我应该删除我的问题吗?要么删除,要么把它写下来作为答案(把另一个答案记下来),然后接受它。