|
前言
本文肯定不是一个权威的指南,一方面因为已经有很完整的文档了(有个autobook的文档,不太好看明白),另一方面,笔者我实在也是初学乍练。因此这篇文章只是我试图在一个小程序中应用automake和autoconf的过程中的点点心得。
automake和autoconf干吗使的
你编译过啥GNU的程序没?除了象mozilla, firefox, linux kernel或openoffice这些恐龙级的程序有自己一套代码编译发布系统外,大部分的GNU软件的源代码包都是用下面几步来编译安装的:
1. 执行./configure。这是一个shell脚本,它会很专业的检查系统环境,比如使用什么编译器,有没有哪个库之类,它还能带各种各样的参数,如果各项检查通过,它就会生成Makefile;
2. 执行make进行编译;
3. make install。这就把编好的程序安装到系统里去了。
很酷是吧?很专业是吧?这背后就是automake和autoconf的功劳。这套工具大大减少了Makefile编写的工作量。
手把手教你用
项目介绍
这是一个小游戏(雏形),源文件大约10来个,还有几个数据文件(图片什么的)。在这下载:http://www.idlecat.com/articles/Programming/runner.tar.bz2
解开后,目录结构是这样的:
/ --- src (保存源代码)
|
|_ gamedata (保存数据文件) ---- sprite (精灵动画) --- drop (往下掉的动画)
|_ left (往左跑的动画)
|_ right (往右跑的动画)
|_ stand (站着的动画)
先写Makefile.am
除了程序本身用到的文件,在每层目录下还有给automake使用的Makefile.am,Makefile.am是automake的输入,可以认为它是更高层次的Makefile。坏消息是:这些Makefile.am你可得自己写,电脑不是你肚子里的蛔虫好消息是,写完这些就差不多大功告成了,呵呵。
根目录下的Makefile.am内容很简单,很明显就是告诉automake继续处理这两个子目录,以此类推,有子目录的目录中的Makefile.am都免不了这么一句。
SUBDIRS = src gamedata
稍微复杂点的是$ROOT/gamedata/sprite/drop下的Makefile.am,要告诉automake把数据文件装到哪:
EXTRA_DIST=1.bmp 2.bmp info
leftdir = $(datadir)/runner/sprite/left/
left_DATA = $(EXTRA_DIST)
更复杂点的呢是$ROOT/src下的Makefile.am
INCLUDES = -I/usr/include/SDL -D_REENTRANT -I/usr/include/sigc++-2.0 -I/usr/lib/sigc++-2.0/include
bin_PROGRAMS = runner
runner_SOURCES = \
ai.cpp animation.cpp anisprite.cpp gamestage.cpp gamesys.cpp \
main.cpp sprite.cpp spriteone.cpp stagetwo.cpp
runner_LDFLAGS = -lSDL -lpthread -lsigc-2.0
AM_CPPFLAGS = -g -O0 -DDATADIR=\"$(datadir)\"
这个地方我觉得我弄得还不规范,INCLUDES和LDFLAGS的定义应该更智能些,按我想这么写:”USE_LIBS=SDL sigc-2.0 pthread“,然后自动化工具就能把INCLUDES和LDFLAGS设置好,不过偶还没发现该怎么做,如果您知道,麻烦告诉我。如果你用点大脑就会理解到Makefile.am就是Makefile的另外一种形式,这里我就不多解释了。
生成configure.in
这个文件是用来指导autoconf生成configure这个脚本的。
笔者开始傻傻的手写configure.in,后来才知道在$ROOT下执行一次autoscan就可以生成这个文件(叫configure.scan)。autoscan会根据Makefile.am来生成configure.scan,所以在执行autoscan之前一定要先写好Makefile.am,这样能省不少事哦还有就是我用debian下的autoscan会报找不到configure.ac的错,其实不影响使用。
自动生成的configure.scan还需要修改才能用。前文说道,笔者是个菜鸟。因此别指望我把这个configure.in的用法解释得清清楚楚。不过希望我说得够你用了下面就是修改前后的configure.in的对照,前面有-号表示要被删掉的行,+号表示增加的行,中文的注释是偶写的。
AC_PREREQ(2.59)
-AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
+AC_INIT(runner, 0.1, [email protected])
#下面这句一定要加
+AM_INIT_AUTOMAKE(runner, 1.0)
AC_CONFIG_SRCDIR([src/ai.cpp])
#config.h我还没研究,只好把它注释掉先。
-AC_CONFIG_HEADER([config.h])
# Checks for programs.
AC_PROG_CXX
AC_PROG_CC
# Checks for libraries.
# FIXME: Replace `main' with a function in `-lSDL':
# 注意这里,autoscan在src/Makefile.am中找到-lSDL这个选项,然后生成了下面这个语句来测试
# SDL的可用性。不过它不知道SDL里面有啥函数,所以要你手工把main换成SDL里的一个函数
-AC_CHECK_LIB([SDL], [main])
+AC_CHECK_LIB([SDL], [SDL_Init])
# FIXME: Replace `main' with a function in `-lpthread':
# 同SDL,奇怪的是,-lsigc-2.0为什么没有对应的项?
-AC_CHECK_LIB([pthread], [main])
+AC_CHECK_LIB([pthread], [pthread_create])
# Checks for header files.
AC_HEADER_STDC
AC_CHECK_HEADERS([stdlib.h])
# Checks for typedefs, structures, and compiler characteristics.
AC_HEADER_STDBOOL
AC_C_CONST
# Checks for library functions.
# 因为源代码里调用了floor函数,autoscan就生成了这项,看起来autoscan做的工作不少啊!
AC_CHECK_FUNCS([floor])
AC_CONFIG_FILES([Makefile
gamedata/Makefile
gamedata/sprite/Makefile
gamedata/sprite/drop/Makefile
gamedata/sprite/left/Makefile
gamedata/sprite/right/Makefile
gamedata/sprite/stand/Makefile
src/Makefile])
AC_OUTPUT
收尾
到这差不多就算完了,剩下你要做的就是执行:aclocal;autoconf;automake --add-missing。这样你就会发现目录下面多了好多文件,其中就有你日思夜想的configure。OK,大功告成。 [url][/url] |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?注册
×
|