开发符合自由软件惯例的应用程序
充分利用 GNU 工具开发符合自由软件惯例的应用程序
王立 2002 年 1 月 16 日
本文以简单的自由软件项目 nighttask 为例,说明如何充分利用 GNU 提供的开发工具:autoconf、automake、libtool、gettext 开发符合自由软件惯例的应用程序。
相关工具软件简介
cvs:cvs 是 Linux 环境下应用最广泛的版本控制工具。
Autoconf:autoconf 主要根据程序员提供的 configure.in,生成能够自动检测系统配置的脚本 configure。而后再由 configure 根据各目录下的 Makefile.in 自动生成 Makefile。这样,程序员就可以直接使用具备丰富功能的 Makefile 了。除了 autoconf 命令以外,autoconf 软件包还提供了一些其它工具。详情可以参阅 autoconf 的 info 文档。针对 autoconf-2.13 的文档译文可以从 这里 获得。
Automake:由于 Makefile.in 仍然可能比较复杂,automake 可以根据程序员编写的 Makefile.am 自动生成 Makefile.in。在调用 automake 时,往往要使用 -a 选项,该选项将自动建立一些项目需要的文件(以建立符号连接的形式),它们是:install-sh、missing、mkinstalldirs、doc/mdate-sh 等等。如果在除了使用 -a 选项外,还使用 -c 选项,则不是在项目目录中制作到系统相应文件的连接,而是将文件复制到项目目录中。 此外,automake 软件包还提供了 aclocal 工具。详情可以参阅 automake 的 info 文档。针对 automake-1.3 的文档译文可以从 这里 获得。
libtool:libtool 是一组 shell 脚本,它运行于 Unix 和 Unix-like 系统上,为程序员提供统一的、可移植的、简化了的,创建、使用共享库的界面。这样程序员就可以便捷地编制在各种 Unix 平台上都可以运行的动态连接库了。
gettext:gettext 提供了编程界面、实用工具,它帮助程序员编写支持多语言的应用程序。
基本步骤
确保 cvs 及 cvs 相关的 环境变量都已得到适当的设置。如何设置 cvs 请参见 cvs 的 info 文档。另外还有一篇关于设置 cvs server 的文档:多用户 CVS 的设置。
创建并进入 nighttask 目录:mkdir nighttask; cd nighttask
提交 nighttask 模块:cvs import -name 'start nighttask' nighttask wangli start
更新 nighttask 模块:cd ..; cvs update nighttask
至此,就有了一个置于 cvs 控制下的 nighttask 的工作目录。
进入工作目录,并编写 configure.in:cd nighttask; vi configure.in
configure.in 是 m4 宏文件,nighttask 的 configure.in 的内容如下,并附说明:
dnl Process this file with autoconf to produce a configure script.
AC_INIT(src/nighttask.c) dnl AC_INIT 用于帮助 configure 脚本确认源代码位置。
AM_INIT_AUTOMAKE(nighttask, 0.0)
dnl AM_INIT_AUTOMAKE 表明本软件需要使用 automake,并且定义了软件包的名称和版本号。
dnl 它分别将变量 PACKAGE 和 VERSION 设定为 "nighttask" 和 "0.0"。
dnl C 程序可以直接使用这两个宏,参见 nighttask.c。
ALL_LINGUAS=""
dnl ALL_LINGUAS 给出本软件支持的非英文文种,目前需暂时给出空。
AC_ARG_ENABLE(debug,
[ --enable-debug Turn on debuggin],
[case "${enableval}" in
yes) debug=true ;;
no) debug=false ;;
*) AC_MSG_ERROR(bad valu ${enableval} for --enable-debug) ;;
esac], [debug=false])
AM_CONDITIONAL(DEBUG, test x$debug = xtrue)
dnl AC_ARG_ENABLE 定义了 configure 可以接受的参数。有了上述定义,就可以在调用 configure
dnl 脚本时给出参数 --enable-debug 或 --disable-debug。而 AM_CONDITIONAL 就据此设定 autoconf
dnl 变量 DEBUG 的值。而后,在 Makefile.am 中,就可以根据 DEBUG 的值,指定不同的编译选项,从而
dnl 确定是否生成调试版本了。
AC_ISC_POSIX dnl 检查头文件是否符合 POSIX 标准
AC_PROG_CC dnl 检查 c 编译器
AC_PROG_LIBTOOL dnl 检查 libtool 是否正确设置
AM_GNU_GETTEXT dnl 检查 gettext 是否正确设置
AC_OUTPUT([Makefile
nighttask.spec
doc/Makefile
intl/Makefile
po/Makefile.in
src/Makefile])
dnl 生成各个文件。以上文件,均由附加 .in 后缀的文件生成。例如,由 nighttask.spec.in 生成
dnl nighttask.spec。由 po/Makefile.in.in 生成 po/Makefile.in。configure 脚本将在所有 .in 文件
dnl 中替换 autoconf 变量,从而生成目标文件。
将 configure.in 提交到 cvs 中:cvs add configure.in; cvs ci -m 'add configure.in' configure.in
编写 Makefile.am,automake 将用该文件生成 Makefile.in:vi Makefile.am
Makefile.am 内容如下:
## Process this file with automake to create Makefile.in
SUBDIRS = doc intl po src dnl 给出各个需创建的子目录
将 Makefile.am 提交到 cvs 中:cvs add Makefile.am; cvs ci -m 'add Makefile.am' Makefile.am
创建各个子目录,其中 doc 用于保存 nighttask 文档;po 用于保存多语言支持文件;src 用于保存源代码:mkdir doc po src
创建以下文件,automake 要检查它们,目前均以简略为要:
cat 'Wang Li <charlesw1234@163.com>' > AUTHORS
cat '' > ChangeLog
cp ../sowhere/COPYING . # 复制您选择的许可证的文本。这里选择的是 GPL。
cat 'configure; make; make install' > INSTALL
cat '' > NEWS
cat '' > README
将这些文件提交到 cvs 中:cvs add AUTHORS ChangeLog COPYING INSTALL NEWS README; cvs ci -m 'add automake required infor files' AUTHORS ChangeLog COPYING INSTALL NEWS README
进入 src 目录,并编写 Makefile.am:cd src; vi Makefile.am
Makefile.am 的内容如下:
## Process this file with automake to create Makefile.in
bin_PROGRAMS = nighttask # 本目录编译生成可执行文件 nighttask。
datadir = $(prefix)/@DATADIRNAME@
localedir = $(datadir)/locale
DEFS = -DLOCALEDIR=\"$(localedir)\" @DEFS@
# 设定 LOCALEDIR,以便主程序调用 setlocale 时使用。
if DEBUG
CFLAGS=-g -Wall
else
CFLAGS=-O2 -Wall
endif
# 根据 DEBUG 变量的值设定 CFLAGS。
nighttask_SOURCES = nighttask.c
# 生成可执行程序 nighttask 必须的源代码文件。