Archive for 三月, 2007

我从山中来
带着兰花草
种在小园中
希望花开早
一日看三回
看的花时过
兰花却依然
苞也无一个
转眼秋天到
移兰入暖房
朝朝频顾惜
夜夜不能忘
期待春花开
能将宿愿偿
满庭花处处
添的许多香
wo~~~~~~~wo ~~~~~~~~

\r\n

 

\r\n

=====================

\r\n

小宝宝特喜欢听这个,所以放上。

\r\n


视频: 兰花草

摘自”厦门商报“的一段新闻:
\r\n按国民经济行业分组情况来看,在全市19个大类行业中,金融业月人均工资达6238元,居各行业首位;信息传输、计算机服务和软件业月人均工资4797元,居第二位;公共管理和社会组织月人均工资4660元,居第三位。

\r\n \r\n

\r\n 信息传输、计算机服务和软件业月人均工资4797元

还离得好远好远。。。。

\r\n \r\n
    你以為你找得到
  因為你不知道我
  我是一顆洋蔥
  我沒有心
  剝開我
  你只會流淚
\r\n \r\n

\r\n
男人好比洋葱,你要想看见他的心,你就需要一层一层的去剥,剥的过程中你会不短的流泪,剥到最后才发现,洋葱是没有心的!
\r\n

\r\n \r\n

\r\n

级别: 初级

Dan Poirier (poirier@us.ibm.com), 软件工程师, IBM

2001 年 11 月 01 日

RPM\r\n是广泛使用的用于交付 Linux 软件的工具,用户可以轻松的安装用 RPM 打包的产品。在本文中(系列文章的第 1 篇),IBM 软件工程师\r\nDan Poirier 向您演示如何在 Red Hat Linux 7.1 系统上用 RPM 打包简单软件。

\r\n\r\n\r\n

RPM(Red Hat Package Manager)是用于 Linux\r\n分发版(distribution)的最常见的软件包管理器。因为它允许分发已编译的软件,所以用户只用一个命令就可以安装软件。

\r\n

RPM 是 Linux“标准基本库”版本 1.0.0 指定的安装工具。在 Linux\r\n分发版前 10 名中,有 8 个是基于 RPM(请参阅“Comparison of Linux\r\nDistributions”,它位于本文后面的\r\n 参考资料中列出的 distrowatch.com\r\n上)。即使某些通常不使用 RPM 的分发版,如 Debian,也有可用工具将\r\nRPM 转换成它们自己的格式。在 Linux\r\n上,对于除开发人员以外的任何人,RPM\r\n也是用来打包软件的最佳选择。\r\n

\r\n

不论您是自己开发软件,还是通过提供代码以从中创建 RPM\r\n软件包向开放源码项目提供帮助,本文都会帮助您入门。顺便要说的是,本系列的后续文章会涉及下列主题:构建\r\nRPM 软件包而未必是 root\r\n用户,在构建软件之前为其打补丁,安装和卸载时运行脚本以及在安装或卸载\r\n \r\n其它软件包时运行脚本。\r\n

\r\n

简单实例

\r\n

我将从简单的实例开始,主要使用 RPM\r\n缺省值。然后,我会添加上几个可选特性。

\r\n

RPM\r\n软件包从源文件形式的程序开始,作好了编译准备。我不想创建一个没有实际意义的示例,而是选择使用\r\nGNU Indent 程序(请参阅\r\n 参考资料)。\r\n

\r\n

在 Linux 下创建 Indent 非常容易。 indent-2.2.6.tar.gz\r\n文件位于当前目录之中,所有您要做的就是:

\r\n

手工构建 indent
\r\n \r\n

$ tar xzf indent.2.2.6.tar.gz$ cd indent-2.2.6$ ./configure$ make$ make install

\r\n

如果您已经构建过很多开放源码项目,那么这可能看起来很熟悉。 \r\n unpack;./configure;make;make\r\ninstall 序列是典型的使用 GNU 自动配置(autoconf)工具的软件。因为这太普通了,所以我在这里描述的关于 indent 的大部分东西,几乎不加改变就可以用于其它开放源码项目。\r\n

\r\n

现在假设您正在使用 Red Hat 7.1。在本文的后面,我将给出一些\r\n 在其它 Linux 分发版上使用 RPM 的建议。\r\n

\r\n

在 Red Hat 7.1 上,\r\n 在继续以前,请确保您已安装了 rpm-build\r\n软件包。为检查是否安装,请运行 \r\n rpm -q\r\nrpm-build 。您应该看到一些类似于 \r\n rpm-build-4.0.2-8 \r\n的信息(版本可能会不同)。如果您看到的是 \r\n package rpm-build is\r\nnot installed ,则将需要从 Red Hat 安装 CD 上安装它。\r\n

\r\n

制作基本 RPM 软件包

\r\n

\r\n为了构建 RPM 软件包,您需要写一个名为 \r\n spec 文件的 RPM\r\n输入文件,该文件告诉 RPM 如何构建和打包您的软件。编写 spec\r\n文件您需要:\r\n

\r\n

  1. 创建文件\r\n indent-1.spec,如下所示。您可以任意地给它命名并把它放到任何地方;RPM\r\n对这些没有要求。\r\n
  2. 以 root 用户登录。
  3. 将 indent-2.2.6.tar.gz 文件复制到\r\n/usr/src/redhat/SOURCES。
  4. 运行 \r\n rpm -ba indent-1.spec ,将 indent-1.spec\r\n改为您使用的名字。\r\n

\r\n

第一个 spec 文件:indent-1.spec
\r\n \r\n

Summary: GNU indentName: indentVersion: 2.2.6Release: 1Source0: %{name}-%{version}.tar.gzLicense: GPLGroup: Development/Tools%descrīptionThe GNU indent program reformats C code to any of a variety offormatting standards, or you can define your own.%prep%setup -q%build./configuremake%installmake install%files%defattr(-,root,root)/usr/local/bin/indent%doc /usr/local/info/indent.info%doc %attr(0444,root,root) /usr/local/man/man1/indent.1%doc COPYING AUTHORS README NEWS

\r\n

您应该看到 RPM 解包这个 tar 文件,编译并安装它。 在 Red Hat 7.1\r\n上,工作目录将是 /usr/src/redhat/BUILD。

\r\n

最后,RPM 将创建两个 RPM 文件。将在\r\n/usr/src/redhat/SRPMS/indent-2.2.6-1.src.rpm 中创建一个源 RPM\r\n文件,而在 /usr/src/redhat/RPMS/i386/indent-2.2.6-1.i386.rpm\r\n中创建一个二进制 RPM 文件。

\r\n

源 RPM 文件简单地捆绑了 spec\r\n文件和构建软件包用到的所有源文件和补丁文件。如果您选择分发它,则其他人可以很容易地用它重建您的软件。二进制\r\nRPM 文件仅包含已编译的软件和如何安装的信息。

\r\n

RPM 做什么

\r\n

\r\n下面总结了在您运行 \r\n rpm -ba filename.spec 时,RPM\r\n都做些什么:\r\n

\r\n

  • 读取并解析 filename.spec 文件
  • 运行 \r\n %prep \r\n部分来将源代码解包到一个临时目录,并应用所有的补丁程序。\r\n
  • 运行 \r\n %build 部分来编译代码。\r\n
  • 运行 \r\n %install \r\n部分将代码安装到构建机器的目录中。\r\n
  • 读取 \r\n %files \r\n部分的文件列表,收集文件并创建二进制和源 RPM 文件。\r\n
  • 运行 \r\n %clean 部分来除去临时构建目录。\r\n

\r\n

spec 文件的内容

\r\n

\r\nspec 文件有几个部分。第一部分是未标记的;其它部分以 \r\n %prep 和 \r\n %build 这样的行开始。\r\n

\r\n

\r\n \r\n
\r\n第一部分(未标记)定义了多种信息,其格式类似电子邮件消息头。\r\n

\r\n

\r\n Summary 是一行关于该软件包的描述。\r\n

\r\n

\r\n \r\n Name 是该软件包的基名, \r\n Version \r\n是该软件的版本号。 \r\n Release 是 RPM 本身的版本号 ―\r\n如果修复了 spec 文件中的一个错误并发布了该软件同一版本的新\r\nRPM,就应该增加发行版号。\r\n

\r\n

\r\n License 应该给出一些许可术语(如:“GPL”、“Commercial”、“Shareware”)。\r\n

\r\n

\r\n Group\r\n标识软件类型;那些试图帮助人们管理 RPM 的程序通常按照组列出 RPM。您可以在\r\n/usr/share/doc/rpm-4.0.2/GROUPS 文件看到一个 Red Hat 使用的组列表(假设您安装的 RPM 版本是\r\n4.0.2)。但是您还可以使用那些组名以外的名称。

\r\n

\r\n \r\n Source0 、 \r\n Source1 等等给这些源文件命名(通常为\r\ntar.gz 文件)。 \r\n %{name} 和 \r\n %{version} 是\r\nRPM 宏,它们扩展成为头中定义的 rpm\r\n名称和版本。因此,在这个实例中, \r\n Source0 被设置为 \r\n indent-2.2.6.tar.gz 。\r\n

\r\n

不要在 \r\n Source\r\n语句中包含任何路径。缺省情况下,RPM 会在 /usr/src/redhat/SOURCES\r\n中寻找文件。请将您的源文件复制或链接到那里。(要使 spec\r\n文件尽量可移植的话,应当尽量避免嵌入自己开发机器上的假想路径。其他开发人员就可以指示 RPM 在别的目录下查找源文件,而不用修改您的 spec\r\n文件。)

\r\n

\r\n 描述\r\n
\r\n接下来的部分从 \r\n %descrīption \r\n行开始。您应该在这里提供该软件更多的描述,这样任何人使用 \r\n rpm\r\n-qi \r\n查询您的软件包时都可以看到它。您可以解释这个软件包做什么,描述任何警告或附加的配置指令,等等。\r\n

\r\n

\r\n Shell 脚本\r\n
\r\n下面几部分是嵌入 spec 文件中的 shell 脚本。\r\n

\r\n

\r\n \r\n %prep 负责对软件包解包。在最常见情况下,您只要用 \r\n %setup 宏即可,它会做适当的事情,在构建目录下解包源\r\ntar 文件。加上 \r\n -q 项只是为了减少输出。\r\n

\r\n

\r\n \r\n %build 应该编译软件包。该 shell\r\n脚本从软件包的子目录下运行,在我们这个例子里是 indent-2.2.6\r\n目录,因而这常常与运行 \r\n make 一样简单。\r\n

\r\n

\r\n \r\n %install 在构建系统上安装软件包。这似乎和 \r\n make install \r\n一样简单,但通常要复杂些。我将在下面解释这点。\r\n

\r\n

\r\n 文件列表\r\n
\r\n \r\n %files 列出应该捆绑到 RPM\r\n中的文件,并能够可选地设置许可权和其它信息。\r\n

\r\n

在 \r\n %files 中,您可以使用\r\n 一次\r\n \r\n %defattr \r\n来定义缺省的许可权、所有者和组;在这个示例中, \r\n %defattr(-,root,root) \r\n会安装 root 用户拥有的所有文件,使用当 RPM\r\n从构建系统捆绑它们时它们所具有的任何许可权。\r\n

\r\n

可以用 \r\n %attr(permissions,user,group) 覆盖个别文件的所有者和许可权。\r\n

\r\n

可以在 %files 中用一行包括多个文件。

\r\n

可以通过在行中添加 \r\n %doc 或 \r\n %config \r\n来标记文件。 \r\n %doc 告诉 RPM\r\n这是一个文档文件,因此如果用户安装软件包时使用 \r\n --excludedocs ,将不安装该文件。您也可以在 \r\n %doc 下不带路径列出文件名,RPM\r\n会在构建目录下查找这些文件并在 RPM 文件中包括它们,并把它们安装到 \r\n /usr/share/doc/%{name}-%{version} 。以 %doc 的形式包括\r\nREADME 和 ChangeLog 这样的文件是个好主意。\r\n

\r\n

\r\n %config 告诉 RPM 这是一个配置文件。在升级时,RPM 将会试图避免用 RPM 打包的缺省配置文件覆盖用户仔细修改过的配置。\r\n

\r\n

\r\n 警告:如果在 %files 下列出一个目录名,RPM\r\n会包括该目录下的所有文件。通常这不是您想要的,特别对于 \r\n /bin 这样的目录。\r\n

\r\n

\"\"
\"\"
\"\"
\"\" 回页首

避免简单实例中的问题

\r\n

这个最基本的 spec\r\n文件有几个问题。最大的问题之一就是您最后在构建系统上实际安装了该产品。而这可能只是一个软件测试版本,您也许并不想在构建系统中安装它。

\r\n

RPM 用一个名为\r\n 构建根(build\r\nroot)的特性来处理这个问题。它的想法是设置您的 spec\r\n文件,以将所有安装的文件复制到一个虚拟目录树(从构建根开始);然后\r\nRPM 从那里得到文件。\r\n

\r\n

但是,这需要一些软件包的支持。在包括 indent 在内的很多 GNU\r\n软件包中,在 \r\n make install 的时候定义 \r\n DESTDIR 将会在所有安装路径之前添加 DESTDIR 值。\r\n

\r\n

请注意\r\n 要使用 \r\n ./configure\r\n--prefix=$RPM_BUILD_ROOT 。这会在假设整个软件包文件的最终位置是构建根的情况下安装整个软件包。这对于\r\nindent\r\n可能没有关系,但任何需要在运行时找到其安装文件的程序都将失败,因为当\r\nRPM 最终安装到用户系统后,这些文件就不再位于构建根之下 ―\r\n那只是您构建系统上的一个临时目录。\r\n

\r\n

请参阅更新的文件\r\n indent-2.spec,如下所示。\r\n

\r\n

第二个 spec 文件:indent-2.spec
\r\n \r\n

Summary: GNU indentName: indentVersion: 2.2.6Release: 2Source0: %{name}-%{version}.tar.gzLicense: GPLGroup: Development/ToolsBuildRoot: %{_builddir}/%{name}-root%descrīptionThe GNU indent program reformats C code to any of a variety offormatting standards, or you can define your own.%prep%setup -q%build./configuremake%installrm -rf $RPM_BUILD_ROOTmake DESTDIR=$RPM_BUILD_ROOT install%cleanrm -rf $RPM_BUILD_ROOT%files%defattr(-,root,root)/usr/local/bin/indent%doc /usr/local/info/indent.info%doc %attr(0444,root,root) /usr/local/man/man1/indent.1%doc COPYING AUTHORS README NEWS

\r\n

更改说明

\r\n

\r\n首先,我们增加了版本的发行号。无论何时,当您编辑 spec\r\n文件时,都不要忘了这么做。

\r\n

我们在头中添加了 BuildRoot,以便告诉 RPM\r\n这是在构建期间临时安装文件的地方。对于临时文件,我们这里使用了两个\r\nRPM 宏,而不是假设某个特定位置。在 Red Hat 7.1\r\n上, \r\n %{_builddir} 以类似于 \r\n /usr/src/redhat/BUILD 结束。\r\n

\r\n

我们还需要告诉系统将 indent 安装在那里。RPM\r\n帮助我们用构建根的值定义一个 shell 变量 \r\n RPM_BUILD_ROOT ,因此在 \r\n make install \r\n时,我们只需将它作为 DESTDIR 值传入即可。\r\n

\r\n

我们还在 %install 和 %clean\r\n中添加了几行,以便在开始安装以前(为保险起见)和完成以后清除构建根。%clean\r\n是一切都正常的情况下在 RPM\r\n构建结束时运行的脚本,这样临时文件就不会一直保留。

\r\n

最后,在 %files 中,请注意我们没有在此处的路径前包括 BuildRoot。我们使用了“真正”的路径;RPM 将在构建根下寻找这些文件,因为您已经包括了 \r\n BuildRoot 定义。\r\n

\r\n

这一次发生了什么

\r\n

\r\n如果仔细观察您会发现,在 RPM\r\n进行安装部分以前,一切工作照旧。然后,文件将不直接安装到\r\n/usr/local/bin,而是安装在(比如说)/usr/src/redhat/BUILD/indent-root/usr/local/bin\r\n中。

\r\n

如果您检查最终的二进制 RPM 文件(用 \r\n rpm -qlp\r\nindent-2.2.6-2.i386.rpm ),您会看到构建根已被 RPM 除去。如果您安装 RPM,这些文件最终将安装在正确的目录,如 /usr/local/bin/indent 中。\r\n

\r\n

\"\"
\"\"
\"\"
\"\" 回页首

在其它 Linux 分发版上使用 RPM

\r\n

\r\n如果您在使用不同的 Linux 分发版,RPM\r\n可能会有不同的内置路径。例如,它几乎肯定不会在 /usr/src/redhat\r\n查找源文件!要确定希望的 RPM 安装路径,请运行 \r\n rpm\r\n--showrc 并查看下列部分如何被定义:\r\n

\r\n

_sourcedir
RPM 在哪里查找源文件(tar 文件,等)
_srcrpmdir
RPM 在哪里放入新的源 RPM 文件
_rpmdir
RPM 将把新的二进制 RPM\r\n文件放在哪里(在特定于体系结构的子目录中)

\r\n

其中一些根据其它变量定义;例如,当您看到 \r\n %{_topdir} ,查找 \r\n _topdir \r\n的定义,等等。\r\n

\r\n

\"\"
\"\"
\"\"
\"\" 回页首

下一步是什么

\r\n

\r\n我希望这篇用 RPM\r\n打包软件的介绍会对您有所帮助。有关相关的阅读材料,请参阅下面的\r\n 参考资料。在本系列的后续文章中,我们将讨论这些主题:\r\n

\r\n

  • 构建 RPM 软件包而不必是 root 用户
  • 在创建软件之前为软件打补丁
  • 在安装和卸载时运行脚本
  • 在安装或卸载\r\n 其它软件包时运行脚本\r\n

\r\n

参考资料

\r\n

\r\n

关于作者

\"\"
\"\"

Dan Poirier 是 IBM 的顾问软件工程师。他目前在美国北卡罗莱纳州的\r\nResearch Triangle Park 工作,从事运行 Linux\r\n的网络设备的研究。可以通过 \r\n poirier@us.ibm.com\r\n与他联系。\r\n

\r\n \r\n

\r\n

随着RedHat\r\nLinux的风靡全球,其软件包管理工具及格式RPM也得到推广。基于RPM源代码开放、安装卸载简单、升级维护方便及查询功能强大的特点,越来越多的开\r\n发者喜欢采用RPM格式来发布自己的软件包,更多的用户从中受益。那么,RPM软件包是怎样制作的呢?
\r\n
\r\n其实,制作RPM软件包并不是一件复杂的工作,其中的关键在于编写SPEC软件包描述文件。下面以我制作小赵编辑器LZE的软件包(lze-6.0-1.i386.rpm)为例,详细说明一下软件包的制作过程。
\r\n
\r\n1.mkdir -p /usr/src/dist/{BUILD,RPMS/i386}
\r\n
\r\n上述命令用于创建两个目录/usr/src/dist/BUILD与/usr/src/dist/RPMS/i386,前一个目录是RPM建立软件包时用\r\n的目录,后一个是RPM输出软件包的目录,我的LZE软件包lze-6.0-1.i386.rpm就是在此目录下存放的。这两个目录不创建,运行rpm命\r\n令建包时将报错退出。
\r\n
\r\n注意:输出目录名i386,意味着这是台X86的机器。如果你的机器与此体系不同,则目录名也要相应更换。
\r\n
\r\n2.编写软件包描述文件lze-6.0-1.spec
\r\n
\r\n要想制作一个软件包,就必须写一个软件包描述文件(SPEC)。这个文件中包含了软件包的诸多信息,如软件包的名字,版本,类别,说明摘要,创建时要执行什么指令,安装时要执行什么操作,以及软件包所要包含的文件列表等等。
\r\n
\r\nLZE软件包描述文件lze-6.0-1.spec比较简单,仅用于创建二进制程序包。其描述文件内容如下:(每行开头的数字为所在行在文件中的行号)
\r\n
\r\n1 Summary:小赵全屏幕中英文多窗口多功能编辑器(Linux/UNIX系统适用)
\r\n2 Name:lze
\r\n3 Version:6.0
\r\n4 Release:1
\r\n5 Vendor:纵横软件制作中心(Email:zhsoft@etang.com)
\r\n6 Copyright:Share
\r\n7 Group:Applications/Editors
\r\n8 Source:http://zhsoft.myetang.com/lze-6.0.tar.gz
\r\n9 %descrīption
\r\n10 小赵编辑器,是为使用SCO UNIX,Linux多用户系统的广大用户专门设计的全屏幕多窗
\r\n11 口中英文多功能编辑器。
\r\n12 它主要有以下十大特点:1.全屏幕菜单操作。2.显示方式多样。3.块操作丰富。4.十
\r\n13 字制表功能强大。5.多窗口操作灵活自如。6.文件操作功能齐全。7.解释输出功能独具特
\r\n14 色。8.自带中文输入法(增强五笔和增强拼音),实用方便。9.十六进制编辑功能,如虎
\r\n15 添翼。10.即时翻译,按到即译。
\r\n16 总之,小赵编辑器会成为您在UNIX,Linux系统上编制程序和书写一般性文稿的好帮手。
\r\n17 它将在工作中助您一臂之力,轻松上阵,游刃有余!
\r\n18
\r\n19 %prep
\r\n20 # prep start.
\r\n21
\r\n22 %build
\r\n23 # build start.
\r\n24 cp /root/{读我,版权声明} .
\r\n25
\r\n26 %install
\r\n27 # install start.
\r\n28
\r\n29 %files
\r\n30 %defattr (-,root,root)
\r\n31 %doc 读我
\r\n32 %doc 版权声明
\r\n33 %config /etc/funkey.def
\r\n34 %config /etc/inputme.def
\r\n35
\r\n36 /usr/bin/lze
\r\n37 /usr/bin/lzeime.py
\r\n38 /usr/bin/lzeime.wb
\r\n39
\r\n40 %changelog
\r\n41
\r\n42 * Fri May 1 1998 雨亦奇
\r\n43 – 增加多窗口操作
\r\n44
\r\n45 * Mon Mar 24 1997 雨亦奇
\r\n46 – 增加块操作命令
\r\n47
\r\n
\r\n描述文件说明如下:
\r\n
\r\n(1)文件头
\r\n
\r\n它包含以下几个域:
\r\n
\r\n* Summary:
\r\n软件包一句话说明,一行有效。
\r\n* Name:
\r\n软件包的名字,RPM用该名字与版本号,释出号及体系号来命名软件包。如,本例输出的软件包名为lze-6.0-1.i386.rpm。
\r\n* Version:
\r\n软件版本号。仅当软件较以前有较大改变时才增加版本号。
\r\n* Release:
\r\n软件释出号。若软件较以前改变较小,则仅增加释出号,不改变版本号。
\r\n* Vendor:
\r\n软件开发者的名字。
\r\n* Copyright:
\r\n软件包所采用的版权规则。具体有: GPL(自由软件),BSD,MIT,Public Domain(公共域),Distributable(贡献),commercial(商业),Share(共享)等。
\r\n* Group:
\r\n软件包所属类别,具体类别有:
\r\nAmusements/Games (娱乐/游戏)
\r\nAmusements/Graphics(娱乐/图形)
\r\nApplications/Archiving (应用/档案)
\r\nApplications/Communications(应用/通讯)
\r\nApplications/Databases (应用/数据库)
\r\nApplications/Editors (应用/编辑器)
\r\nApplications/Emulators (应用/仿真器)
\r\nApplications/Engineering (应用/工程)
\r\nApplications/File (应用/文件)
\r\nApplications/Internet (应用/因特网)
\r\nApplications/Multimedia(应用/多媒体)
\r\nApplications/Productivity (应用/产品)
\r\nApplications/Publishing(应用/印刷)
\r\nApplications/System(应用/系统)
\r\nApplications/Text (应用/文本)
\r\nDevelopment/Debuggers (开发/调试器)
\r\nDevelopment/Languages (开发/语言)
\r\nDevelopment/Libraries (开发/函数库)
\r\nDevelopment/System (开发/系统)
\r\nDevelopment/Tools (开发/工具)
\r\nDocumentation (文档)
\r\nSystem Environment/Base(系统环境/基础)
\r\nSystem Environment/Daemons (系统环境/守护)
\r\nSystem Environment/Kernel (系统环境/内核)
\r\nSystem Environment/Libraries (系统环境/函数库)
\r\nSystem Environment/Shells (系统环境/接口)
\r\nUser Interface/Desktops(用户界面/桌面)
\r\nUser Interface/X (用户界面/X窗口)
\r\nUser Interface/X Hardware Support (用户界面/X硬件支持)
\r\n* Source:
\r\n源程序软件包的名字。
\r\n* %descrīption:
\r\n软件包具体说明,可写在多个行上。示例中第10-18行均为说明。
\r\n
\r\n(2)%prep段
\r\n
\r\n这个段是预处理段,通常用来执行一些解开源程序包的命令,为下一步的编译安装作准备。%prep和下面%build,%install段一样,除了可以执\r\n行RPM所定义的宏命令(以%开头)以外,还可以执行SHELL命令,命令可以有很多行。示例中,本段只有第20行一行注释语句(以#开头),不执行任何\r\n操作。
\r\n
\r\n(3)build段
\r\n
\r\n本段是建立段,所执行的命令为生成软件包服务。
\r\n
\r\n本段第23行是注释行,第24行执行的是拷贝命令,将/root目录下的两个文件(读我,版权声明)拷贝到软件包建立目录(/usr/src/dist/BUILD)。
\r\n
\r\n(4)%install段
\r\n
\r\n本段是安装段,其中的命令在安装软件包时将执行。示例中,本段只有第27行一行注释语句(以#开头),不执行任何操作。
\r\n
\r\n(5)%files段
\r\n
\r\n本段是文件段,用于定义软件包所包含的文件,分为三类–说明文档(doc),配置文件(config)及执行程序,还可定义文件存取权限,拥有者及组别。本段中:
\r\n
\r\n第30行-%defattr宏:定义文件存取权限为默认值(用-表示默认值,也可选择八进制数值,如0777等),定义拥有者为root,定义组别为root。
\r\n
\r\n第31,32行-%doc宏:用该宏定义软件包所含的说明文档,若没有指定目录,则目录为/usr/src/dist/BUILD。每个宏只能定义一个说明文档。说明文档一般安装在“/usr/doc/软件包名-版本号-释出号”目录下。
\r\n
\r\n第33,34行-%config宏:定义软件包应用的配置文件,象sendmail.cf,passwd等。当卸载含有配置文件的软件包时,任何未作改动\r\n的配置文件将被删除,改动过的配置文件将自动改名,后缀加上.rpmsave,以便再度安装这个软件包时可以迅速恢复使用。
\r\n
\r\n第36-38行-为软件包所包含的文件名列表,可以写许多行。如果文件名指示的是一个目录,则该目录下的所有文件将被包含在软件包中,注意不要弄错了。
\r\n
\r\n(6)%changelog段
\r\n
\r\n本段是修改日志段。你可以将软件的每次修改记录到这里,保存到发布的软件包中,以便查询之用。
\r\n
\r\n每一个修改日志都有这样一种格式:第一行是:* 星期 月 日 年 修改人 电子信箱。
\r\n
\r\n其中:星期、月份均用英文形式,用中文会出错。
\r\n
\r\n接下来的行写的应是修改了什么地方,可写多行。一般以减号起始,便于查阅。
\r\n
\r\n3.rpm -bb lze-6.0-1.spec
\r\n
\r\n用此命令生成软件包,执行后屏幕将显示如下信息:(每行开头为行号)
\r\n
\r\n1 Executing: %prep
\r\n2 + umask 022
\r\n3 + cd /usr/src/dist/BUILD
\r\n4 + exit 0
\r\n5 Executing: %build
\r\n6 + umask 022
\r\n7 + cd /usr/src/dist/BUILD
\r\n8 + cp /root/读我 /root/版权声明.
\r\n9 + exit 0
\r\n10 Executing: %install
\r\n11 + umask 022
\r\n12 + cd /usr/src/dist/BUILD
\r\n13 + exit 0
\r\n14 Processing files: lze
\r\n15 Executing: %doc
\r\n16 + umask 022
\r\n17 + cd /usr/src/dist/BUILD
\r\n18 + DOCDIR=/usr/doc/lze-6.0
\r\n19 + export DOCDIR
\r\n20 + rm -rf /usr/doc/lze-6.0
\r\n21 + /bin/mkdir -p /usr/doc/lze-6.0
\r\n22 + cp -pr 读我 /usr/doc/lze-6.0
\r\n23 + cp -pr 版权声明 /usr/doc/lze-6.0
\r\n24 + exit 0
\r\n25 Finding Provides: (using /usr/lib/rpm/find-provides)…
\r\n26 Finding Requires: (using /usr/lib/rpm/find-requires)…
\r\n27 Requires: ld-Linux.so.2 libc.so.6 libc.so.6(GLIBC_2.0) libc.so.6(GLIBC_2.1)
\r\n28 Wrote: /usr/src/dist/RPMS/i386/lze-6.0-1.i386.rpm
\r\n
\r\n第28行显示: 制作完成软件包,名字为lze-6.0-1.i386.rpm,在/usr/src/dist/RPMS/i386目录下。
\r\n
\r\n4.软件包制作完成后,可用以下命令查询一下,看看效果。如果不满意的话,可以再次修改软件包描述文件,重新运行上一步命令,产生新的RPM软件包。
\r\n
\r\n转到/usr/src/dist/RPMS/i386目录,执行以下命令:
\r\n
\r\n(1)rpm -qpi lze-6.0-1.i386.rpm
\r\n
\r\n此命令用于查询指定软件包的头部信息,结果如下:(以行号开头)
\r\n
\r\n1 Name: lze Relocations: (not relocateable)
\r\n2 Version : 6.0 Vendor: 纵横软件制作中心(Email:zhsoft@etang.com)
\r\n3 Release : 1 Build Date: 2001年07月12日 星期四 13时33分21秒
\r\n4 Install date: (not installed) Build Host: 纵横软件制作中心
\r\n5 Group : Applications/Editors Source RPM: lze-6.0-1.src.rpm
\r\n6 Size: 532081 License: Share
\r\n7 Summary : 小赵全屏幕中英文多窗口多功能编辑器(Linux/UNIX系统适用)
\r\n8 Descrīption :
\r\n9 小赵编辑器,是为使用SCO UNIX,Linux多用户系统的广大用户专门设计的全屏幕多窗
\r\n10 口中英文多功能编辑器。
\r\n11 它主要有以下十大特点:1.全屏幕菜单操作。2.显示方式多样。3.块操作丰富。4.十
\r\n12 字制表功能强大。5.多窗口操作灵活自如。6.文件操作功能齐全。7.解释输出功能独具特
\r\n13 色。8.自带中文输入法(增强五笔和增强拼音),实用方便。9.十六进制编辑功能,如虎
\r\n14 添翼。10.即时翻译,按到即译。
\r\n15 总之,小赵编辑器会成为您在UNIX,Linux系统上编制程序和书写一般性文稿的好帮手。
\r\n16 它将在工作中助您一臂之力,轻松上阵,游刃有余!
\r\n
\r\n(2)rpm -qpl lze-6.0-1.i386.rpm
\r\n
\r\n此命令用于查询指定软件包的全部文件列表,将命令中的-qpl换作-qpd,将显示文档文件列表,换作-qpc将显示配置文件列表。
\r\n
\r\n命令执行结果如下:(行号开头)
\r\n
\r\n1 /etc/funkey.def
\r\n2 /etc/inputme.def
\r\n3 /usr/bin/lze
\r\n4 /usr/bin/lzeime.py
\r\n5 /usr/bin/lzeime.wb
\r\n6 /usr/doc/lze-6.0
\r\n7 /usr/doc/lze-6.0/版权声明
\r\n8 /usr/doc/lze-6.0/读我
\r\n
\r\n查询结果一切正常,软件包制作到此结束。
\r\n
\r\n小结
\r\n
\r\n在Linux下制作RPM软件包关键在描述文件,写起来着实简单,根据上述步骤生成软件包后,就可以对外发布了。在其它机器上用安装命令(rpm -i 包名)可安装这个软件包,若想卸载,可用命令(rpm -e 包名)来卸载这个包,非常方便。
\r\n
\r\n \r\n

\r\n