发信人: 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]
  | 
 
 
 |