Makefile中的子目录与依赖关系
我有一个项目,目录是 theme-d-intr、theme-d-intr/base 和 theme-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_DATA 和 nodist_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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。