分类: LINUX
2008-03-29 20:40:18
今天学习了linux中利用autotool系列工具生成makefile,下面简要的做一下总结:
Makefile是干什么的?
makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,其中也可以执行操作系统的命令。
makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。还有一个好处就是,一旦某个文件被修改了,再对工程编译时候,不用编译所有的文件,编译工具会根据makefile判断哪个文件被修改了,只编译与它有关的文件。
而手动编写makefile很繁,所以autotools就应运而生,它可以实现makefile的自动生成
autotools的使用流程
autoscan->aclocal->autoconf-> automake->configure
以helloworld为例加以说明:
1)新建helloworld.c,并修改代码如下:
int main(int argc,char** argv)
{
printf("hello world!");
}
2)autoscan:autoscan:生成configure.scan
3)编辑configure.scan,并重命名为configure.in
内容如下:
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ(2.59)
#The next one is modified by sunq
#AC_INIT(FULL-PACKAGE-NAME,VERSION,BUG-REPORT-ADDRESS)
AC_INIT(hello,1.0)
# The next one is added by author
AM_INIT_AUTOMAKE(hello,1.0)
AC_CONFIG_SRCDIR([hello.c])
# 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_CONFIG_FILES([Makefile])
AC_OUTPUT
4)aclocal:生成aclocal.m4
5) autoconf:生成configure
6)vim makefile.am:新建makefile.am并编辑内容如下:
AUTOMAKE_OPTIONS=foreign
bin_PROGRAMS=helloworld
helloworld_SOURCES=helloworld.c
7)atuomake --add-missing:生成makefile.in
8)./configure:生成makefile
这样helloworld的makefile就生成了,make就可生成可执行程序了。
autotools各步详解:
1.autoscan
它会在给定目录及其子目录树中检查源文件,若没有给出目录,就在当前目录及其子目录树中进行检查。它会搜索源文件以寻找一般的移植性问题并创建一个文件“configure.scan”,它是“configure.in”的原型文件.
2.configure.in
configure.in是autoconf的脚本配置文件,文件的内容是一些宏,这些宏经过autoconf 处理后会变成检查系统特性、环境变量、软件必须的参数的shell脚本。configure.in文件中的宏的顺序并没有规定,但是你必须在所有宏的最前面和最后面分别加上AC_INIT宏和AC_OUTPUT宏。其中:
1)以“#”号开始的行为注释。
2)AC_PREREQ宏声明本文件要求的autoconf版本,如本例使用的版本2.59。
3) AC_INIT宏用来定义软件的名称和版本等信息,在本例中省略了BUG-REPORT-ADDRESS,一般为作者的e-mail。
4)M_INIT_AUTOMAKE是笔者另加的,它是automake所必备的宏,也同前面一样,PACKAGE是所要产生软件套件的名称,VERSION是版本编号。
5)AC_CONFIG_SRCDIR宏用来侦测所指定的源码文件是否存在,来确定源码目录的有
效性。在此处为当前目录下的hello.c。
6)AC_CONFIG_HEADER宏用于生成config.h文件,以便autoheader使用。
7)AC_CONFIG_FILES宏用于生成相应的Makefile文件。
4.aclocal
它生成一个“aclocal.m
5.autoconf
生成“configure”shell文件。configure是一个脚本,它能设置源程序来适应各种不同的操作系统平台,并且根据不同的系统来产生合适的Makefile,从而可以使你的源代码能在不同的操作系统平台上被编译出来。
6.makefile.am
· 其中的AUTOMAKE_OPTIONS为设置automake的选项。由于GNU对自己发布的软件有严格的规范,比如必须附带许可证声明文件COPYING等,否则automake执行时会报错。automake提供了三种软件等级:foreign、gnu和gnits,让用户选择采用,默认等级为gnu。在本例使用foreign等级,它只检测必须的文件。
· bin_PROGRAMS定义要产生的执行文件名。如果要产生多个执行文件,每个文件名用空格隔开。
· hello_SOURCES定义“hello”这个执行程序所需要的原始文件。如果”hello”这个程序是由多个原始文件所产生的,则必须把它所用到的所有原始文件都列出来,并用空格隔开。例如:若目标体“hello”需要“hello.c”、“sunq.c”、“hello.h”三个依赖文件,则定义hello_SOURCES=hello.c sunq.c hello.h。要注意的是,如果要定义多个执行文件,则对每个执行程序都要定义相应的file_SOURCES。
7.automake - -add-missing
生成“makefile.in”文件,在这里使用选项“—adding-missing”可以让automake自动添加有一些必需的脚本文件。
8.运行configure
在这一步中,通过运行自动配置设置文件configure,把Makefile.in变成了最终的Makefile。