QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 897|回复: 2

如何用automake和autoconf管理项目

[复制链接]
发表于 2005-1-4 21:22:03 | 显示全部楼层 |阅读模式
前言

本文肯定不是一个权威的指南,一方面因为已经有很完整的文档了(有个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]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
发表于 2005-1-5 08:02:52 | 显示全部楼层
好东东呀
回复

使用道具 举报

发表于 2005-3-9 17:39:16 | 显示全部楼层
hao a
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-6 13:45 , Processed in 0.066314 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表