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