获取规则依赖项的Makefile技巧

获取规则依赖项的Makefile技巧,makefile,gnu-make,Makefile,Gnu Make,GNU Makefiles中有什么技巧可以获取规则的所有依赖项吗 例如: rule1: dep1_1 dep1_2 dep1_3 rule2: dep2_1 dep2_2 rule1 dump_deps: echo "Dependencies of rule1: $(call do_the_trick, $(rule1))" echo "Dependencies of rule2: $(call do_the_trick, $(rule2))" install: $

GNU Makefiles中有什么技巧可以获取规则的所有依赖项吗

例如:

rule1:  dep1_1 dep1_2 dep1_3

rule2:  dep2_1 dep2_2 rule1

dump_deps:
    echo "Dependencies of rule1: $(call do_the_trick, $(rule1))"
    echo "Dependencies of rule2: $(call do_the_trick, $(rule2))"

install:   $(prefix install-,$(call do_the_trick, $(rule1)))
我希望能够调用
make dump\u deps
并查看:

dep1_1 dep1_2 dep1_3
dep2_1 dep2_2 dep1_1 dep1_2 dep1_3
或者使用
makeinstall
等自动安装依赖项

可能吗


编辑:


我更改了示例以更好地显示我想要自动的东西,而不必自己硬编码依赖项列表。

这应该列出所有依赖项:

DEPEND = dep1 dep2 dep3

.PHONY: $(DEPEND)

dump_deps: $(DEPEND)
     @printf "%s\n" $^

你应该根据自己的需要删除带有.false目标的行。它是为了示例而使用的。请注意,在行首和printf之间有一个选项卡。

使用make实用程序$^提供的内置变量--这表示规则的所有依赖项

通过查看您的代码,我确实将rule1制作成了一个变量/宏形式,以满足我的目的

rule1 := dep1 dep2 dep3
您不能显示可传递的依赖项,只能显示直接的依赖项,然而,您可以获取下面生成的输出并将其输入到程序(的一部分)中,以理解这些可传递的关系

编辑:我想你也可以用其他方式对结果进行后期处理,只列出DEP,但我认为漂亮的图片更好;如果你不同意,请随意否决;)

下面是一个示例makefile(c&p时请注意缺少的选项卡!):

它将列出你们的所有先决条件,并以“目标:先决条件”的方式进行。样本输出:

正常运行:

cc -o main.o -c  main.c
cc -o stuff.o -c  stuff.c
cc -o yeah.o -c  yeah.c
cc -o hello  main.o stuff.o yeah.o
使用
make-B DUMP_DEPS=1

main.o: main.c
stuff.o: stuff.c
yeah.o: yeah.c
hello: main.o stuff.o yeah.o
digraph dependencies {
    "main.o" -> "main.c";
    "stuff.o" -> "stuff.c";
    "yeah.o" -> "yeah.c";
    "hello" -> "main.o";
    "hello" -> "stuff.o";
    "hello" -> "yeah.o";
}
使用
make-B DUMP\u DEPS=1 DUMP\u DOT=1

main.o: main.c
stuff.o: stuff.c
yeah.o: yeah.c
hello: main.o stuff.o yeah.o
digraph dependencies {
    "main.o" -> "main.c";
    "stuff.o" -> "stuff.c";
    "yeah.o" -> "yeah.c";
    "hello" -> "main.o";
    "hello" -> "stuff.o";
    "hello" -> "yeah.o";
}
然后,您可以运行以下操作将漂亮的图片输出到SVG图像:

make -B DUMP_DEPS=1 DUMP_DOT=1 | dot -Tsvg > deps.svg
下面是它的外观(这实际上是一个png,由
-Tpng>deps.png
生成):


我认为这需要一些额外的工作才能在所有情况下产生准确的结果,但原则是合理的(例如,如果您使用gcc生成的依赖项文件,则需要首先创建它们)。

在您的示例中,我将依赖项放在
dump\u deps
本身中,而不是放在任何我可能想要转储的任意规则中。这不是我需要的。谢谢。只有在运行规则时才能访问。我看不到它之外的依赖项(如果我试图列出要安装的依赖程序包,如我的示例中所示,则不起作用)。