Automake条件构建子目录时autoreconf报目录不存在错误如何解决
问题原因
automake 处理 Makefile.am 的时机早于 configure 运行阶段,此时 @SUBDIR_TO_BUILD@ 还没有被替换为实际的目录名,automake 会把 $(SUBDIR_TO_BUILD) 当做字面目录名去校验存在性,自然找不到这个名称的目录,因此抛出错误。
解决方案
有两种常用的方案可以解决这个问题:
方案1:使用 Automake 条件判断(推荐,兼容性更好)
不需要通过 AC_SUBST 传递变量,改用 Automake 原生的条件分支来指定SUBDIRS:
- 修改
configure.ac代码:
# 替换原有的SUBDIR_TO_BUILD判断和AC_SUBST逻辑 AM_CONDITIONAL([BUILD_DIR1], [test test_condition_1]) AM_CONDITIONAL([BUILD_DIR2], [test test_condition_2]) # 剩余情况默认构建dir3
- 修改
Makefile.am代码:
if BUILD_DIR1 SUBDIRS = dir1 elif BUILD_DIR2 SUBDIRS = dir2 else SUBDIRS = dir3 endif # 保留DIST_SUBDIRS确保make dist时打包所有子目录 DIST_SUBDIRS = dir1 dir2 dir3
这种方案不需要修改automake的检查参数,完全符合Automake的静态校验规则,不会产生警告或错误。
方案2:保留AC_SUBST逻辑,增加EXTRA_SUBDIRS声明
如果你需要继续使用原有的AC_SUBST实现方式,只需要在Makefile.am中声明所有可能的子目录到EXTRA_SUBDIRS变量,告知automake这些都是合法的子目录,不需要校验动态变量的目录存在性:
SUBDIR_TO_BUILD = @SUBDIR_TO_BUILD@ SUBDIRS = $(SUBDIR_TO_BUILD) # 新增这一行,列出所有可能构建的子目录 EXTRA_SUBDIRS = dir1 dir2 dir3 DIST_SUBDIRS = dir1 dir2 dir3
修改后重新运行autoreconf即可正常通过校验。
内容的提问来源于stack exchange,提问作者Giuse
相关产品推荐
相关产品推荐

