如何将autotools生成的产物放置在源码树之外
可用搜索关键词
你可以用以下关键词搜索到更多官方文档和实践说明:
- Autotools 离源构建(out-of-source build)
- Autotools VPATH 构建
- Autotools maintainer-clean 规则
- Autotools 独立构建目录配置
实现步骤(无需手动复制配置文件)
Autotools 原生支持完全不在源码目录写入任何文件的构建方式,不需要你自己做配置文件复制这类hack操作,按以下流程执行即可:
前置要求
你的项目源码根目录已存在规范的Autotools配置文件:configure.ac(项目配置)、Makefile.am(构建规则配置),这两个文件是唯一需要存放在源码目录、纳入版本管理的Autotools相关文件。
步骤1:维护者侧生成分发配置(仅在源码目录执行1次)
如果你是项目维护者,首次生成可分发的配置脚本只需在源码根目录执行:autoreconf --install
该命令会自动生成configure、Makefile.in、aclocal.m4等临时分发文件,你可以将这些生成的文件直接加入.gitignore(或对应版本管理工具的忽略列表),避免被误提交到代码库。
如果需要完全清空源码目录下所有Autotools生成的临时文件,执行:make maintainer-clean
执行后源码目录会回到只有你手动编写的配置文件和业务代码的纯净状态。
步骤2:完全离源构建(全程不修改源码目录)
普通用户或者开发过程中的构建操作完全可以脱离源码目录执行:
- 任意位置新建独立构建目录并进入:
mkdir -p ~/build/my-project-build cd ~/build/my-project-build
- 直接调用源码目录下的configure脚本,无需复制任何文件到构建目录:
/path/to/your/project/source/configure
Autotools 内置的VPATH机制会自动处理路径映射,所有生成的Makefile、中间产物、最终二进制文件都会存在当前构建目录下,不会对源码目录做任何写入。
3. 正常执行构建、安装、清理操作:
# 构建 make # 安装到系统 sudo make install # 清理构建产物不需要动源码目录,直接删整个构建目录即可 # rm -rf ~/build/my-project-build
开发场景优化
如果开发过程中需要频繁修改configure.ac或Makefile.am,可以在执行configure时开启维护者模式:/path/to/source/configure --enable-maintainer-mode
开启后修改配置文件后,直接在构建目录执行make就会自动重新生成对应的配置规则,不需要重新跑autoreconf,同时源码目录只会生成必要的临时配置文件,不需要的时候执行make maintainer-clean即可完全清除。
内容的提问来源于stack exchange,提问作者Tim Kolar

