集成非Automake外部库时执行make distclean失败的问题求解
Automake集成非Autotools外部依赖的distclean问题解决方案
方案1:使用Automake本地Hook(最推荐)
如果外部依赖不需要参与Automake的默认递归规则,直接通过本地Hook定义构建、安装、清理逻辑即可,完全避免SUBDIRS的递归检查问题:
- 在主
Makefile.am中删除SUBDIRS里的外部依赖目录条目,新增以下规则:
# 构建触发规则 all-local: $(MAKE) -C $(srcdir)/extern/your_lib_name all # 安装触发规则 install-local: $(MAKE) -C $(srcdir)/extern/your_lib_name install PREFIX=$(prefix) # 清理触发规则 clean-local: $(MAKE) -C $(srcdir)/extern/your_lib_name clean
- 如果需要将外部依赖打包进发布包,额外添加
EXTRA_DIST = extern/your_lib_name到主Makefile.am即可。 - 所有规则统一使用
$(srcdir)引用源码路径,天然兼容独立构建(VPATH)场景,不会出现构建目录找不到路径的问题。
方案2:为外部依赖补充最小Makefile.am
如果需要保留SUBDIRS的递归逻辑,给每个外部依赖目录添加一个极简的Makefile.am,Automake会自动处理构建目录的Makefile生成:
# 外部依赖目录下的Makefile.am # 调用原生Makefile的构建逻辑 all: $(MAKE) -C $(srcdir) -f 原生Makefile文件名 all install: $(MAKE) -C $(srcdir) -f 原生Makefile文件名 install PREFIX=$(prefix) clean: if test -d $(srcdir); then \ $(MAKE) -C $(srcdir) -f 原生Makefile文件名 clean; \ fi distclean: rm -f Makefile
- 在
configure.ac的AC_CONFIG_FILES中添加对应子目录的Makefile条目,configure运行时会自动在构建目录生成对应的Makefile,不会出现distclean时找不到目录/文件的报错。
方案3:Configure自动生成临时Makefile
如果不想修改源码树的目录结构,可以在configure.ac中通过AC_CONFIG_COMMANDS动态生成构建目录下的最小Makefile:
# 替换为你的外部依赖目录路径 AC_CONFIG_COMMANDS([extern/your_lib_name/Makefile], [ mkdir -p `dirname $0` cat > $0 << 'EOF' all: @cd $(srcdir)/extern/your_lib_name && $(MAKE) clean: @cd $(srcdir)/extern/your_lib_name && $(MAKE) clean distclean: rm -f $0 EOF ])
- 该方案完全不需要修改源码树的内容,所有逻辑由Autoconf原生处理,符合Autotools规范。
内容的提问来源于stack exchange,提问作者Giuse
相关产品推荐
相关产品推荐

