Autotools是GNU构建系统的重要组成部分,包括autoconf、automake和libtool等工具,用于实现跨平台的软件构建。以下是一些关键配置技巧:
初始化项目结构
mkdir -p src include m4
touch NEWS README AUTHORS ChangeLog
创建configure.ac
AC_INIT([项目名], [版本号], [bug报告邮箱])
AM_INIT_AUTOMAKE([-Wall -Werror foreign])
AC_PROG_CC
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_FILES([Makefile])
AC_OUTPUT
创建Makefile.am
bin_PROGRAMS = 可执行文件名
可执行文件名_SOURCES = src/main.c src/foo.c include/foo.h
# 在configure.ac中添加
AC_ARG_ENABLE([feature],
[AS_HELP_STRING([--enable-feature], [启用特定功能])],
[enable_feature=$enableval],
[enable_feature=no])
AM_CONDITIONAL([ENABLE_FEATURE], [test "x$enable_feature" = xyes])
# 在Makefile.am中使用
if ENABLE_FEATURE
bin_PROGRAMS += feature_tool
feature_tool_SOURCES = src/feature.c
endif
# 检测pkg-config管理的库
PKG_CHECK_MODULES([LIBFOO], [libfoo >= 1.0])
# 传统库检测
AC_CHECK_LIB([m], [sqrt])
AC_CHECK_HEADERS([math.h])
# 添加自定义编译器标志
AX_CHECK_COMPILE_FLAG([-Wall], [AM_CFLAGS="$AM_CFLAGS -Wall"])
AC_SUBST([AM_CFLAGS])
# 顶层Makefile.am
SUBDIRS = src lib tests doc
# src/Makefile.am
bin_PROGRAMS = myapp
myapp_SOURCES = main.c
myapp_LDADD = ../lib/libmylib.la
# lib/Makefile.am
lib_LTLIBRARIES = libmylib.la
libmylib_la_SOURCES = foo.c bar.c
# 从git获取版本信息
m4_define([VERSION_NUMBER], m4_esyscmd([git describe --always --dirty | tr -d '\n']))
AC_INIT([myapp], VERSION_NUMBER, [bug@example.com])
使用autoreconf简化流程
autoreconf -fvi
创建autogen.sh脚本
#!/bin/sh
aclocal
autoheader
automake --add-missing --copy
autoconf
处理跨平台问题
case $host in
*-mingw*)
AM_CONDITIONAL([WINDOWS], true)
;;
*)
AM_CONDITIONAL([WINDOWS], false)
;;
esac
添加自定义宏
AC_CONFIG_MACRO_DIR([m4])
调试configure脚本
./configure --help # 查看所有选项
./config.status --config # 查看当前配置
./configure -v # 详细输出
"missing 'AC_CONFIG_MACRO_DIR'"警告
AC_CONFIG_MACRO_DIR([m4])
"required file 'config.sub' not found"
automake --add-missing --copy
自定义规则问题
EXTRA_DIST
包含非标准文件版本兼容性问题
AC_PREREQ([2.69])
AM_INIT_AUTOMAKE([1.15])
通过合理配置Autotools,可以创建高度可移植的构建系统,适应各种Unix-like环境。