1.本文章遵从” 署名-非商业性使用 2.5 中国大陆 (CC BY-NC 2.5 CN)” 2. 转载或引用本文档中的内容须注明 “资料来源:HB@ Technical Document” 字样 |
Autoconf/automake/libtool是GNU Autotools家族里用来自动生成makefile 和 configure的工具, 有了它,
我们就不用去写那么繁琐的各种角本文件,用它我们就可以自动生成各个角本文件,来管理和组织我们的代码项目。
Autotools不但是一个工程建设系统,也可以用来做一些系统环境兼容性检测。正因为有了它, 我们可以用
1. ./configure
2. Make
3. make install
这三步曲去编译我们的项目。下面来用一个很简单的helloautoconf 例子来说明怎么使用它。Step 1: Install autoconf、automake、libtool
和其它GNU工具一样,使用它之前我们要在自己的系统环境中安装。
sudo apt-get install autoconf automake libtool
这里我们看到我们一起安装了三个工具,其中,autoconf是在你编译之前,用来做一些测试,检测你的各个配制是不是正确,环境变量设置是不是符合项目的要求。
Automake是来用生成Makefile,同时它也完成各个文件之间依赖性检测。
Libtool是一个命令行接口,用来完成静态或者共享库的连接。
完成上面的安装之后,我们可以用下面的命令去检测你是否安装成功:
dpkg -l autoconf
dpkg -l automake
dpkg -l libtool
你也可以用 apt list [tool name] 来检测。
Step 2: program testing C file
创建一个测试目录:
mkdir my-autoconf
这里我们用一个很简单的C语言文件my-autoconf.c来作为我们的测试文件,如下:
#include<stdio.h>
int main()
{
printf("Hello autoconf! \n");
return 0;
}
Step 3: runautoscan
直接在my-autoconf目录下运行:
Autoscan
autoscan可以用目录名做为参数,但如果你不使用参数的话,那么autoscan将认为使用的是当前目录下。autoscan将扫描你所指定目录中的源文件,并创建configure.scan和autoscan.log两个文件。
其中autoscan.log只是一个记录文件,里面是空。
Step 4: modify configure.scan
configure.scan包含了系统配置的基本选项,里面都是一些宏定义。这里我们要做一些修改,以符合我们自己的工作要求。自动生成的configure.scan如下,非常简单。
|
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.69])// 确保是新的Autoconf
AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS]) //初始化,定义软件的基本信息,包括设置包的全称,版本号以及报告BUG时需要用的邮箱地址
AC_CONFIG_SRCDIR([my-autconf.c]) //用来侦测所指定的源码文件是否存在,来确定源码目录的有效性
AC_CONFIG_HEADERS([config.h]) //用于生成config.h文件,以便autoheader使用
# Checks for programs.
AC_PROG_CC
# Checks for libraries.
# Checks for header files.
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.
AC_OUTPUT
经过修改:
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.69])
AC_INIT(autoconf-test, 1.0, jackyard88@gmail.com) //工程或者项目的名称,版本号和维护者的联系方式。
AC_CONFIG_SRCDIR([my-autoconf.c])
AC_CONFIG_HEADERS([config.h])
AM_INIT_AUTOMAKE(main,1.0) //添加AM_INIT_AUTOMAKE,这里的名
# Checks for programs.
AC_PROG_CC
# Checks for libraries.
# Checks for header files.
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.
AC_OUTPUT([Makefile]) //增加输出makefile, 如果有了目录要生成makefile, 也要在这里指定,可以用AC_CONFIG_FILES,之间用空格隔开。如:AC_CONFIG_FILES([ Makefile src/Makefile])
完成上面的修改之后,重命名configure.scan为configure.ac.
注意在老的版本的autotool,可能是要求重命名为configure.in,但configure.in也可以在新的版本的autotool上通过,只是会有一个提示warning.
Step 5: Generate configure
aclocal是一个perl脚本程序。aclocal根据configure.ac文件的内容,自动生成aclocal.m4文件和一个autom4te.cache缓冲文件夹。
aclocal的定义是:“Generate'aclocal.m4' by scanning 'configure.ac' or 'configure.in'”.
2. run autconf
这时我们就可以在当录下多了一个configure文件。
Step 6: generate config.h.in
Config.h.in是一个临时的C#define文件,也就是config.h的模版。它可以通过autoheader工具来自动生成,它主要是通过查找在configure中的AC_CONFIG_HEADERS定义,来决定要不要在config.h.in中增加相关的#define宏定义。也可以从“acconfig.h”文件中复制用户附加的符号定义,因为我们这里没有复杂的用例,也没有附加符号定义,所以我们就不需要创建acconfig.h,详解可以查看下面的链接:
https://www.gnu.org/software/autoconf/manual/autoconf-2.66/html_node/autoheader-Invocation.html
这里我们就直接运行autoheader在当前目录下:
autoheader
完成上面的命令,你就可以看到又多了一个文件:config.h.in,其实里面就是一些宏定义。
Step 7: generate makefile.in
Makefile.in是生成makefile的关键文件,但它是automake工具通过读取makefile.am文件的定义来生成的。Makefile.am通常由我们用户开发者自己根据你的项目的组织结构来编写.这里的.am代表的是automake。
对我们的这里的例子,makefile.am非常简单,只要有三个代码就可以了,如下:
AUTOMAKE_OPTIONS=foreign
bin_PROGRAMS=autoconf
autoconf_SOURCES=my-autoconf.c
AUTOMAKE_OPTIONS是automake的选项,在远行automake时,它会去检测目录下是否有GNU的软件包应该具备的各种文件,通常情况下,我们拿到一个GNU开源的软件包,里面一般会一些非常熟习的文件,如README,Changelog, INSTALL 等等。这个宏就是用来查看这些文件的。我们这里指定的选项是foreign, automake提供了三种软件等级,foreign、gnu和gnits,让用户选择采用,默认等级为gnu。
bin_PROGRAMS用来指定要产生的执行文件名。如果要产生多个执行文件,每个文件名用空格隔开。我们这里只有一个。
autoconf_SOURCES定义“autoconf”这个执行目标文件所需要的原文件。如果它是由多个原文件生成,我们要把它们都列在这里,并用空格隔开。
注意,这里的执行文件的名称可以是随意指定,但是名称中不能有“-”。
在运行automake时,我们要用到—add-missing选项,它是“add missing standard files to package”,
Automake --add-missing
通过上面的命令后,我们就可以在当前目录下,看到有一个makefile.in和一些链接文件。
注:对于有子目录的,顶层的Makefile.am只是指定目录名,如下:
Makefile.am
SUBDIRS = src
dist_doc_DATA = README.md
src/Makefile.am
bin_PROGRAMS = autotools_hello_world
autotools_hello_world_SOURCES = main.c
Step 8: generate Makefile
OK,终于到了最后, 我们可以通过configure去生成makefile文件,再通过make去编译,最后通过make install 去安装到相应的目录下。