Autoconf

定义

Autoconf是一个自动化构建的CLI工具,用于生成可移植的configure脚本。configure脚本会完成以下事情:

  • 根据configure.ac文件定义的规则,运行时自动检查系统环境:操作系统、编译器、库、函数、头文件、字节序、路径等
  • 根据检测结果及用户输入生成Makefile (通常需要一个Makefile.in 模板,由automake工具提供)
1
2
3
4
5
6
7
8
9
源码目录
├── configure.ac
├── Makefile.am

├─> automake 生成 Makefile.in
├─> autoconf 生成 configure

./configure 生成 Makefile(结合 Makefile.in + 系统检测结果)
└─> make 编译安装

AutoConf有以下特性:

  • 跨平台性强:自动适配不同 Unix/Linux 系统
  • 减少手动维护:不需要为每个平台写单独 Makefile
  • 检测粒度高:检查函数、库、头文件甚至类型大小

其实其他自动化构建工具,比如CMake也有这些特性,只不过一些老软件开发的时候并没有CMake,所以用这些比较老的构建工具

configure用法

configure是autoconf工具链中最重要的一个脚本,它除了完成环境的检测,还可以由用户指定一些编译参数。下面介绍它的用法

安装目录相关参数

参数 作用
--prefix=PREFIX 设置软件安装根目录(默认 /usr/local) 最终可执行文件、库、头文件等都在这个目录下。
--bindir=DIR 可执行文件安装目录(默认 $prefix/bin
--libdir=DIR 库文件安装目录(默认 $prefix/lib$prefix/lib64
--includedir=DIR 头文件安装目录(默认 $prefix/include
--datadir=DIR 数据文件安装目录(默认 $prefix/share
--sysconfdir=DIR 配置文件目录(默认 $prefix/etc

例子:

1
./configure --prefix=/opt/myapp

会把软件安装到 /opt/myapp/bin/opt/myapp/lib 等。

功能启用/禁用参数

很多开源软件在 configure.ac 里会定义开关宏,允许用户选择启用或禁用功能。常见形式:

参数 说明
--enable-FEATURE 启用某功能
--disable-FEATURE 禁用某功能
--with-PACKAGE 使用某个库或依赖(自动检测)
--without-PACKAGE 不使用某个库或依赖

例子:

1
2
./configure --enable-shared --disable-static
./configure --with-openssl=/usr/local/openssl
  • 第一行启用动态库生成,禁用静态库。
  • 第二行指定 OpenSSL 安装路径。

编译器和编译选项

参数/环境变量 说明
CC 指定 C 编译器,例如 CC=gcc-12
CXX 指定 C++ 编译器
CFLAGS C 编译器选项,如优化、调试标志 -O2 -g
CXXFLAGS C++ 编译器选项
LDFLAGS 链接器选项,如库路径 -L/usr/local/lib
CPPFLAGS 预处理器选项,如头文件路径 -I/usr/local/include

例子:

1
CC=clang CFLAGS="-O2 -g" ./configure --prefix=/opt/myapp
  • 使用 clang 编译器
  • 设置优化和调试选项
  • 安装到 /opt/myapp

帮助和调试选项

参数 说明
--help 显示所有可用选项和说明
--version 显示软件版本
--cache-file=FILE 使用缓存文件减少重复检测(默认 config.cache
--quiet / --silent 安静模式,减少输出信息

例子:

1
./configure --help

通常会列出所有 --prefix--enable--with 选项