首页 > 代码库 > autotools的详细使用

autotools的详细使用

autotools是系列工具, 它主要由autoconf、automake、perl语言环境和m4等组成;所包含的命令有五个:
    (1)aclocal
    (2)autoscan
    (3)autoconf

    (4)autoheader

    (5)automake


一、准备源代码

    本项目有三个源文件,分别为score.cpp, sum.cpp, average.cpp

    内容分别如下:

    score.cpp:

#include <iostream>
float Sum(float var[], int sum);
float Average(float var[], int sum);
using namespace std;
int main()
{
	float score[5] = {91, 95, 100, 98, 92};
	float sum, average;
	sum = Sum(score, 5);
	average = Average(score, 5);
	cout << "The sum score is " << sum << endl;
	cout << "The average score is " << average << endl;
	cout << "H" << endl;
	return 0;
}

    sum.cpp:

float Sum(float var[], int num)
{
	float sum = 0.0;
	for(int i=0; i<num; i++)
		sum += var[i];
	return sum;
}

   average.cpp:

float Average(float var[], int num)
{
	float average = 0.0;
	for(int i=0; i<num; i++)
		average += var[i];
	average /= num;
	return average;
}

 二、autotools 使用步骤

2.1 使用autoscan命令,它将扫描工作目录,生成 configure.scan 文件。

liuwei@liuwei:~/score$ ls
average.cpp  score.cpp  sum.cpp
liuwei@liuwei:~/score$ autoscan 
liuwei@liuwei:~/score$ ls
autoscan.log  average.cpp  configure.scan  score.cpp  sum.cpp

2.2 将configure.scan 文件重命名为configure.in,并做适当的修改。在 configure.in中,# 号开始的行是注释,其他都是m4 宏命令;configure.ac里面的宏的主要作用是侦测系统。

<span style="font-size:18px;">liuwei@liuwei:~/score$ mv configure.scan configure.in
liuwei@liuwei:~/score$ ls
autoscan.log  average.cpp  configure.in  score.cpp  sum.cpp</span>

修改前configure.in文件中的内容为:

<span style="font-size:18px;">#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

AC_PREREQ([2.68])
AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
AC_CONFIG_SRCDIR([sum.cpp])
AC_CONFIG_HEADERS([config.h])

# Checks for programs.
AC_PROG_CXX

# Checks for libraries.

# Checks for header files.

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.

AC_OUTPUT</span>

修改后configure.in文件中的内容:

<span style="font-size:18px;">#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

AC_PREREQ([2.68])
AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
AM_INIT_AUTOMAKE(score, 1.0)
AC_CONFIG_SRCDIR([sum.cpp])
AC_CONFIG_HEADERS([config.h])

# Checks for programs.
AC_PROG_CXX

# Checks for libraries.

# Checks for header files.

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.

AC_CONFIG_FILES([Makefile])
AC_OUTPUT</span>

修改后的文件比修改前的文件增加了两行:

AM_INIT_AUTOMAKE(score, 1.0)
AC_CONFIG_FILES([Makefile])</span>


说明:

(1)以“#”号开始的行均为注释行。
(2)AC_PREREQ 宏声明本文要求的 autoconf 版本, 如本例中的版本 2.59。

(3)AC_INIT 宏用来定义软件的名称、版本等信息、作者的E-mail等。
(4)AM_INIT_AUTOMAKE是通过手动添加的, 它是automake所必备的宏, FULL-PACKAGE-NAME是软件名称,VERSION是软件版本号。
(5)AC_CONFIG_SCRDIR 宏用来侦测所指定的源码文件是否存在, 来确定源码目录的有效性.。此处为当前目录下main.c。

(6)AC_CONFIG_HEADER 宏用于生成config.h文件,以便 autoheader 命令使用。
(7)AC_PROG_CC用来指定编译器,如果不指定,默认gcc。
(8)AC_OUTPUT 用来设定 configure 所要产生的文件,如果是makefile,configure 会把它检查出来的结果带入makefile.in文件产生合适的makefile。使用 Automake 时,还需要一些其他的参数,这些额外的宏用aclocal工具产生。
(9)AC_CONFIG_FILES宏用于生成相应的Makefile文件。


2.3  使用 aclocal 命令,扫描 configure.in 文件生成 aclocal.m4文件, 该文件主要处理本地的宏定义,它根据已经安装的宏、用户定义宏和 acinclude.m4 文件中的宏将 configure.in文件需要的宏集中定义到文件 aclocal.m4 中。

liuwei@liuwei:~/score$ aclocal
liuwei@liuwei:~/score$ ls
aclocal.m4      autoscan.log  configure.in  sum.cpp
autom4te.cache  average.cpp   score.cpp

2.4 使用 autoconf 命令生成 configure 文件。这个命令将 configure.in 文件中的宏展开,生成 configure 脚本。这个过程可能要用到aclocal.m4中定义的宏。

liuwei@liuwei:~/score$ ls
aclocal.m4      autoscan.log  configure.in  sum.cpp
autom4te.cache  average.cpp   score.cpp
liuwei@liuwei:~/score$ autoconf 
liuwei@liuwei:~/score$ ls
aclocal.m4      autoscan.log  configure     score.cpp
autom4te.cache  average.cpp   configure.in  sum.cpp

2.5 使用 autoheader 命令生成 config.h.in 文件。


liuwei@liuwei:~/score$ ls
aclocal.m4      autoscan.log  configure     score.cpp
autom4te.cache  average.cpp   configure.in  sum.cpp
liuwei@liuwei:~/score$ autoheader 
liuwei@liuwei:~/score$ ls
aclocal.m4      autoscan.log  config.h.in  configure.in  sum.cpp
autom4te.cache  average.cpp   configure    score.cpp

2.6 手工创建Makefile.am文件。Automake工具会根据 configure.in 中的参量把 Makefile.am 转换成 Makefile.in 文件。

liuwei@liuwei:~/score$ vim Makefile.am
liuwei@liuwei:~/score$ cat Makefile.am 
AUTOMAKE_OPTIONS = foreign
bin_PROGRAMS = score
score_SOURCES = score.cpp sum.cpp average.cpp

说明:

(1)其中的AUTOMAKE_OPTIONS为设置automake的选项. 由于GNU对自己发布的软件有严格的规范, 比如必须附带许可证声明文件COPYING等,否则automake执行时会报错. automake提供了3中软件等级:foreign, gnu和gnits, 供用户选择。默认级别是gnu. 在本例中, 使用了foreign等级, 它只检测必须的文件。

(2)bin_PROGRAMS定义要产生的执行文件名. 如果要产生多个执行文件, 每个文件名用空格隔开。
(3)hello_SOURCES 定义”hello”这个可执行程序所需的原始文件。如果”hello”这个程序是由多个源文件所产生的, 则必须把它所用到的所有源文件都列出来,并用空格隔开。如果要定义多个可执行程序,那么需要对每个可执行程序建立对应的file_SOURCES。


2.7  执行automake,提示如下:

liuwei@liuwei:~/score$ automake
configure.in:6: required file `./install-sh' not found
configure.in:6:   `automake --add-missing' can install `install-sh'
configure.in:6: required file `./missing' not found
configure.in:6:   `automake --add-missing' can install `missing'
Makefile.am: required file `./depcomp' not found
Makefile.am:   `automake --add-missing' can install `depcomp'
 此时再执行 automake --add-missing,可以辅助生成几个必要的文件。

liuwei@liuwei:~/score$ ls
aclocal.m4      autoscan.log  config.h.in  configure.in  score.cpp
autom4te.cache  average.cpp   configure    Makefile.am   sum.cpp
liuwei@liuwei:~/score$ automake --add-missing 
configure.in:6: installing `./install-sh'
configure.in:6: installing `./missing'
Makefile.am: installing `./depcomp'
liuwei@liuwei:~/score$ ls
aclocal.m4      average.cpp  configure.in  Makefile.am  score.cpp
autom4te.cache  config.h.in  depcomp       Makefile.in  sum.cpp
autoscan.log    configure    install-sh    missing

执行完automake --add-missing后,可再执行一遍automake


2.8 执行./configure,把 Makefile.in 变成最终的 Makefile 文件。

liuwei@liuwei:~/score$ ./configure
此时ls

liuwei@liuwei:~/score$ ls
aclocal.m4      config.h       configure     Makefile     score.cpp
autom4te.cache  config.h.in    configure.in  Makefile.am  stamp-h1
autoscan.log    config.log     depcomp       Makefile.in  sum.cpp
average.cpp     config.status  install-sh    missing

此时Makefile文件生成成功。



三、Makefile的用法

3.1  make 命令,用来编译代码, 默认执行”make all”命令,可以看到生成了"score"的可执行文件,

liuwei@liuwei:~/score$ make
此时ls

liuwei@liuwei:~/score$ ls
aclocal.m4      average.o    config.status  install-sh   missing    stamp-h1
autom4te.cache  config.h     configure      Makefile     score      sum.cpp
autoscan.log    config.h.in  configure.in   Makefile.am  score.cpp  sum.o
average.cpp     config.log   depcomp        Makefile.in  score.o

3.2 此时执行./score就可运行程序了。

liuwei@liuwei:~/score$ ./score
The sum score is 476
The average score is 95.2
H

3.3 make clean 命令清除编译时的obj文件,它与 make 命令是对应关系,一个是编译,一个清除编译的文件。

liuwei@liuwei:~/score$ make clean
test -z "score" || rm -f score
rm -f *.o
liuwei@liuwei:~/score$ ls
aclocal.m4      config.h       configure     Makefile     score.cpp
autom4te.cache  config.h.in    configure.in  Makefile.am  stamp-h1
autoscan.log    config.log     depcomp       Makefile.in  sum.cpp
average.cpp     config.status  install-sh    missing
使用make clean生成score可执行程序的过程中,ls的结果是没有.o目标文件的。


3.4 make install 命令把目标文件安装到系统中,此时直接执行score即可运行。

liuwei@liuwei:~/score$ sudo make install 
[sudo] password for liuwei: 
make[1]: 正在进入目录 `/home/liuwei/score'
test -z "/usr/local/bin" || /bin/mkdir -p "/usr/local/bin"
  /usr/bin/install -c score '/usr/local/bin'
make[1]: 没有什么可以做的为 `install-data-am'。
make[1]:正在离开目录 `/home/liuwei/score'
liuwei@liuwei:~/score$ score
The sum score is 476
The average score is 95.2
H

3.5 make uninstall 命令把目标文件从系统中卸载。



autotools的详细使用