发信人: dingdang()
整理人: zelor(2001-11-27 10:40:26), 站内信件
|
上一节, 下一节, 回到目录
---------------------------------------------------------------------- ----------
基本概念
下面这些基本概念将有助于了解Automake是如何工作的。
基本操作
Automake读入`Makefile.am'然后生成`Makefile.in'。 `Makefile.am'的宏指示 automake生成更具体的代码。例如 `bin_PROGRAMS'宏将生成编译和连接的代码。
在`Makefile.am'中定义的宏和目标将被拷贝到所生成的文件中。这就允许你将任 意的代码插入到生成的 `Makefile.in'文件中。例如 Automake的发布中包括一个 非标准的 cvs-dist 目标,可以让用户直接从源码控制系统中生成发布的版本。
请注意Automake并不能识别GNU对make的扩展功能。在 `Makefile.am' 中使用这 些扩展将导致错误或不可预料的行为。
Automake尽量以一种智能的方式将注释按相邻的目标(或变量定义)进行分组。
在`Makefile.am'中定义的目标通常会覆盖那些由 automake 自动生成的类似的目 标名字。虽然可以支持这个功能,但应尽量避免使用,因为有时生成规则非常独 特。
同样,在`Makefile.am'中定义的变量也会覆盖由automake 自动生成的变量。这 个功能通常比覆盖目标定义更加有用。但请注意,许多由 automake自动生成的变 量常常仅在内部使用,而且在以后的版本中变量名可能会改变。
在检查变量定义时,Automake会递归地检查定义中的变量引用。例如,在下面的 程序片段中:
xs = a.c b.c
foo_SOURCES = c.c $(xs)
变量 `foo_SOURCES'的值会是 `a.c'、 `b.c'和 `c.c'。
Automake允许加入注释行,它们不会被拷贝到输出文件中。注释行必须以 `##'开 始。
按惯例一般将下面的语句作为 `Makefile.am'的第一行:
## Process this file with automake to produce Makefile.in
深度(depth)
automake支持3种类型的目录层次:"flat"、"shallow"和"deep"。
一个flat的软件包将所有的文件放在一个目录中。在 `Makefile.am'中将不会有 SUBDIRS宏。这种包的例子有 termutils。
一个deep的软件包将所有的源代码都放在子目录中,而顶层目录只包含配置信息 。这种包的很好的例子有GNU的cpio和 tar。顶层目录中的 `Makefile.am'文件中 将会包含 SUBDIRS宏,但没有任何定义目标的宏。
一个shallow的软件包将主要的源码文件放在顶层目录,而将可变的部分(通常是 库文件)放在子目录中。Automake本身就是这样的包(GNU make也是,目前它并未 使用automake)。
严格(strictness)
虽然Automake主要用于GNU软件包的维护者,但也尽量适应那些愿意使用它但又不 愿采用全部GNU规范的用户。
为此,Automake支持3个层次的严格度(strictness)(即符合标准的程度):
`foreign'
Automake只检查那些绝对必须的东西。例如,尽管GNU标准指示应存在一个 `NEW S'文件,但在此模式下就不是必须的。
`gnu'
缺省值。Automake将尽可能地检查是否符合GNU软件包的标准。
`gnits'
Automake将检查是否符合那些尚未完成的Gnits标准。它们基于GNU标准,但更加 详细。
要了解关于严格层次的详细信息,可参考 gnu和gnits的影响。
统一命名方案
Automake的变量通常支持统一命名方案,以使用户更容易了解程序是如何编译以 及如何安装的。这种方案还支持在configure的时候(而不是在make的时候)就可 决定将创建哪些目标。
在make时,一些变量用于确定那些目标将被创建。这些变量称为 主变量(primar y)。例如,主变量PROGRAMS 保存着将被编译和连接的程序的清单。
另外一些变量决定所创建的目标将被安装到何处。这些变量在主变量之后命名, 但是有一个前缀来指示哪一个标准目录将作为安装目录。标准目录在GNU标准中给 出(参见The GNU Coding Standards的`Directory Variables'小节)。 Automake 对这个表作了扩展,包括:pkglibdir、pkgincludedir 和pkgdatadir;对于non -`pkg'的版本也有相同的名字,但加了后缀`@PACKAGE@'。例如:pkglibdir变成 $(datadir)/@PACKAGE@。
对每个主变量,都有一个带有`EXTRA_'前缀的附加变量。该变量用于保存可能会 也可能不会(取决于configure中的设置)被创建的目标清单。之所以需要这个变 量是因为Automake在生成一个可以在所以情况下都可用的`Makefile.in'文件时无 法动态地确定将要创建的目标的完整清单。
例如:cpio在配置时就决定编译哪些程序。一些程序将安装到 bindir目录,而另 一些将安装到sbindir目录:
EXTRA_PROGRAMS = mt rmt
bin_PROGRAMS = cpio pax
sbin_PROGRAMS = @PROGRAMS@
定义一个没有前缀的主变量(如PROGRAMS)会报告一个错误。
应注意在合成变量名时公用的`dir'后缀将被省略,即应命名为`bin_PROGRAMS'而 不是`bindir_PROGRAMS'。
不是每种类型的目标都可被安装到每个目录。当Automake发现错误时会标示出这 些企图。Automake还会识别目录名中一些明显的拼写错误。
有的时候标准目录并不足够。有时将不同的目标分别安装到一些预定义的子目录 中是非常有用的。为此,Automake允许你对安装目录清单进行扩展。如果已有一 个带`dir'后缀的变量被定义(如`zardir'),则一个给定的前缀(如`zar')也是有 效的。
例如,在Automake支持HTML之前,你可用下面的方法安装一个HTML文档:
htmldir = $(prefix)/html
html_DATA = automake.html
特定前缀`noinst'指示该目标将根本不会被安装。
特定前缀`check'指示该目标将不会被创建直到运行 make check命令。
可用的主变量名有:`PROGRAMS', `LIBRARIES', `LISP', `SCRIPTS', `DATA', `HEADERS', `MANS', `TEXINFOS'.
派生变量如何命名
有时一个Makefile的变量名是由用户提供的文本生成的。例如程序名被重写为 M akefile宏名。Automake将规范这个文本,所以它不会跟随Makefile的变量命名规 则。名字中的所有字符,除了字母、数字和下划线之外,在生成宏引用时都将被 转换成下划线。例如,如果程序名为sniff-glue,则派生名会是 sniff_glue_SO URCES而不是sniff-glue_SOURCES。
---------------------------------------------------------------------- ----------
上一节, 下一节, 回到目录
-- ※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.104.84.141]
|
|