精华区 [关闭][返回]

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

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

[关闭][返回]