autotools使用
基本流程
基本流程为:
- 使用autoscan生成configure.scan文件,然后重命名为configure.ac
configure.ac里面包含一些自动检查的内容 - 执行aclocal,configure.ac中的宏实际上是m4宏的一个封装,这条命令将会吧ac宏解析成m4宏
- 执行autoconf, 它会生成configure脚本
- 执行autoheader,它会根据configure.ac中的内容生成一些预定义信息
- Makefile.am中包含了程序编译链接信息,也就是makefile的主体内容,执行automake会生成Makefile的前置文件
- 执行./configure会生成Makefile文件
configure是检查系统设置,库函数是否满足等运行环境判断,Makefile.am则是真正的进行编译
configure.ac
首先介绍m4,m4是一个宏处理器,它会扫描文本,如果遇到宏则将其展开。
我们可以简单的认为他将shell脚本套上了一层函数的壳,例如:
// 检测是否安装foo程序的shell |
然后在configure.ac中使用include(check-foo.m4)
,再运行m4 configure.ac
就可以在生成文件中得到这个宏的展开结果
而autoconf其实是给m4套上了一层外壳,例如:
将check-foo.m4中文件内容修改为 |
然后将configure.ac中的内容修改为:AC_INIT
CHECK_FOO
运行下面命令aclocal -I m4 // check-foo.m4在m4目录中
autoconf
./configure
如果系统中没有foo则会提示which: no foo in (/bin:/usr/bin:/usr/local/bin)
You should install foo!
也就是说autoconf时自动将CHECK_FOO宏展开,而aclocal则是在本地文件中扫描是否有configure.ac中定义的宏
常用的autoconf宏
宏名 | 格式 | 说明 | |||
---|---|---|---|---|---|
AC_PREREQ | (version) | 确定autoconf版本,它是在AC_INIT前唯一使用的宏 | |||
AC_INIT | (package,version,[bug-report],[tarname],[url]) | 默认生成的文件打包名为: tarname-version.tar.gz | |||
AC_SUBST | AC_SUBST(GLIB2_CFLAGS) | 输出能被Makefile.am使用的变量 | |||
AC_ARG_ENABLE | AC_ARG_ENABLE([gstaudio],AS_HELP_STRING([—enable-gstaudio=@:@yes/auto/no@:@], [Enable the GStreamer 1.0 audio backend @:@default=auto@:@]),[],[enable_gstaudio=”auto”]) | 为configure添加—XX选项 | |||
AC_CHECK_HEADERS | AC_CHECK_HEADERS(head_path1 head_path2…) | 检测是否存在头文件 | |||
AC_CONFIG_SRCDIR | (unique-file-in-source-dir) | 检测源码是否存在,保证项目目录是正确的目录 | |||
AC_CONFIG_AUXDIR | 指定辅助脚本文件目录 | ||||
AC_CONFIG_HEADERS | ([config.h]) | 用于实例化config.h头文件 | |||
AC_CONFIG_FILES | (filename) | 指定输出的文件,如AC_CONFIG_FILE(Makefile) ,他会根据Makefile.in生成Makefile文件 |
|||
AC_PROG_CC | 自动检测gcc | ||||
AC_PROG_LIBTOOLS | 自动检测libtools | ||||
AC_CHECK_FUNCS | AC_CHECK_FUNCS([func1 func2 func3]) | 检测对应函数是否可用 | |||
AC_SEARCH_LIBS | AC_SEARCH_LIBS (function, search-libs, [action-if-found], [action-if-not-found], [other-libraries]) | 在search-libs中检测function是否存在 | |||
AC_OUTPUT | 用于创建configure.status,他用来创建Makefile, 一般在最后一行 | AS_IF | AS_IF (test1, [run-if-true1], …, [run-if-false]) | 执行检测,如果成功执行第一条,如果第一条不成功执行第二条,以此类推 |
例如:
AC_PREREQ(2.61)
AC_INIT(sqlite, 3.38.5, http://www.sqlite.org)
AC_CONFIG_SRCDIR([sqlite3.c]) # 检测当前目录下是否存在sqlite3.c
AC_CONFIG_AUX_DIR([.])
# Use automake.
AM_INIT_AUTOMAKE([foreign])
AC_SYS_LARGEFILE
# Check for required programs.
AC_PROG_CC
AC_PROG_LIBTOOL
AC_PROG_MKDIR_P
# Check for library functions that SQLite can optionally use.
AC_CHECK_FUNCS([fdatasync usleep fullfsync localtime_r gmtime_r])
AC_FUNC_STRERROR_R
AC_CONFIG_FILES([Makefile sqlite3.pc])
BUILD_CFLAGS=
AC_SUBST(BUILD_CFLAGS)
AC_OUTPUT
Makefile.am
PLV
目标列表变量,用于指定目标文件,定义为:prefix_PRIMARY = product1 product2 ...
常见前缀有:| 名称 | 说明|
|-|-|
| bin | 可执行程序安装位置,默认为 /usr/local/bin |
| lib | 库文件安装位置,默认为 /usr/local/lib |
| noinst | 生成但不安装,常用于静态库 |
| check | 测试构建的目标,无需安装 |主变量有:
|名称 | 说明 |
|-|-|
| PROGRAMS | 执行程序 |
| LIBRARIES | 静态库 |
| LTLIBRARIES | libtool生成的库(.la)|- PSV
目标源文件变量,指定目标文件的源文件列表,格式如下product_SOURCES = file1 file2 ...
POV
目标选项变量,常用的选项有:| 名称 | 说明 |
|-|-|
| product_CPPFLAGS | 预处理器参数 |
| product_LDFLAGS | 链接参数,如-static -shared -L等 |
| library_LIBADD | 将非Libtool的.o目标文件传给ar命令,生成静态库 |
| product_CFLAGS | 编译器参数,如-g -Wall -I等 |
| program_LDADD | 将静态库或.la传给链接器,用于链接生成可执行程序 |
| library_LIBADD | 将LibTool的.lo文件添加到LibTool库文件 |
AUTOMAKE_OPTIONS = foreign // 检查等级 |
目标源文件变量中的product只支持字母,数字和下划线,因此他会将所有其他字符识别为下划线,因此libcn.a变成了libcn_a
实例
本例子为sqlite的源文件
configure.ac
|
Makefile.am
|