Makefile中的子目录与依赖关系

编程语言 2026-07-09

我有一个项目,目录是 theme-d-intrtheme-d-intr/basetheme-d-intr/dbus。文件 theme-d-intr/Makefile.am 仅由第 SUBDIRS = base dbus 行组成。某些在 dbus 的文件依赖于在构建过程中生成到 base 的文件。如果我对代码进行并行构建,是否有可能在必要的文件尚未构建完毕时,dbus 的文件先于 base 的文件被构建?ChatGPT声称确实如此,并给出以下修复方法:

将以下几行添加到 base/Makefile.am

BASE_OUTPUTS = \
  $(nodist_gintrlib_DATA) \
  $(nodist_linkedlib_DATA)

base.stamp: $(BASE_OUTPUTS)
    @touch $@

以及将以下行添加到 dbus/Makefile.am

dbus_DEPENDENCIES = ../base/base.stamp

base/Makefile.am 中的变量 nodist_gintrlib_DATAnodist_linkedlib_DATA 保存要安装的生成文件。

解决方案

由autotools生成的文件 theme-d-intr/Makefile 包含用于处理递归目标的以下代码:

$(am__recursive_targets):
    @fail=; \
    if $(am__make_keepgoing); then \
      failcom='fail=yes'; \
    else \
      failcom='exit 1'; \
    fi; \
    dot_seen=no; \
    target=`echo $@ | sed s/-recursive//`; \
    case "$@" in \
      distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
      *) list='$(SUBDIRS)' ;; \
    esac; \
    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) 会对 SUBDIRS 的所有内容按顺序执行。因此,base 的内容在构建 dbus 之前就已经被构建。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章