在一个makefile中,我得到了目标all和它的依赖性全递归。 我搜索整个文件,但我不能得到所有的递归定义。我认为所有递归必须也是一个目标,或者下一步该怎么做?所以有人可以告诉我如何处理这个问题,我将非常感谢你的帮助。
all: $(BUILT_SOURCES)
$(MAKE) $(AM_MAKEFLAGS) all-recursive
我无法得到“全递归”的定义。 如果我删除它,make程序将继续处理所有目标。内置的是“全递归”吗?
答案 0 :(得分:8)
我花了好几个小时找到它们。不,它不是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
,使用相同的目标名称,但使用" - 递归"剥离了。
请注意,这些THING-recursive
目标不应由用户直接调用;它将作为普通THING
目标的一部分自动运行(没有" -recursive"),作为在子项目中触发相同目标构建的机制'树。
附录:示例代码取自GNU Flash Player(版本e9eb84e)的已配置根Makefile。
答案 1 :(得分:1)
查看它是否在目标$(RECURSIVE_TARGETS)
中包含了