分类:
2008-04-08 16:35:31
本章介绍两种生成 OpenSolaris 的常用方法:nightly(1)/bldenv(1) 和 make(1)/dmake(1)。前者对完整或增量生成整个 工作区的每个步骤提供较高程度的自动和精确控制。直接使用 make(1)
或 dmake(1)
提供的自动控制较低,但生成单个组件的速度更快。第 4.1 节适用于这两种方法;第 4.2 节介绍 nightly(1)
和 bldenv(1),第 4.3 节介绍如何使用低级 make(1)
目标。最后,第 4.4 节介绍完整生成的结果以及如何使用这些中间产品。本章中的说明适用于 ON 和类似整合,包括 SFW 及网络存储 (Network Storage, NWS)。其他整合的生成过程可能完全不同,应在此处进行引入。
本节介绍一些影响所有 ON 生成的环境变量(无论生成方法如何)。有关影响 nightly(1)
和 bldenv(1)
的环境变量和文件的信息,请参见 4.2 使 用 nightly 和 bldenv。
此变量通常由 TeamWare(Sun 的内部源代码管理系统)使用。尽管不使用 TeamWare 的 工作区不需要此变量,但在设置其他变量时有时会引用此变量。应将其设置为工作区的根。强烈建议使用 bldenv(1)
来设置此变量,因为它还将同时设置其他几个重要变量。有关 bldenv(1)
的更多信息,请参见第 .3.3.2 节。
必须将此变量设置为工作区中的 ON 源文件树的根,即 ${CODEMGR_WS}/usr/src。此变量供许多 makefile 和 nightly(1)
使用。仅在生成时才需要此变量。bldenv(1) 将为您正确设置此变量。
uname -p 指定的计算机的指令集体系结构,例如 sparc、i386。仅在生成时才需要此变量。bldenv(1) 将为您正确设置此变量,请不要更改。如果您愿意,也可在 dot 文件中设置此变量,并使用它定义所需的 PATH 及任何其他变量。如果手动设置此变量,请勿将其设置为非 ``/usr/bin/uname -p'' 输出(所使用的特定计算机上)的任何内容:
正确:
MACH=`/usr/bin/uname -p`
错误:
MACH=sparc
用于生成的样例区域的根。makefile 通过生成命令和其他目标,将头文件和库的安装定向到此区域并指示对这些文件的引用。应使用 $CODEMGR_WS 来表示该变量。有关样例区域的更多信息,请参见第 4.4.1 节。如果使用 bldenv(1),则此变量将设置为 ${CODEMGR_WS}/proto/root_${MACH}。
PARENT_ROOT 是父工作区的样例区域。使用此变量可通过引用父工作区中的已安装文件,在子工作区中执行部分生成。设置此变量为可选操作。
此变量与 OpenSolaris 无关,但是,为使生成正常工作,make(1) 必须可以访问本节所述的环境变量的内容。因此,应设置 MAKEFLAGS 环境变量,并使其至少包含 ``e''。b ldenv(1) 将为您设置此变量;仅在生成时才需要此变量。如果直接通过 make(1)
或 dmake(1)
进行生成,则可使用 ``make -e'' 来代替此变量,但强烈建议您使用 MAKEFLAGS。
缺省情况下, /ws/onnv-tools/SUNWspro/SOS8
(该路径在 Sun 内部使用)中可能会安装工作编译器。可以设置此变量以覆盖该位置;由于您可能未在该缺省位置中安装编译器,因此通常需要将此变量设置为 /opt/SUNWspro
。通过查看 usr/src/Makefile.master
,可以了解此变量的工作方式;但是,如果需要覆盖该缺省位置,则应通过该环境变量来执行。请注意, opensolaris.sh
已将此变量设置为该值。
``V'' 表示版本。在 Sun 中,在 ${SPRO_ROOT}
下安装了多个编译器版本,以便为生成较早版本的源文件提供支持。由于编译器本身可能位于 ${SPRO_VROOT}/bin/cc
中,因此您很可能需要将此变量设置为 /opt/SUNWspro
。请注意, opensolaris.sh
已将此变量设置为该值。
缺省情况下,GNU C 编译器用于为 amd64 系统生成 64 位内核。缺省情况下,如果在 x86 主机上生成,则生成系统会假定 /usr/sfw
中安装了工作 amd64 gcc。尽管建议不要这样做,但是通过将此变量设置为 gcc 安装根目录,可以使用其他 gcc。有关更多信息,请参见 usr/src/Makefile.master
。
这些变量用于控制 gcc 的使用。__GNUC 控制 gcc 的使用以生成 i386 和 sparc(32 位)二进制文件,而 __GNUC64 控制 gcc 的使用以生成 amd64 和 sparcv9(64 位)二进制文件。将这些变量设置为空值, 可以 使用 gcc 来生成相应的二进制文件。将这些变量设置为 '#'
,可将 Studio 用作主编译器。缺省设置将 Studio(并行调用了 gcc)用作“阴影” 编译器,以确保代码保持警告和错误 clean。
此变量指示 ON makefile 是否查找不公开的源代码树。通常,nightly(1) 和 bldenv(1)
会自动设置此变量。有关更多详细信息,请参见 3.2.8 未包含 的源文件。
生成任何整合包括多个步骤;ON 的生成过程需要创建样例区域、编译和链接二进制文件、生成 lint 库和对源文件执行 lint 操作、生成软件包和 BFU 归档文件以及检验头、打包和样例区域更改。幸运的是,一个称为 nightly(1)
的实用程序可以自动完成所有这些步骤及其他任务。该实用程序由一个环境文件控制,此环境文件通过 bldenv(1)
实现格式共享。本节介绍 nightly(1)
执行的操作、不会执行的操作及其使用方法。
nightly(1)
可以自动执行大多数生成过程和源级别检查过程。它可生成源文件、生成 BFU 归档文件、生成软件包、运行 lint(1)、执行语法检查以及创建并检查样例区域。它不会执行任何运行时测试,如单元、功能或回归测试;理论上,必须在专用系统上分别执行这些测试。
无论其名称如何,均可手动或通过 cron(1M)
随时运行 nightly(1);您必须亲自运行该实用程序,或安排在每次要执行生成时运行一次。nightly(1) 不会启动任何守护进程或重复性后台活动:它会按照您的指示执行一次,然后停止。
每次运行后,nightly(1) 都会详细记录所运行的命令及其输出;相关信息通常位于 $CODEMGR_WS/log/log.MMDD/nightly.log 中(其中 MMDD 表示日期),但 可根据需要进行更改。如果已存在此类日志,则 nightly(1)
会对其重命名。
除详细日志外,您(实际上是 MAILTO 环境变量中指定的地址)还会在 nightly(1)
完成时收到一份简短的完成报告。该报告将通知您有关检测到的任何错误或警告信息,以及完成每个步骤所需的时间。该报告会将错误和警告列为与以前生成(如果存在一个)的差异;这样您便可以查看更改(如果有)的效果。它还意味着,如果尝试一个生成,但该生成失败,然后更正问题并重新生成,将会显示与以下类似的信息:
< dmake:Warning: Command failed for target `yppasswd'
< dmake:Warning: Command failed for target `zcons'
< dmake:Warning: Command failed for target `zcons.o'
< dmake:Warning: Command failed for target `zdump'
请注意,``<'' 表示此输出用于以前版本。如果输出前面带有 ``>'',则表示该输出与最新版本关联。采用这种方式,即可查看是否已更正所有问题或引入了新问题。
nightly(1)
接受多种控制其行为的选项和标志。许多选项用于控制 nightly(1)
是否执行可自动完成的每个步骤。可以在环境文件或命令行中指定这些选项;应首选在命令行中指定选项。请参见 nightly(1)。
nightly(1)
可读取一个包含用于生成的环境定义集的文件。该文件是一个简单的 shell 脚本,但通常仅包含变量赋值。在 2.5 环境变量一节和以下 4.2.3 变量中介绍的所有变量,都可在 nightly(1)
环境文件中设置;但是,常见做法是使用开发者、门管理员或 opensolaris 环境文件,并根据需要修改其中一个文件以满足您的要求。然后,将所得的环境文件的名称作为最后一个参数传递给 nightly(1)。usr/src/tools/env 中提供了环境文件样例。
尽管可在 nightly(1)
环境文件中设置任何环境变量,但本节仅列出了 nightly(1)
直接用于控制其操作的环境变量以及通常会更改的环境变量。有关变量和选项的完整列表,请参见 nightly(1)。
虽然 nightly(1)
可以自动完成整个生成过程(包括源级别检查和生成其他生成产品),但它并非总是必需的。如果您正在处理单个子目录,并且仅希望生成或 lint 该子目录,则通常可以直接执行此操作,而不必使用 nightly(1)。这尤其适用于内核,并且如果未对 工作区的任何其他部分执行更改,则在中间测试过程中还可利用该方法仅生成并安装内核。有关安装测试内核的更多信息,请参见第 5.2 节。
在工作区的任何部分上直接使用 make(1)
之前,需要正确设置环境。可以使用 bldenv(1)
完成此操作;有关此命令的更多信息,请参见 3.4.1 准 备工作和 4.2 使用 nightly 和 bldenv。
由于 makefile 会使用许多 make(1)
功能,因此某些版本的 make 将无法正常工作。具体而已,不能使用 BSD make 或 GNU make 来生成工作区。 OpenSolaris 工具分发中提供的 dmake(1)
可以正常工作,/usr/ccs/bin 中随 Solaris 和某些其他分发一同提供的 make(1)
也可以正常工作。如果 dmake 的版本较旧(或在某些情况下较新),则可能会意外失败。尽管 dmake(1)
和 make(1)
均可使用,但通常建议使用 dmake(1),因为 dmake(1)
可以并行运行多个任务,甚至可将任务分发到其他生成服务器。这样可以显著减少生成时间。
使用整个 uts 目录,可以在特定生成子目录中运行 make 命令(参见第 3.3.2 节至第 3.3.6 节),以便仅完成只在该特定子目录上请求的生成步骤。大多数 cmd 和部分 lib 子目录也允许执行此操作;但是,尚未正确配置某些 makefile 以重新生成所有相关性。通常,使用新式对象文件布局(参见第 3.3.2 节)的所有子目录应正常工作。
有几个有效目标适用于所有目录;要查明适用于所关注目录的目标和可用的其他目标,需要读取该目录的 makefile。
以下是一些通用目标:
all
在对象目录中生成所有派生对象。
install
在 ${ROOT} 定义的样例区域中安装派生对象。
install_h
在 ${ROOT} 定义的样例区域中安装头文件。
clean
删除中间对象文件,但不删除“完成的”派生文件,例如可执行程序、库或内核模块。
clobber
删除所有派生文件。
check
执行特定于源的检查,例如源和头样式一致性。
lint
生成 lint 库,并针对将用于在当前目录中生成对象的所有代码运行所有相应的 lint 操作。
完整生成的源文件树本身并无太大用处;构成系统的二进制文件、脚本和配置文件仍然分散在整个树中。makefile 提供了 install 目标以生成样例区域和软件包树,并且其他实用程序可用于构建生成产品的其他聚集体,以便为集成到整个 Wad Of Stuff 生成,或安装到一个或多个系统中进行测试和进一步开发做好准备。nightly(1) 程序可以自动生成每个生成产品。或者,可使用安装程序(参见第 5.2 节)从完整生成的 usr/src/uts 直接构造内核安装归档文件。
第 4.4.1 节介绍了样例区域、最基本的生成对象集合以及生成系统生成的第一个对象。第 4.4.2 节介绍了 BFU 归档文件,该文件使用基于 OpenSolaris 的完全分发安装将系统升级到最新的 ON 位。第 4.4.3 节介绍了 ON 可传送项的软件包树的构造。
安装目标使二进制代码和头安装在称为样例区域的分层结构中。由于样例区域中的所有项都使用其相对于样例区域根的常规路径进行安装,因此完整的样例区域与 ON 位的完全系统安装类似。但是,任意用户都可以构造样例区域,因此其内容的拥有权和权限将与实时系统中的拥有权和权限不匹配。样例区域的根由环境变量 ROOT 定义,其缺省值为 /proto。如果使用 bldenv(1)
设置环境,则 ROOT 的缺省值为 ${CODEMGR_WS}/proto/root_${MACH}。
如果需要将生成的特定文件复制到实时系统,则样例区域会很有用。样例区域还通过 protocmp 和 checkproto 等工具与父项的样例区域和打包信息进行比较,以便检验是否由于更改了源而仅更改了预期提供的文件。
protocmp 未提供手册页。其调用如下所示:
protocmp [-gupGUPlmsLv] [-e...] -d
[-d...] [ dir>...]| ]
其中:
-g : 不比较组
-u : 不比较属主
-p : 不比较权限
-G : 设置组
-U : 设置属主
-P : 设置权限
-l : 不比较链接计数
-m : 不比较主/次编号
-s : 不比较符号链接值
-d:
要检查的样例列表或打包信息
-e:例外文件
-L : 列出过滤后的例外项
-v : 详细输出
如果指定任何 -[GUP] 标志,则最后一个参数必须是原始根目录本身,以在其上根据通过 -d 选项指定的打包数据设置权限。
样例列表是一个文本文件,其中包含有关样例区域中每个文件的信息,每个文件的信息占一行。该信息包括:文件类型(纯文本、目录、链接等)、全路径、链接目标、权限、属主 UID、属主 GID、i 编号、链 接数、主编号和次编号。您可以使用 protolist 命令生成样例列表,该命令未提供手册页。其调用如下所示:
$ protolist
其中,protoroot 是样例区域根(通常为 $ROOT)。重定向其输出将生成适合通过 -d 选项或作为最后一个参数传递给 protocmp 的文件。
protocmp 的最后一个参数始终指定要检查或比较的样例列表或样例区域根。如果指定 -d 选项并将样例列表文件作为其参数,则将比较本地样例区域和指定的引用样例列表,并且会提供在本地样例区域中添加、缺失或更改的文件列表。如果指定 -d 选项并将软件包定义目录作为其参数,则将依据软件包说明提供的定义检查本地样例区域,并且会提供有关差异的信息。
例外文件 (-e) 指定样例区域中不会被检查的文件。这很重要,因为若未指定此项 protocmp 会期望样例区域中安装的、不属于任何软件包的所有文件都在样例区域中显示软件包定义错误或伪文件。& amp; lt; /p>
在 nightly(1)
生成过程中,只要选项中未包含 -N 选项,则会自动运行此比较。有关在自动生成过程中自动比较样例的更多信息,请参见 nightly(1)
和第 4.2 节。
作为使用 protolist 和 protocmp 的一种快捷方式,可以使用 SUNWonbld 软件包中找到的 ``checkproto'' 命令。此实用程序未提供手册页,但具有简单的调用语法:
$ checkproto [-X]
将选择例外文件和打包信息,并且会自动生成必需的样例列表。对于 nightly(1),使用 -X 选项将指示 checkproto 检查实模式子树的内容,一般情况下不会生成该子树。
在 usr/src/tools 中,可以查找 protolist、protocmp 和 checkproto 的源。所得的二进制文件包含在 SUNWonbld 软件包中。
BFU 归档文件是 cpio 格式的归档文件(参见 cpio(1)
和 archives(4)), bfu(1)
使用它在实时系统中安装 ON 二进制文件。有关使用 bfu(1)
的实际过程的详细信息,请参见该手册页和第 5.3 节。
BFU 归档文件是通过 mkbfu 生成的,后者未提供手册页。其调用如下所示:
$ mkbfu [-f filter] [-z] proto-dir archive-dir
使用 -f 选项,可以指定将应用于 cpio 归档文件的过滤器程序。这通常用于为归档文件设置适当的权限,详细信息如下所述。
-z 选项将导致使用 gzip(1)
压缩 cpio 归档文件。如果同时指定 -f 和 -z,则会在应用 -f 指定的过滤器后进行压缩。
proto-dir 是第 4.4.1 节中所述的样例区域根,通常由 ROOT 环境变量指定。
archive-dir 是将其中创建归档文件的目录。如果不存在,则会为您创建该目录。
但是,``mkbfu'' 很少使用。相反,``makebfu'' 提供了一种更简单的替代方法。它没有手册页,但调用很简单:
$ makebfu [filename]
如果指定参数,则参数将引用适用于 nightly(1)
或 bldenv(1)
的环境文件。否则,``makebfu'' 会假定已使用 bldenv(1)
或等效实用程序相应地设置环境。
'makebfu' 是一种基于 'mkbfu' 的包装,用于将软件包和环境信息填充到
'cpiotranslate',以便为归档文件构造相应的过滤器。此过滤器的用途是设置
正确的模式、属主以及对归档文件进行分组。要允许使用普通用户特权进
行生成操作生成包含正确元数据的 BFU 归档文件,需要此过滤器。如果没
有超级用户权限,进行生成操作的用户将无法为样例区域中的文件设置权
限和拥有权;如果不进行过滤,BFU 使用的 cpio 归档文件将属于进行生
成操作的用户所有,并且可能具有错误的权限。'cpiotranslate' 使用软件包
定义来解决这两个问题。要了解其工作方式,请参见
usr/src/tools/protocmp/cpiotranslate.c。
每个归档文件都包含一个原始区域子集。特定于平台的目录会分成不同的归档文件(由于只需安装特定于平台的必要文件,因此这可简化在某些系统上的安装),如 /、/lib、/sbin 等。只有阅读最新版本的 mkbfu,才可准确了解归档文件包含的详细信息。
如果选项中包含 -a,则会在 nightly(1)
生成过程中自动生成 BFU 归档文件。此外,如果选项中包含 -z,则也会将其传送给 mkbfu。有关在自动生成过程中自动构造 BFU 归档文件的更多信息,请参见 nightly(1)
和第 4.2 节。
mkbfu 和 makebfu 是 SUNWonbld 软件包中提供的 Korn shell 脚本。其源文件位于 usr/src/tools/scripts 中。
cpiotranslate 是 SUNWonbld 软件包中提供的一种 C 程序。其源代码位于 usr/src/tools/protocmp/cpiotranslate.c 中。
通过原始区域(请参见第 4.4.1 节)中安装的文件,可以生成普通的 SVR4 软件包。此操作是在成功的生成过程中,通过主 makefile 的 all 和 pkg_all 目标(请参见 usr/src/Makefile)自动完成的。位于 usr/src/pkgdefs 中的定义用于生成所有软件包;每个子目录都包含用于生成该软件包的软件包定义和 makefile 片段。生成的软件包源于 usr/src/packages 目录中,并采用标准格式。有关如何生成软件包的更多信息,请参见 pkgmk(1)。
如果选项中包含 -p,则会在 nightly(1)
生成过程中自动生成软件包。有关在自动生成过程中自动构造软件包的更多信息,请参见 nightly(1)
和第 4.2 节。
SVR4 软件包与通过其他操作系统提供的软件包类似;其中包含要安装的文件、有关这些文件的元数据、用于在安装和删除过程中执行任务的脚本,以及软件包本身的相关信息。尽管使用的数据实际格式可能有所不同,但所有一般概念都是相同的。不过,OpenSolaris 提供的软件包的粒度往往比构成大多数 GNU/Linux 分发版本的软件包的粒度更粗糙。例如,SUNWcsu 包含大部分的核心系统命令和内核组件;典型的 GNU/Linux 分发可能会在十个或更多不同软件包中提供等效功能。大多数 OpenSolaris 软件包都基于文件的位置(是位于根文件系统,还是位于 /usr 子目录中)分开打包。这主要是为了适应无盘客户机的安装,无盘客户机可能在文件服务器上具有共享的 /usr。Solaris 以外的分发可能会以不同方式打包系统组件。
pkgmk(1)
是 SUNWpkgcmdsu 软件包的一部分。其源文件不属于 ON 整合。