autoconf 是 GNU 构建系统中的一个重要工具,用于生成可移植的 shell 脚本(configure 脚本),这些脚本可以自动配置软件源代码以适应各种类 UNIX 系统。以下是 autoconf 的完整配置过程:
准备 configure.ac 文件
m4
AC_INIT([package-name], [version], [bug-report-address])
AM_INIT_AUTOMAKE
AC_PROG_CC
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_FILES([Makefile])
AC_OUTPUT
运行 autoscan(可选)
autoscan
mv configure.scan configure.ac
编辑 configure.ac
AC_CHECK_LIB
- 检查库是否存在AC_CHECK_HEADERS
- 检查头文件AC_PATH_PROG
- 检查程序路径运行 aclocal
aclocal
运行 autoconf
autoconf
创建 Makefile.am
makefile
bin_PROGRAMS = hello
hello_SOURCES = hello.c
运行 automake
automake --add-missing
最终生成 configure 脚本
./configure
make
make install
自定义检查
m4
AC_MSG_CHECKING([for something special])
# 执行检查代码
AC_MSG_RESULT([yes/no])
条件编译
AM_CONDITIONAL
设置条件:
m4
AC_CHECK_HEADER([some_header.h], [has_header=yes], [has_header=no])
AM_CONDITIONAL([HAVE_SOME_HEADER], [test "x$has_header" = "xyes"])
生成头文件
AC_CONFIG_HEADERS
生成 config.h:
m4
AC_CONFIG_HEADERS([config.h])
处理子目录
m4
AC_CONFIG_FILES([Makefile subdir/Makefile])
"possibly undefined macro" 错误
aclocal
时缺少宏定义bash
aclocal -I /path/to/macro/dir
缺少 install-sh 或其他辅助文件
automake --add-missing
自动添加库或头文件检查失败
CPPFLAGS
和 LDFLAGS
m4
AC_CHECK_LIB([m], [sqrt], [],
[AC_MSG_ERROR([math library not found])])
AC_ARG_WITH
和 AC_ARG_ENABLE
添加用户配置选项通过以上步骤,您可以创建一个可移植的自动配置系统,使您的软件能够在各种 UNIX-like 系统上编译安装。