您的位置:首页 > 其它

自动生成 Makefile 的全过程详解

2012-12-11 00:00 435 查看
automake/autoconf
入门

作为
Linux
下的程序开发人员,大家一定都遇到过
Makefile
,用
make
命令来编译自己写的程序确实是很方便。一般情况下,大家都是手工写一个简单
Makefile
,如果要想写出一个符合自由软件惯例的
Makefile
就不那么容易了。

在本文中,将给大家介绍如何使用
autoconf

automake
两个工具来帮助我们自动地生成符合自由软件惯例的
Makefile
,这样就可以象常 见的
GNU
程序一样,只要使用
“./configure”

“make”

“make instal”
就可以把程序安装到
Linux
系统中去了。这将特别适合想做开放源代码软件的程序开发人员,又或如果你只是自己写些小的
Toy
程序,那么这 个文章对你也会有很大的帮助。

一、
Makefile
介绍

Makefile
是用于自动编译和链接的,一个工程有很多文件组成,每一个文件的改变都会导致工程的重新链接,但是不是所有的文件都需要重新编译,
Makefile
中纪录有文件的信息,在
make
时会决定在链接的时候需要重新编译哪些文件。

Makefile
的宗旨就是:让编译器知道要编译一个文件需要依赖其他的哪些文件。当那些依赖文件有了改变,编译器会自动的发现最终的生成文件已经过时,而重新编译相应的模块。

Makefile
的基本结构不是很复杂,但当一个程序开发人员开始写
Makefile
时,经常会怀疑自己写的是否符合惯例,而且自己写的
Makefile
经常和自己的开发环境相关联,当系统环境变量或路径发生了变化后,
Makefile
可能还要跟着修改。这样就造成了手工书写
Makefile
的诸多问题,
automake
恰好能很好地帮助我们解决这些问题。

使用
automake
,程序开发人员只需要写一些 简单的含有预定义宏的文件,由
autoconf
根据一个宏文件生成
configure
,由
automake
根据另一个宏文件生成
Makefile.in
, 再使用
configure
依据
Makefile.in
来生成一个符合惯例的
Makefile
。下面我们将详细介绍
Makefile

automake
生成 方法。

二、使用的环境

本文所提到的程序是基于
Linux
发行版本:
Fedora Core release 1
,它包含了我们要用到的
autoconf

automake


三、从
helloworld
入手

我们从大家最常使用的例子程序
helloworld
开始。

下面的过程如果简单地说来就是:

新建三个文件:

helloworld.c
configure.in
Makefile.am

然后执行:

aclocal; autoconf; automake --add-missing; ./configure; make; ./helloworld

就可以看到
Makefile
被产生出来,而且可以将
helloworld.c
编译通过。

很简单吧,几条命令就可以做出一个符合惯例的
Makefile
,感觉如何呀。

现在开始介绍详细的过程:

1
、建目录

在你的工作目录下建一个
helloworld
目录,我们用它来存放
helloworld
程序及相关文件,如在
/home/my/build
下:

$ mkdir helloword
$ cd helloworld

2

helloworld.c

然后用你自己最喜欢的编辑器写一个
hellowrold.c
文件,如命令:
vi helloworld.c
。使用下面的代码作为
helloworld.c
的内容。

int main(int argc, char** argv)
{
printf("Hello, Linux World!\n");
return 0;
}

完成后保存退出。

现在在
helloworld
目录下就应该有一个你自己写的
helloworld.c
了。

3
、生成
configure

我们使用
autoscan
命令来帮助我们根据目录下的源代码生成一个
configure.in
的模板文件。

命令:

$ autoscan
$ ls
configure.scan helloworld.c

执行后在
hellowrold
目录下会生成一个文件:
configure.scan
,我们可以拿它作为
configure.in
的蓝本。

现在将
configure.scan
改名为
configure.in
,并且编辑它,按下面的内容修改,去掉无关的语句:

============================configure.in
内容开始
=========================================
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

AC_INIT(helloworld.c)
AM_INIT_AUTOMAKE(helloworld, 1.0)

# 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)
============================configure.in
内容结束
=========================================

然后执行命令
aclocal

autoconf
,分别会产生
aclocal.m4

configure
两个文件:

$ aclocal
$ls
aclocal.m4 configure.in helloworld.c
$ autoconf
$ ls
aclocal.m4 autom4te.cache configure configure.in helloworld.c

大家可以看到
configure.in
内容是一些宏定义,这些宏经
autoconf
处理后会变成检查系统特性、环境变量、软件必须的参数的
shell
脚本。

autoconf
是用来生成自动配置软件源代码脚本(
configure
)的工具。
configure
脚本能独立于
autoconf
运行,且在运行的过程中,不需要用户的干预。

要生成
configure
文件,你必须告诉
autoconf
如何找到你所用的宏。方式是使用
aclocal
程序来生成你的
aclocal.m4


aclocal
根据
configure.in
文件的内容,自动生成
aclocal.m4
文件。
aclocal
是一个
perl
脚本程序,它的定义是:
“aclocal - create aclocal.m4 by scanning configure.ac”


autoconf

configure.in
这个列举编译软件时所需要各种参数的模板文件中创建
configure


autoconf
需要
GNU m4
宏处理器来处理
aclocal.m4
,生成
configure
脚本。

m4
是一个宏处理器。将输入拷贝到输出,同时将宏展开。宏可以是内嵌的,也可以是用户定义的。除了可以展开宏,
m4
还有一些内建的函数,用来引用文件,执行命令,整数运算,文本操作,循环等。
m4
既可以作为编译器的前端,也可以单独作为一个宏处理器。

4
、新建
Makefile.am

新建
Makefile.am
文件,命令:

$ vi Makefile.am

内容如下
:

AUTOMAKE_OPTIONS=foreign
bin_PROGRAMS=helloworld
helloworld_SOURCES=helloworld.c

automake
会根据你写的
Makefile.am
来自动生成
Makefile.in


Makefile.am
中定义的宏和目标
,
会指导
automake
生成指定的代码。例如,宏
bin_PROGRAMS
将导致编译和连接的目标被生成。

5
、运行
automake

命令:

$ automake --add-missing
configure.in: installing `./install-sh'
configure.in: installing `./mkinstalldirs'
configure.in: installing `./missing'
Makefile.am: installing `./depcomp'

automake
会根据
Makefile.am
文件产生一些文件,包含最重要的
Makefile.in


6
、执行
configure
生成
Makefile

$ ./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking for gcc... gcc
checking for C compiler default output... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ANSI C... none needed
checking for style of include used by make... GNU
checking dependency style of gcc... gcc3
configure: creating ./config.status
config.status: creating Makefile
config.status: executing depfiles commands
$ ls -l Makefile
-rw-rw-r-- 1 yutao yutao 15035 Oct 15 10:40 Makefile

你可以看到,此时
Makefile
已经产生出来了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: