configure.ac介绍
configure.ac 介绍
configure.ac 是 Autotools 的配置入口文件。
它的作用是:在不同机器上探测编译环境,并生成可用的 configure 脚本与 Makefile。
可以把它理解成“构建前的环境协商脚本”。
参考:
- https://www.gnu.org/software/autoconf/manual/autoconf.html
- https://www.gnu.org/software/automake/manual/html_node/index.html
1. configure.ac 到底负责什么
核心职责有 4 个:
- 定义项目元信息(名字、版本、最低工具版本)。
- 检测工具链、头文件、库、函数是否可用。
- 定义条件编译和可替换变量。
- 生成目标文件(
config.h、各目录Makefile、其他.in模板)。
2. 常见宏分组(按用途记忆)
2.1. 项目初始化
1 | AC_PREREQ([2.69]) |
说明:
AC_PREREQ:要求最低 autoconf 版本。AC_CONFIG_SRCDIR:确保在正确源码目录运行configure。AC_CONFIG_AUX_DIR:指定辅助脚本目录(install-sh、depcomp等)。
2.2. Automake 初始化
1 | AM_INIT_AUTOMAKE([foreign subdir-objects -Wall]) |
常见选项:
foreign:放宽 GNU 严格打包规范要求。subdir-objects:对象文件按子目录组织。-Wall/-Werror:启用警告或将警告视为错误。
2.3. 编译器与工具检测
1 | AC_PROG_CC |
另外可用:
1 | AC_CHECK_PROGS([PYTHON3], [python3 python], [:]) |
2.4. 头文件与库检查
1 | AC_CHECK_HEADERS([stdio.h stdlib.h unistd.h]) |
2.5. 定义变量与宏
1 | AC_DEFINE([ENABLE_TRACE], [1], [Enable trace logs]) |
说明:
AC_DEFINE:写入config.h。AC_SUBST:导出到Makefile(用于@VAR@替换)。
2.6. 输出目标
1 | AC_CONFIG_HEADERS([config.h]) |
3. 一个可直接使用的 configure.ac 模板
1 | AC_PREREQ([2.69]) |
4. 参数开关(AC_ARG_ENABLE / AC_ARG_WITH)
4.1. --enable-xxx
用于布尔开关:
1 | AC_ARG_ENABLE([debug], |
4.2. --with-xxx=PATH
用于路径或外部组件位置:
1 | AC_ARG_WITH([sdk-dir], |
5. 与 Makefile.am 如何联动
configure.ac里AC_CONFIG_FILES([src/Makefile])。src/Makefile.am写编译/安装规则。- 执行后由
src/Makefile.in生成src/Makefile。
流程命令:
1 | autoreconf -fi |
6. .in 模板机制
任何 .in 文件都可以被 configure 替换占位符:
1 |
|
前提是变量来自:
- autoconf 内置变量(如
@prefix@)。 - 你通过
AC_SUBST导出的变量。
7. 常见坑
AC_CONFIG_SRCDIR指向了错误文件,导致在子目录运行时报错。- 只写了
AC_SUBST,忘了在Makefile.am/模板里使用。 AC_CHECK_LIB检查通过,但漏加实际链接参数(如*_LDADD)。- 加了
AC_DEFINE却忘记AC_CONFIG_HEADERS([config.h])。 - 条件编译只写了
AC_ARG_ENABLE,忘了AM_CONDITIONAL。
8. 我的建议
configure.ac聚焦“环境检测与开关定义”,不要塞业务脚本逻辑。- 检测失败就尽早
AC_MSG_ERROR,不要把错误拖到编译阶段。 - 每加一个新依赖,都补一条“检测 + 错误提示 + 链接使用”的闭环。
把这三点做扎实,configure.ac 会非常稳定,也更容易被团队维护。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 因受!
评论