gpt4 book ai didi

makefile - 其中目标全递归在 makefile 中给出

转载 作者:行者123 更新时间:2023-12-02 14:31:00 25 4
gpt4 key购买 nike

在 makefile 中,我得到了所有目标及其依赖项全递归。 我搜索整个文件,但无法定义全递归。我认为全递归也必须是一个目标,否则下一步该怎么做?所以有人可以告诉我如何处理这个问题,我将非常感谢你的帮助。

all: $(BUILT_SOURCES)
$(MAKE) $(AM_MAKEFLAGS) all-recursive

我无法得到“全递归”的定义。如果我删除它,make程序将继续处理所有目标。那是“全递归”内置的吗?

最佳答案

我也花了好几个小时才找到它们。不,它不是 make 的内置功能;原来这是Autotools生成的Makefile的一个特性。

那些 THING-recursive 目标实际上是在 Makefile 中定义的,但是以一种复杂的方式定义,您无法使用简单的 grep 来找到它们。

它从 Makefile 中的 RECURSIVE_TARGETS 变量定义开始,如下所示:

RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
html-recursive info-recursive install-data-recursive \
install-dvi-recursive install-exec-recursive \
install-html-recursive install-info-recursive \
install-pdf-recursive install-ps-recursive install-recursive \
installcheck-recursive installdirs-recursive pdf-recursive \
ps-recursive uninstall-recursive

下面是这些目标的真正定义:

$(RECURSIVE_TARGETS):
@fail= failcom='exit 1'; \
for f in x $$MAKEFLAGS; do \
case $$f in \
*=* | --[!k]*);; \
*k*) failcom='fail=yes';; \
esac; \
done; \
dot_seen=no; \
target=`echo $@ | sed s/-recursive//`; \
list='$(SUBDIRS)'; for subdir in $$list; do \
echo "Making $$target in $$subdir"; \
if test "$$subdir" = "."; then \
dot_seen=yes; \
local_target="$$target-am"; \
else \
local_target="$$target"; \
fi; \
($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
|| eval $$failcom; \
done; \
if test "$$dot_seen" = "no"; then \
$(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
fi; test -z "$$fail"

这解决了这个问题:

all-recursive check-recursive dvi-recursive \
html-recursive info-recursive install-data-recursive \
install-dvi-recursive install-exec-recursive \
install-html-recursive install-info-recursive \
install-pdf-recursive install-ps-recursive install-recursive \
installcheck-recursive installdirs-recursive pdf-recursive \
ps-recursive uninstall-recursive:
@fail= failcom='exit 1'; \
for f in x $$MAKEFLAGS; do \
case $$f in \
*=* | --[!k]*);; \
*k*) failcom='fail=yes';; \
esac; \
done; \
dot_seen=no; \
target=`echo $@ | sed s/-recursive//`; \
list='$(SUBDIRS)'; for subdir in $$list; do \
echo "Making $$target in $$subdir"; \
if test "$$subdir" = "."; then \
dot_seen=yes; \
local_target="$$target-am"; \
else \
local_target="$$target"; \
fi; \
($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
|| eval $$failcom; \
done; \
if test "$$dot_seen" = "no"; then \
$(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
fi; test -z "$$fail"

这个目标的配方本质上是一个样板代码,用于循环遍历当前文件夹中找到的每个子目录并在其中启动make,使用相同的目标名称,但删除了“-recursive”。

请注意,这些THING-recursive目标并不意味着由用户直接调用;它将作为正常 THING 目标的一部分自动运行(不带“-recursive”),作为触发子项目树中相同目标构建的机制。

附录:示例代码取自配置的根Makefile GNU Flash Player (版本e9eb84e)。

关于makefile - 其中目标全递归在 makefile 中给出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17172659/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com