// 所有原创文章转载请注明作者及链接
// blackboycpp(AT)gmail.com
// QQ群: 135202158
无论是在Linux还是在Unix环境中,make都是一个非常重要的编译命令。不管是自己进行项目开发还是安装应用软件,我们都经常要用到make或 make install。利用make工具,我们可以将大型的开发项目分解成为多个更易于管理的模块,对于一个包括几百个源文件的应用程序,使用make和 makefile工具就可以轻而易举的理顺各个源文件之间纷繁复杂的相互关系。
但是如果通过查阅make的帮助文档来手工编写Makefile,对任何程序员都是一场挑战。幸而有GNU 提供的autoconf及automake这两套工具使得编写Makefile不再是一个难题。
本文将介绍如何利用 GNU autoconf 及 automake 这两套工具来协助我们自动产生 Makefile文件,并且让开发出来的软件可以像大多数源码包那样,只需"./configure", "make","make install" 就可以把程序安装到系统中。
首先,把ethereal-0.2.0源代码解压到一个目录,并删除其中已存在的和Makefile有关的文件。然后依次执行以下命令:
1. autoscan
说明:autoscan命令来帮助我们根据目录下的源代码生成一个configure.in的模板文件。
将生成的configure.scan修改为configure.in,
然后编译configure.in,修改内容为:
----------------------------------------------------------------
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.65])
AC_INIT(ethereal.c)
AM_INIT_AUTOMAKE(ethereal, 0.2.0)
AC_CONFIG_SRCDIR([capture.h])
AC_CONFIG_HEADERS([config.h])
# Checks for programs.
AC_PROG_CC
# Checks for libraries.
# Checks for header files.
AC_CHECK_HEADERS([fcntl.h netinet/in.h string.h strings.h sys/ioctl.h sys/socket.h sys/time.h unistd.h])
# Checks for typedefs, structures, and compiler characteristics.
AC_TYPE_SIZE_T
# Checks for library functions.
AC_FUNC_MALLOC
AC_CHECK_FUNCS([socket strchr strrchr])
AC_OUTPUT(Makefile)
----------------------------------------------------------------
2. aclocal
说明:aclocal根据configure.in文件的内容,自动生成aclocal.m4文件。aclocal是一个perl 脚本程序,它的定义是:“aclocal - create aclocal.m4 by scanning configure.ac”。
3. autoheader
说明:autoheader 用来产生模板头文件,以便于后面生成的configure文件的使用。
4. 执行autoconf
说明:autoconf是一个用于生成可以自动地配置软件源码包,用以适应多种UNIX类系统的shell脚本工具,其中autoconf需要用到 m4,便于生成脚本。
5. 新建文件Makefile.am,修改内容如下:
----------------------------------------------------------------
AUTOMAKE_OPTIONS = foreign
INCLUDES = `pkg-config --cflags gtk+-2.0 libgnomeui-2.0`
LIBS = `pkg-config --libs gtk+-2.0 libgnome-2.0`
bin_PROGRAMS = ethereal
ethereal_SOURCES= /
capture.c /
ethereal.c /
file.c /
menu.c /
packet.c /
packet-arp.c /
packet-ip.c /
packet-tcp.c /
packet-udp.c /
capture.h /
config.h /
ethereal.h /
etypes.h /
file.h /
menu.h /
packet.h
----------------------------------------------------------------
说明:
AUTOMAKE_OPTIONS :设置automake的选项。Automake主要是帮助开发GNU软件的人员来维护软件,所以在执行automake时,会检查目录下是否存在标准GNU软件中应具备 的文件,例如'NEWS'、'AUTHOR'、'ChangeLog'等文件。设置foreign 时,automake会改用一般软件的标准来检查。
INCLUDES :程序中用到的头文件,使用 pkg-config工具来自动配置
LIBS :程序中用到的库文件,使用 pkg-config工具来自动配置
bin_PROGRAMS :最终生成的可执行文件名称,可以有多个可执行文件,中间用空格隔开
ethereal_SOURCES :生成上个选项中列出的二进制文件所需的源文件,每个文件单独列出
6. 执行automake --add-missing
说明:automake是一个从Makefile.am文件自动生成Makefile.in的工具。为了生成Makefile.in,automake还需用到perl,由于automake创建的发布完全遵循GNU标准,所以在创建中不需要perl。
7. 执行./configure
至此,已经自动生成了Makefile,如果源码没有错误,就可以编译了。
可以使用以下命令:
make :编译
make install :安装
make clean :清理临时文件
make dist :打包成标准的软件包
本文引用了以下文章的部分内容,在此表示衷心感谢:
【1】sirniu - http://blog.sina.com.cn/s/blog_5252fdda0100b5fi.html
【2】杨小华,苏春艳 - https://www.ibm.com/developerworks/cn/linux/l-makefile/