精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>● 软件开发>>没有规矩,不成方圆----文档与标准化>>AutoMake简要说明——目录>>AutoMake简要说明(3)

主题:AutoMake简要说明(3)
发信人: 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]

[关闭][返回]