makefile制作

2011/07/14 23:02
阅读数 265
1. 引言 
    无论是在Linux还是在Unix环境中,make都是一个非常重要的编译命令。不管是自己进行项目开发还是安装应用软件,我们都经常要用到make或 make install。利用make工具,我们可以将大型的开发项目分解成为多个更易于管理的模块,对于一个包括几百个源文件的应用程序,使用make和 makefile工具就可以轻而易举的理顺各个源文件之间纷繁复杂的相互关系。 
    但是如果通过查阅make的帮助文档来手工编写Makefile,对任何程序员都是一场挑战。幸而有GNU提供的Autoconf及Automake这两套工具使得编写Makefile不再是一个难题。 
    本文将介绍如何利用 GNU Autoconf 及 Automake 这两套工具来协助我们自动产生 Makefile文件,并且让开发出来的软件可以像大多数源码包那样,只需“./configure”,“make”,“make install” 就可以把程序安装到系统中。

2. 操作过程 
    首先进入目标project目录,在该目录下运行一系列命令,创建和修改几个文件,就可以生成符合该平台的Makefile文件,操作过程如下: 
1) 运行autoscan命令; 
2) 将configure.scan 文件重命名为configure.ac,并修改configure.ac文件; 
3) 在project目录下新建Makefile.am文件,并在它的子目录下也新建makefile.am文件; 
4) 在project目录下新建NEWS、 README、 ChangeLog 、AUTHORS四个文件; 
5) 依次运行aclocal、autoconf和autoheader三个命令; 
6) 编写Makefile.am文件; 
7) 再运行automake -a命令(或automake --add-missing); 
8) 最后运行./confiugre脚本,这一步即会生成Makefile文件。 
    可以通过下图看出生成Makefile的全流程:


图 Figure 1 生成Makefile流程图

    从上图可以看出,生成Makefile的过程中,关键是要编写好configure.in和Makefile.am两个文件。下面以一个简单示例来演练生成Makefile文件的操作过程。

3. 简单示例 
    下面以一个简单的示例来具体介绍Makefile是如何生成的。 
    1) 编写源代码 
    创建一个子目录hello,并在这个目录下新建一个hello.cpp源代码文件,hello.cpp的内容为: 
#include <stdio.h> 
int main() 

printf("Hello, world/n"); 
Return 0; 
}

    2) 在hello目录下运行autoscan命令 
    执行完autoscan之后,会在当前目录下生成一个configure.scan文件,通常可以用它作为configure.ac文件的蓝本。 
jayyi@tsf-dev:~/hello$ autoscan 
jayyi@tsf-dev:~/hello$ ls 
configure.scan hello.cpp

    3) 将configure.scan重命名为configure.ac,并修改其内容为(蓝色部分是新增或修改的): 
# -*- Autoconf -*- 
# Process this file with autoconf to produce a configure script.

AC_PREREQ(2.59) 
AC_INIT(hello, 1.0, [jayyi@tencent.com]) 
AC_CONFIG_SRCDIR([hello.cpp]) 
AC_CONFIG_HEADER([config.h]) 
AM_INIT_AUTOMAKE(hello, 1.0)

# 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([Makefile])

    4) 执行touch NEWS README AUTHORS ChangeLog以生成四个空文件 
jayyi@tsf-dev:~/hello$ touch NEWS README AUTHORS ChangeLog 
    5) 依次执行aclocal、autoconf和autoheader三个命令,以生成必要的文件 
jayyi@tsf-dev:~/hello$ aclocal;autoconf;autoheader 
    这些必要的文件包括aclocal.m4,config.h.in,configure等。

    6) 在当前目录下编写Makefile.am文件,文件内容为: 
AUTOMAKE_OPTIONS= foreign 
bin_PROGRAMS= hello 
hello_SOURCES= hello.cpp

    7) 再运行automake -a命令 jayyi@tsf-dev:~/hello$ automake -a 
    在这一步之后,就可以通过执行当前目录下的configure脚本来生成Makefile文件了。

    8) 运行当前目录下的configure脚本生成Makefile文件 
jayyi@tsf-dev:~/hello$ ./configure 
    如果需要指定安装目录,则带参数方式运行configure,如: 
jayyi@tsf-dev:~/hello$ ./configure --prefix=安装目录

    9) 现在在当前目录下已经生成了Makefile文件,下个“make”指令就可以将hello.cpp编译成可执行程序hello 
jayyi@tsf-dev:~/hello$ make 
make all-am 
make[1]: Entering directory `/data/home/jayyi/hello' 
if g++ -DHAVE_CONFIG_H -I. -I. -I. -g -O2 -MT hello.o -MD -MP -MF ".deps/hello.Tpo" -c -o hello.o hello.cpp; / 
then mv -f ".deps/hello.Tpo" ".deps/hello.Po"; else rm -f ".deps/hello.Tpo"; exit 1; fi 
g++ -g -O2 -o hello hello.o 
make[1]: Leaving directory `/data/home/jayyi/hello'

jayyi@tsf-dev:~/hello$ ./hello 
Hello, world

    最后,你还可以试试“make install”,“make uninstall”,“make dist”等有什么效果。由于篇幅有限,这篇简介只介绍了automake的皮毛罢了,如果较系统的掌握automake的使用,请参见其它讲解比较全面深入的文档。

4. 附示例代码:
    Hello示例代码使用方法: 
1) 在linux服务器上新建一个hello目录 
2) 将hello.cpp,configure.ac和Makefile.am三个文件以ascii码方式上传到linux服务器的hello目录下 
3) 登录到linux服务器,并进入hello目录 
4) 使用touch创建NEW,README,AUTHORS,ChangeLog四个空文件: 
touch NEW README AUTHORS ChangeLog 
5) 依次执行如下命令: 
aclocal,autoconf,autoheader,automake -a 
经过第5步之后,会在hello目录下生成一个configure可执行shell脚本文件。 
6) 在hello目录下运行configure,以生成Makefile文件,运行configure的格式为: 
./configure --prefix=<安装目录> 
7) 进行make,以生成hello可执行程序 
执行完configure之后,会在hello目录下生成一个Makefile文件,这个时候就可以make了,在hello目录下执行make即可完成编译 
8) 在hello目录下运行hello可执行程序 
./hello 
    即可看到屏幕输出:Hello, world

展开阅读全文
打赏
0
1 收藏
分享
加载中
更多评论
打赏
0 评论
1 收藏
0
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部