GNU Makefile中是否有任何技巧可以获取规则的所有依赖项?
示例:
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_deps
并查看:
dep1_1 dep1_2 dep1_3
dep2_1 dep2_2 dep1_1 dep1_2 dep1_3
或者使用make install
等自动安装依赖项。
有可能吗?
编辑:
我改变了示例以更好地表明我想要自动化的东西,而不必自己对依赖项列表进行硬编码。
答案 0 :(得分:2)
您无法显示传递依赖关系,只能显示传递依赖关系,但可以获取下面生成的输出并将其输入程序{{ 3}}(dot
的一部分)来理解这些传递关系。
编辑:我想您也可以通过其他方式对结果进行后期处理,只列出deps,但我认为漂亮的图片更好;如果你不同意,请随意投票;)
这是一个示例makefile(在c& p!时注意缺少标签):
# Makefile that demonstrates how to dump dependencies.
# The macros we use for compiling stuff.
CC_OBJ=$(CC) -o $@ -c $(CFLAGS) $<
CC_BIN=$(CC) -o $@ $(CFLAGS) $(LDFLAGS) $^
# If we get "DUMP_DEPS=1 DUMP_DOT=1" on the command line, then instead of
# make-style dependencies, we'll output 'dot' syntax.
# Note: normally, DUMP_DOT_TAIL is undefined, so it doesn't generate any noise.
ifeq ($(DUMP_DOT),1)
DUMP_DOT_HEAD=digraph dependencies {
DUMP_DOT_TAIL=@echo "}"
$(info $(DUMP_DOT_HEAD))
list_dep=@for f in $^; do echo " \"$@\" -> \"$$f\";"; done
else
list_dep=@echo "$@: $^"
endif
# If we get "DUMP_DEPS=1" on the command line, then
# instead of building the code, just print the dependencies.
ifeq ($(DUMP_DEPS),1)
CC_OBJ=$(list_dep)
CC_BIN=$(list_dep)
endif
# An implicit rule that builds *.c -> *.o.
%.o:%.c
$(CC_OBJ)
# Variables for stuff we wanna build.
target=hello
objects=main.o
objects+=stuff.o
objects+=yeah.o
# The top-level 'all' target.
.PHONY: all
all: $(target)
$(DUMP_DOT_TAIL)
# Builds our final executable
$(target): $(objects)
$(CC_BIN)
# A standard clean target.
.PHONY: clean
clean:
-rm -f $(target) $(objects)
现在,你可以这样做:
make -B DUMP_DEPS=1
它会通过并列出你所有的先决条件是制作&#34; target:pre-requisite&#34;的样式。样本输出:
正常运行:
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
使用make -B DUMP_DEPS=1 DUMP_DOT=1
:
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
这就是它的样子(这实际上是一个用-Tpng > deps.png
生成的png):
我认为这需要一些额外的工作来在所有情况下产生准确的结果,但原则是合理的(例如,如果你使用gcc生成的依赖文件,你需要先创建它们。)
答案 1 :(得分:0)
这应列出所有依赖项:
DEPEND = dep1 dep2 dep3
.PHONY: $(DEPEND)
dump_deps: $(DEPEND)
@printf "%s\n" $^
您应该根据需要删除.PHONY目标行。它用于示例。请注意,行的开头和printf之间有一个标签。
答案 2 :(得分:0)
在make实用程序可用的变量中使用buit,$ ^ - 这表示规则的所有依赖项。
还通过你的代码查看,我确实将rule1变成了一个变量/宏形式以满足我的目的......
rule1 := dep1 dep2 dep3