发信人: dingdang()
整理人: zelor(2001-11-27 10:40:26), 站内信件
|
第一节, 上一节, 下一节, 最后一节, 回到目录
---------------------------------------------------------------------- ----------
一些软件包的例子
一个简单的例子
假定你刚刚完成一个叫做zardoz的程序,并且你已经使用 autoconf提供了一个可 移植的框架,但是`Makefile.in' 文件已经是ad-hoc的。你为了使它们变得牢固 (bulletproof, 原意是防弹的),因此你准备使用automake。
第一步是在`configure.in'中加入automake所需的命令,最简单的方法就是在调 用AC_INIT之后马上调用 AM_INIT_AUTOMAKE:
AM_INIT_AUTOMAKE(zardoz, 1.0)
由于程序中没有任何导致复杂化的因素(比如:它没有使用gettext, 也不需要创 建共享库), 那么到此工作就完成了。瞧,多简单。
此时你必须重新生成`configure',但在此之前,你还需要告诉 autoconf如何找 到你所用到的新的宏。最简单的方法就是利用aclocal程序自动生成`aclocal.m4 '文件。 aclocal运行你将自己编写的宏放在`acinclude.m4' 文件中,可运行下 面的命令:
mv aclocal.m4 acinclude.m4
aclocal
autoconf
现在你可以开始为zardoz编写`Makefile.am'文件。 zardoz是一个用户程序,因 此你希望将它安装到其它用户程序所在的目录。zardoz还有一些Texinfo文档。你 的 `configure.in'脚本使用了AC_REPLACE_FUNCS, 所以你还需要连接`@LIBOBJS @'。下面就是你编写的内容:
bin_PROGRAMS = zardoz
zardoz_SOURCES = main.c head.c float.c vortex9.c gun.c
zardoz_LDADD = @LIBOBJS@
info_TEXINFOS = zardoz.texi
现在你可以运行automake --add-missing来生成 `Makefile.in'文件,并取得所 需的辅助文件,工作即可完成。
一个经典的程序
hello是一个著名的示例程序。这一节将演示如何使用 Automake来生成Hello包。 下面所用的GNU的Hello程序。
当然,GNU Hello比传统的Hello程序功能更抢。GNU Hello已被国际化,可处理选 项,有文档和测试脚本。GNU Hello是一个deep类型的包。
下面是GNU Hello的`configure.in'文件的内容:
## Process this file with autoconf to produce a configure script.
AC_INIT(src/hello.c)
AM_INIT_AUTOMAKE(hello, 1.3.11)
AM_CONFIG_HEADER(config.h)
## Set of available languages.
ALL_LINGUAS="de fr es ko nl no pl pt sl sv"
## Checks for programs.
AC_PROG_CC
AC_ISC_POSIX
## Checks for libraries.
## Checks for header files.
AC_STDC_HEADERS
AC_HAVE_HEADERS(string.h fcntl.h sys/file.h sys/param.h)
## Checks for library functions.
AC_FUNC_ALLOCA
## Check for st_blksize in struct stat
AC_ST_BLKSIZE
## internationalization macros
AM_GNU_GETTEXT
AC_OUTPUT([Makefile doc/Makefile intl/Makefile po/Makefile.in \
src/Makefile tests/Makefile tests/hello],
[chmod +x tests/hello])
以`AM_'开头的宏为Automake所提供(或是Gettext库); 其余的都是标准的Autoco nf宏。
顶层目录的`Makefile.am'文件:
EXTRA_DIST = BUGS ChangeLog.O
SUBDIRS = doc intl po src tests
正如你所见到的,所有的工作实际上都是在子目录中完成的。
`po'和`intl'目录是利用gettextize 自动生成的,此处不予讨论。
`doc/Makefile.am'文件:
info_TEXINFOS = hello.texi
hello_TEXINFOS = gpl.texi
这些命令已足以创建、安装和分发Hello的文档。
`tests/Makefile.am'文件:
TESTS = hello
EXTRA_DIST = hello.in testdata
`hello'脚本是由configure生成的,仅用于测试。运行make check将会执行该测 试。
`src/Makefile.am'文件(完成真正的工作):
bin_PROGRAMS = hello
hello_SOURCES = hello.c version.c getopt.c getopt1.c getopt.h system.h
hello_LDADD = @INTLLIBS@ @ALLOCA@
localedir = $(datadir)/locale
INCLUDES = -I../intl -DLOCALEDIR=\"$(localedir)\"
创建etags和ctags
这是另一个trickier的例子,将演示如何从一个源码文件(`etags.c') 生成两个 程序(ctags和etags)。不同的只是在编译时使用不同的cpp选项。
bin_PROGRAMS = etags ctags
ctags_SOURCES =
ctags_LDADD = ctags.o
etags.o: etags.c
$(COMPILE) -DETAGS_REGEXPS -c etags.c
ctags.o: etags.c
$(COMPILE) -DCTAGS -o ctags.o -c etags.c
请注意ctags_SOURCES的值是空的,意味着没有隐含的值可用于替换。因为隐含值 已被用于从`etags.o'生成etags。
ctags_LDADD is used to get `ctags.o' into the link line. ctags_DEPENDE NCIES is generated by Automake.
如果你的编译器不能同时支持`-c'和`-o'选项,则上面的规则将无法工作。最简 单的解决办法是引入一个伪造(bogus)的依赖 (以避免在并行make中出现问题):
etags.o: etags.c ctags.o
$(COMPILE) -DETAGS_REGEXPS -c etags.c
ctags.o: etags.c
$(COMPILE) -DCTAGS -c etags.c && mv etags.o ctags.o
当使用了de-ANSI-fication特征时,上面的显式规则仍然不能工作,此时需要一 点额外的工作:
etags._o: etags._c ctags.o
$(COMPILE) -DETAGS_REGEXPS -c etags.c
ctags._o: etags._c
$(COMPILE) -DCTAGS -c etags.c && mv etags._o ctags.o
---------------------------------------------------------------------- ----------
第一节, 上一节, 下一节, 最后一节, 回到目录
-- ※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.104.84.141]
|
|