其中目标all-recursive在makefile中给出

zho*_*uxy 13 makefile

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

all: $(BUILT_SOURCES)
    $(MAKE) $(AM_MAKEFLAGS) all-recursive
Run Code Online (Sandbox Code Playgroud)

我不能得到"全递归"的定义.如果我删除它,make程序将继续处理所有目标.内置的是"全递归"吗?

小智 14

我花了好几个小时找到它们.不,它不是内置功能make; 事实证明,这是Autotools生成的Makefile的一个特征.

这些THING-recursive目标实际上是在Makefile中定义的,但是以复杂的方式使用simple grep来查找它们.

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

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
Run Code Online (Sandbox Code Playgroud)

接下来是以下某些目标的真实定义:

$(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"
Run Code Online (Sandbox Code Playgroud)

哪个解决了这个问题:

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"
Run Code Online (Sandbox Code Playgroud)

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

请注意,这些THING-recursive目标不应由用户直接调用; 它将作为正常THING目标的一部分自动运行(没有"-recursive"),作为在子项目树中触发相同目标构建的机制.

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


cow*_*cow 2

查看目标 $(RECURSIVE_TARGETS) 中是否包含定义它