LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: freebsdchina

RPM 使用和制作教程集合

[复制链接]
发表于 2005-4-19 17:59:32 | 显示全部楼层

%{buildroot} vs $RPM_BUILD_ROOT

还是 google 更有用, 第一页就找到了它们的区别
还是邮件列表的噪音比较小。
宏与变量总是不同的

http://www.redhat.com/archives/rpm-list/2002-July/msg00110.html

Konstantin Riabitsev
Hello:

Just a quick question -- I'm wondering which is considered "more
proper": %{buildroot} or $RPM_BUILD_ROOT? I tend to use %{buildroot} as
it is shorter and more consistent with the rest of the spec file, but
I'd like an official opinion.

Regards,


http://www.redhat.com/archives/rpm-list/2002-July/msg00114.html
Matthias Saou
Sorry, but just an unofficial opinion here : I also tend to use
%{buildroot}, and also %{optflags} etc. instead of their $RPM_* equivalents
mostly since I find it more readable, a bit shorter, and that Red Hat guys
seemed to be doing the same too.

Matthias



http://www.redhat.com/archives/rpm-list/2002-July/msg00133.html

Rob Nagler
Not sure this is correct.  Maybe this has been fixed after 4.0.4, but
when I do:

%files -f $RPM_BUILD_ROOT/files.list

I get:

RPM build errors:
    Could not open %files file ./$RPM_BUILD_ROOT/files.list: No such file or directory

When I do:

%files -f %{buildroot}/files.list

It works fine.

Rob




http://www.redhat.com/archives/rpm-list/2002-July/msg00145.html

James Olin Oden
Don't the macros get evaluated before the script is ran and the value of
$RPM_BUILD_ROOT is evaluated in the script?

...james



http://www.redhat.com/archives/rpm-list/2002-July/msg00134.html

Jeff Johnson
> Jeff Johnson writes:
> > Otherwise, the two have identical values and uses, and it really doesn't
> > matter at all.
>
> Not sure this is correct.  Maybe this has been fixed after 4.0.4, but
> when I do:
>

Yes it is a correct statement ...

> %files -f $RPM_BUILD_ROOT/files.list

... but this syntax is not officially supported functionality any more
than %{buildroot} is.

>
> I get:
>
> RPM build errors:
>     Could not open %files file ./$RPM_BUILD_ROOT/files.list: No such file or directory
>
> When I do:
>
> %files -f %{buildroot}/files.list
>

Yup, %files is not a shell context, but rather a spec file context,
so $RPM_BUILD_ROOT is not defined but %{buildroot} is.

Again, It Really Doesn't Matter.

73 de Jeff
回复 支持 反对

使用道具 举报

发表于 2005-4-19 18:10:20 | 显示全部楼层
http://www.redhat.com/archives/r ... ruary/msg00290.html
RPM_SOURCE_DIR RPM_BUILD_DIR question
A R Hummaida
hi

how could one retrieve the SRPM_SOURCE DIR/BUILD_DIR etc dynamically ie without
knowledge that on a Redhat they exist in /usr/src/redhat/SOURCES etc ?

the rcfile includes them and exports them to the bash environment but "printenv" does not show them.

this is on RH 7.2 with rpm-4.0.3

any input.

Many Thanks

A.Hummaida


并且还 google 到了这个
http://www.kdevelop.org/?filename=users.html
http://kpp.sourceforge.net
Kpp - A RPM Spec file generator with KDevelop support



--
这个是完全无关的东西
http://toolbox.xilinx.com/docsan ... _hidd_write_rpm.htm
RPM

A Relationally Placed Macro (RPM) defines the spatial relationship of  the primitives that constitute its logic. An indivisible block of logic elements that are placed as a unit  into a design.

Use the Floorplanner interactive graphical tool to perform the following functions on your designs:

    *

      Doing detailed-level floorplanning
    *

      Creating an RPM core that can be used in other designs
    *

      Viewing and editing location constraints
    *

      Finding logic or nets by name or connectivity
    *

      Cross-probing from the Timing Analyzer to the Floorplanner
    *

      Placing ports automatically for modular design

The graphical user interface includes pull-down menus and toolbar buttons that contain all of the necessary commands for changing the design hierarchy, floorplanning, and performing design rule checks. Dialog boxes allow you to set parameters and options for command execution.

--

片言只字。搜索 google 有关 rpm macro fedora 会找到各种更有趣的东西
http://www.redhat.com/archives/r ... nuary/msg00171.html

FWIW, the really nasty implementation detail is a maximum of 65Kb on the
expansion buffer, with silent truncation if reached. The buffer could/should be
dynamically reallocated if (or rather when) necessary. There's been little
reason to do so (recursive realloc's make my head hurt a lot), as no one
that I know of has hit the 65 Kb limit yet.

73 de Jeff

http://www.madboa.com/geek/specs/

Getting started with RPM building

Someone once asked, “How do I go about learning about all this RPM goodness?” Here's what I did/do:

    *

      Read the online copy of Maximum RPM
    *

      Poke through the .spec files in the source packages (SRPMS) that come with your distribution. GNU Midnight Commander (mc) will do all the cpio magic behind the scenes so you can explore source packages quickly and easily. If you don't have mc on your local system, you can unpack an SRPM manually:

rpm2cpio foo-1.23.src.rpm | cpio -id

    *

      Macros are at the core of RPM packaging. There are macros for everything: directory locations, compiler optimizations, etc. On Red Hat and Fedora systems, you'll want to look at all the macros files in the /usr/lib/rpm directory tree. You can locate them all in one fell swoop:

find /usr/lib/rpm -name macros

    *

      Grok a copy of cpan2rpm; you'll learn some cool things about packaging Perl CPAN modules. (Or you can just use cpan2rpm and not worry about the details. :-)
    *

      If you end up doing a lot of RPM work, join the rpm-list mailing list. In particular, Jeff Johnson, the lead RPM developer at Red Hat, is very helpful—and usually very quick to answer questions.

This article is licensed under a Creative Commons License.



http://fedoranews.org/alex/tutorial/rpm/index.shtml

All you have to know about RPM
by Alexandre de Abreu
Updated on Tuesday, 09-Mar-2004 05:00:36 PST
Everybody knows that Fedora and Red Hat Linux use RPM as a package management tool as well as update tools(yum, up2date, apt) use rpmlib for accessing the rpm data on the system. It's really nice when we do a "yum install XFree86-xdm" and all dependency calculations, space available are done only by answering "y" to a few questions.

But what to do when setup is not ready for using yum or other install/update tool? On the next article I'll show an easy way for yum repository building with wget and how to use it, see Hal Canary's rsync script for an example. The problems will be shown here starting from "How to install" famous rpm commands and then going to more interesting ones.

Follow a link or go to next page by clicking on the blue arrow below.

How can I...
Problem 1: Install or Upgrade a package? Can I install an old one?
Problem 2: Remove a package? Is it going to remove any dependencies?
Problem 3: Query installed packages? What about a RPM file?
Problem 4: List what packages are required by some RPM package?
Problem 5: Find from which package the file /usr/bin/smbmount belongs?
Problem 6: List what files will be installed by a RPM package?
Problem 7: Install a package directly from Internet? Can I use a proxy?
Problem 8: Simulate what will be done when executing "rpm -ivh new-kernel.rpm"?
Problem 9: Upgrade all my installed packages with one Freshen command?
Problem 10: Figure out the Kernel version(smp, bigmem) and base arch(i386, athlon)?
Problem 11: Install a new Kernel version but keeping my old one installed?
Problem 12: Make backups of my old packages when updating or removing them?
Problem 13: Build a RPM package from a SRPM with rpmbuild?
Problem 14: Check digests and signatures against a package?
Problem 15: See what RPM macros are defined on my system?
Problem 16: Get rpm back? The command "rpm -qa" returns nothing!
Problem 17: Figure out the installation time of my packages? [User Contribution]
Problem 18: Figure out the size of a installed package? [User Contribution]



http://fedoraproject.org/wiki/Extras_2fRPMMacros
Valid RPM Macros
Here are the definitions for some common specfile macros as they are defined on Fedora Core 3 (rpm-4.3.2-21). For definitions of more macros, examine the output of "rpm --showrc". To see the expanded definition of a macro use the command "rpm --eval '%{macro}'". Note that neither command will take into account macros defined inside specfiles, but both will take into account macros defined in your ~/.rpmmacros file and macros defined on the command line.


Macros mimicking autoconf variables

    %{_sysconfdir}        /etc
    %{_initrddir}         %{_sysconfdir}/rc.d/init.d
    %{_prefix}            /usr
    %{_exec_prefix}       %{_prefix}
    %{_bindir}            %{_exec_prefix}/bin
    %{_lib}               lib
    %{_libdir}            %{_exec_prefix}/%{_lib}
    %{_libexecdir}        %{_exec_prefix}/libexec
    %{_sbindir}           %{_exec_prefix}/sbin
    %{_sharedstatedir}    %{_prefix}/com
    %{_datadir}           %{_prefix}/share
    %{_includedir}        %{_prefix}/include
    %{_oldincludedir}     /usr/include
    %{_infodir}           /usr/share/info
    %{_mandir}            /usr/share/man
    %{_localstatedir}     /var

RPM directory macros

    %{_topdir}            %{_usrsrc}/redhat
    %{_builddir}          %{_topdir}/BUILD
    %{_rpmdir}            %{_topdir}/RPMS
    %{_sourcedir}         %{_topdir}/SOURCES
    %{_specdir}           %{_topdir}/SPECS
    %{_srcrpmdir}         %{_topdir}/SRPMS

Build flags macros

    %{_global_cflags}     -O2 -g -pipe
    %{_optflags}          %{__global_cflags} -m32 -march=i386 -mtune=pentium4 # if redhat-rpm-config is installed

Other macros

    %{_var}               /var
    %{_tmppath}           %{_var}/tmp
    %{_usr}               /usr
    %{_usrsrc}            %{_usr}/src

Reference
Here are macros from other distributions to aid you in package conversion.

    *

      PLD RPM Macros   http://fedoraproject.org/wiki/Ex ... MMacros_20Reference
    *

      Mandrake RPM Macros   http://fedoraproject.org/wiki/Ex ... MMacros_20Reference



http://lists.freshrpms.net/piper ... January/007472.html
http://www.fedora.us/docs/rpm-packaging-guidelines.html
GNOME RPM spec file packaging guidelines

Gregory Leblanc
GNOME
GNOME Packaing Project
Abstract

This document attempts to outline the guidelines that GPP spec files should adhere to. These guidelines are designed to make spec files that will function on at least Red Hat 6.x and 7.x. They should also function on Red Hat-like systems with only minor adjustments. For systems that use RPM but aren't Red Hat-like, these spec files should serve as a good starting point.

Some knowledge of writing RPM spec files is assumed. The book Maximum RPM has a good intro to some of the concepts and syntax used in RPM spec files.
回复 支持 反对

使用道具 举报

发表于 2005-4-19 20:30:35 | 显示全部楼层

note: 谁来翻译最新的 rpm 构建教材?

http://www.gurulabs.com/goodies/guru+guides.php

几百k 的一个文件, 但是没法传上来

另外,编写 rpm macro 的最好的教程,看来和 hal 之类一样, 在源代码里面才有。
谁发一份 rpm-devel-4.4 的源代码里面的文档呢, 打个包发上来



update 20050423:
那份教材好像是 max 的改写,没什么意思。 另外,编写 rpm macro 的教程也没有找到,也许不是很难,所以连语法都没有了  :ask

最好的教材还是 max 等等几本英文的很旧的书籍,IBM dw 的两篇,ccid 的9篇连载。



update 20050428:
http://www.rpm.org/max-rpm-snapshot/index.html  比较新的 max rpm, 使用的是 OPL。版权问题最讨厌了。要翻译的话,可以从 sgml 源文件开始,不要直接翻译 html



update 20050502:
Guru Labs 的教材翻译完了
-
回复 支持 反对

使用道具 举报

发表于 2005-5-2 22:42:37 | 显示全部楼层

tr:Guru Labs《Creating RPMs (Student version)》v1.0 (创建 RPM 打包,学生版)

Page 0
Guru Labs
《Creating RPMs (Student version)》v1.0 (创建 RPM 打包,学生版)
本文目的 1. 作为我们的教学课件的范例用于评估 2. 为系统管理员提供高质量的 RPM 手册
有关本教程 您看到的蓝色背景,模拟了印刷 Guru Labs 课件所用的自定义纸张。学生版不包括教师版中的指令备注和教学提示。
有关我们特别的排版信息,参见 http://www.gurulabs.com/courseware/courseware_layout.php
有关我们提供的免费教学内容,包括本文的最新版,参见 http://www.gurulabs.com/goodies/
范例在以下平台中得到验证 rhel4, fc3, suse9, suse9.2
关于 Guru Labs
Guru Labs 是一个 Linux 培训公司,由 Linux 专家创建于 1999,提供最好的 Linux 培训和课件。全面的内容请参见 http://www.gurulabs.com
Copyright Guru Labs, L.C. 2005
Licensed under the Creative Commons Attribution-NonCommercial-NoDerivs License. http://creativecommons.org/licenses/by-nc-nd/2.0 (译文违反了许可,但是我想这份许可的 -nd- 是由于采用了特殊的背景和排版,而不是因为翻译能涉及到的那些 (应当) 人所共知的知识?)
Guru Labs 801 N 500 W Ste 202 Bountiful, UT 84010 Ph: 801-298-5227
WWW.GURULABS.COM

Page 1
目标
* 理解 UNIX/Linux 软件管理的历史概况
* 描述 RPM 系统的特点与结构
* RPM 的日常应用,各种不同的 RPM 打包的处理
* 修改并重构建已有的 SRPMS
* 学习 RPM SPEC 文件的语法,以及编译基础要求
* 创建新的 SPEC 文件,辅助文件以及 RPM 文件
* 高级的 RPM 创建技术
* 处理 Redhat 与 SuSE 发行版中,RPM 系统的不同之处

Page 2
处理打包
Unix 打包 (System V packages)
Linux 打包 (Slackware Tarballs, RPMs, Debian DPKGs)
传统上,UNIX 系统的软件都是以源代码形式发布的。要使用某个软件,管理员必须为要运行它的系统适当地编译它,然后安装它。如果它要求任何辅助的软件包, 那么也必须同时安装。如果要求本地进行任何定制,那么就必须去配置。
如果软件需要升级,管理员必须找到系统中, 属于这个软件的所有文件,替换为升级的版本,小心地保留那些本地作出的配置修改。
现在,考虑一个典型的 UNIX 工作站应用程序,例如 Mozilla。基本的 Mozilla 应用程序包含大约 495 个文件,分布在大约 10 个不同的目录中。在删除时,管理员必须找到所有这些文件并且删除。在升级时,管理员必须手工地替换所有文件。在运行时,Mozilla 要求安装大约 50 种其他可执行文件和运行时库 (而这些又会依赖于其他库文件)。
手工管理所有这些不是不可能的, 并且 Unix 管理员已经这样做了三十多年了,不过,很多服务提供商开发了简化此类工作的工具。在商业 Unix 世界中,System V Unix 定义了一种标准“打包”系统,这成为了此类软件的基础,包括 Solaris 中使用的 pkg 格式,还有 HP-UX 中使用的 depot 格式。这些软件包系统提供了各种工具,可以用来安装、卸载和升级打包中的软件。打包中包含了软件和元数据 (例如列举出为了使软件可以运作,必须安装的其他软件等等)。
在 Linux 世界中,最初的软件没有打包,与 Unix 世界中完全相同。后来,在 1993 年 Slackware 发行版出现时,它引进了一种很初级的打包格式。之后,两种新的发行版,Redhat 与 Debian,都开始为 Linux 开发更多功能的打包软件。Debian 引进了 DPKG 打包系统,而 Redhat 引进了 RPM 打包系统。从那时开始, RPM 打包系统成为了 Linux 社区中的事实标准。它为几乎所有著名商业 Linux 发行版所用,包括来自 Redhat, SuSE 和 Mandrake 的那些。RPM 也是 Linux 世界中软件包管理的法律标准, Linux 标准化组织 LSB (Linux Standards Base) 要求相容于 LSB 的系统支持 RPM 文件的安装。

Page 3
RPM 特性
非交互安装,可运行脚本,可追踪/校验/查询已安装的文件,可追踪依赖性关系,可追踪整个源代码和编译过程,数字签名
RPM, RPM 包管理工具,提供了各种特性,使之成为 Linux 社区中杰出的包管理工具,大大简化了 Linux 管理员的工作。
RPM 提供了一系列的工具,可以用来实现非交互地,可运行脚本的安装过程。当软件安装之后,RPM 提供的工具可以用来追踪已安装的文件,使得卸载和升级非常简单,管理员可以检查软件安装是否正确,已安装的文件是否被修改过。另外,RPM 提供了一系列工具,可以用来查找已安装的文件,判断哪些程序在使用它们。
RPM 有杰出的依赖性追踪能力,意味着在安装新软件包时,它可以保证为了运行新软件,所有必需的软件都已经安装。在卸载软件时,它可以首先检测操作是否会影响其他应用程序。
另外,RPM 提供了一系列工具,管理从打补丁、配置直到编译的整个过程。当编译一个软件时,RPM 可以从原始的源代码开始,生成所需的补丁,将打补丁,配置源代码和编译源代码以产生可执行文件的过程脚本化。RPM 的这种功能极大地简化了企业中自定义软件的维护过程。
最后,RPM 允许将所有已打包的软件签名,使用公钥技术。这种特性允许验证 RPM 的可靠性,防止安装木马程序。

Page 4
RPM 结构
RPM 打包文件,数据库 /var/lib/rpm,工具 rpm,rpmbuild,rpmsign,rpm2cpio,RPM 配置文件 宏
RPM 系统包含多个组件。要使用 RPM 安装的软件必须打包成特定的格式,RPM 打包文件。RPM 打包文件是一个存档文件,包含了要安装的文件,以及元数据。RPM 系统使用元数据来保证将文件以正确的权限和所有者,安装到正确的位置。
在使用 RPM 安装软件时,软件名称和其他一些属性被记录到 RPM 数据库中,通常数据库在 /var/lib/rpm 目录。数据库包含了已安装程序的列表,以及属于这些软件的文件,使得以后可以方便地卸载或升级软件。它也记载了文件的属性,包括文件的大小,时间戳,校验和——保证可以在以后检测文件的正确性。数据库也包含了每个程序的依赖性信息,保证管理员安装软件时,所需的软件都已安装,卸载软件时,不会破坏其他现有的程序。
RPM 还包括一些工具。大多数 RPM 管理任务中,最基本的工具是 /bin/rpm 命令。在年代久远的系统中,如果用的是旧版本的 RPM,那么就只有这一个命令。在稍微新一些的系统中,新版本的 RPM 将过去 /bin/rpm 的许多功能移动到了辅助工具中。例如,/usr/bin/rpmbuild 命令用来生成新的 RPM 打包文件,/usr/bin/rpmsign 命令用来签署打包。
/usr/bin/rpm2cpio 命令一直都有,用来将一个 RPM 打包文件转换成标准的归档文件格式。
RPM 还有很多配置文件。在 rhel/fc 中,这些文件在 /etc/rpm 和 /usr/lib/rpm 目录,在 SuSE 中,这些文件只在 /usr/lib/rpm 目录。这些配置文件主要定义了宏——运行 RPM 命令或解析 RPM 打包文件时使用的快捷命令。

Page 5
RPM 打包文件
命名约定 体系结构 格式
要使用 RPM 安装的软件必须打包成 RPM 格式的文件。文件名应当有以下的格式:
名称-版本-发行标记.体系结构.rpm
在这个文件名中,名称表示包含在文件中的软件名,通常是软件的名字。版本表示软件的版本。尽管 RPM 文件格式以及工具没有强制要求,还是应当使用数字来表示版本。在这里使用字母会给很多 RPM 的前端带来问题。
发行标记用来表示对某个版本的打包的修正。有时,在为某个应用程序的某个版本制作 RPM 时会出错。这时,可以制作相同版本的修正了错误的新的 RPM。发行标记用来追踪打包文件的修正。这里也应该是一个数字,并且每次打包被修正后都应递增。
体系结构是这个 RPM 可以安装的系统平台。典型的值可以是:
* i386 任何 32 位 x86 系列 CPU
* i686 任何 686 级别的 32 位 x86 系列 CPU
* ppc64 64 位 PowerPC CPU
* x86_64 AMD 或 Intel 64 位 CPU
* ia64 64 位安腾 CPU
* sparc64 64 位 UltraSparc CPU
除了二进制可执行文件,RPM 还可以用来打包独立于平台的可执行程序 (例如使用解释性语言编写的程序,如 Lips, Perl 或 Java)。如果 RPM 包含的代码可以在任何 CPU 中运行,或者包含文档等独立于平台的文件,那么体系结构通常是 noarch
RPM 打包文件也可以用来打包应用程序源代码,补丁和用来指示如何配置和编译源代码的脚本。这些打包文件的体系结构使用 src,表示它们包含源代码而不是可执行文件。
如果 RPM 用作打包应用程序源代码,但是事实上不包括源代码的原始文件,只在元数据中保留了对源代码的引用,那么体系结构应当使用 nosrc,表示它们实际上没有打包源代码,但是可以像 src.rpm 一样使用。
不考虑它们的名字差别,所有 RPM 打包文件都是一个 cpio 归档文件,附加一个二进制的头部。

Page 6
使用 RPM
安装 升级 删除 查询/校验软件包/文件 rpm -iUFeqV
RPM 打包文件在安装时通常使用 rpm 命令和 -U 参数。通常,还要加上 -v 选项,使得 rpm 输出更多信息,还会加上 -h 选项,使得 rpm 执行时显示进度条
如果想安装一个软件包,同时还保留旧版本 (只有当两个版本中没有相同的文件时才可能做到),那么使用 -i 参数。通常在安装内核时会这样做,为了防止新内核出错,将旧内核保留下来。
也可以用 -F 参数来升级软件包 (通常,还要加上 -v 和 -h 选项),这个参数使得已安装的旧软件包得到更新,但是如果没有安装过,那么就不会安装它。
在进行升级或更新时,rpm 工具比较要安装的 RPM 版本与系统 RPM 数据库中,已安装的版本。如果要安装的软件包版本比已安装的版本更新,那么就升级。如果相反,那么 RPM 拒绝降级。如果版本号相同,RPM 就比较发行标记,只有当新打包的发行标记比已安装的打包的发行标记要新, 才进行升级。
软件包安装之后,可以用 -e 参数来删除
在删除软件包的时候,只要给出软件包的名称。在安装新软件包或者升级时,必须指定打包的全名。
打包文件和已安装的打包都可以查询。rpmquery 命令,或者 rpm 命令加上 -q 参数,都可以做很多查询。类似的,已安装的软件可以用 rpmverify 命令,或者 rpm 命令加上 -V 参数来校验。

Page 7
源代码 RPM 文件
原始源文件 补丁 辅助文件 脚本 .spec
rpm 命令可以用来处理源代码 RPM 文件 (SRPMs)。SRPMs 打包是用来构建作为最终产品安装到系统中的二进制 RPMs 打包的,如 .i386.rpm 和 .noarch.rpm 等等。SRPMs 包含几种不同的文件:
* 程序的最初的源文件
* 任何修改源程序的补丁
* 任何辅助的文件,例如 System V 启动脚本
* 指明如何配置和编译源代码的脚本。脚本通常命名为 name.spec,其中 name 是软件名
RPM 背后的一条设计原则是,软件包应当总是从最初的源代码编译。这一规则对于 Linux 社区很重要,每个程序都是由互联网上的松散的组织开发出来的,然后被 Redhat 和 SuSE 这样的发行版销售商整理到一起,成为一个集成的操作系统。发行版销售商经常需要修改源代码,使之可以更好地集成到发行版中,同样,最终用户也经常需要重新编译,有时需要打补丁,使得销售商提供的应用程序可以更好地适应自己的环境。从最初的源代码开始制作 RPM,加上各自的补丁,有助于简化长期的管理。这也使得最终用户可以容易地发现软件包作出了哪些修改。
通常,支持创建 RPM 的应用程序开发者会发布 SRPMs。不过有些开发者会仅仅发布标准的 Unix tar 打包格式的源代码,在其中包含一个 .spec 文件,指明如何从源代码编译生成一个二进制 RPM。

Page 8
使用源代码 RPMs
重新构建 创建
尽管管理员总是可以找到他们要安装的软件的二进制 RPMs,一些时候他们还是需要编译。有很多从源代码编译的理由:
* 发行版中未包含此软件
* 需要更新软件版本
* 需要以与发行版中的版本不同的选项和特性来编译应用程序
* 需要修正发行版中的版本包含的错误
在从源代码编译时,管理员仍然希望从 RPM 之类的包管理系统中得到便利,包括可以将来轻松地卸载,还有需要的时候升级等等。类似的,管理员在使用 RPM 工具编译时也会得到好处,包括内在的对构建命令的追踪,以及对补丁的取舍。
由于这些原因,管理员会选择从 SRPM 编译生成 RPMs。要生成二进制 RPM,管理员首先需要源代码 RPM,包含了用于生成二进制 RPM 的源代码。管理员通常有两种办法来获得 SRPM:
* 从头创建一个 SRPM
* 使用现有的 SRPM
当使用现有的 SRPM 时,管理员可以原样使用它,也可以进行定制。所有的操作都可以用 RPM 工具完成。

Page 9
准备构建
安装必需的软件 准备非 root 的构建环境
在从 SRPMs 构建 RPMs 的时候,首先需要进行准备工作。编译时需要的软件必须安装在用于构建的机器上。通常,这一需求意味着一般的开发工具,例如 gcc C 编译器以及 make 命令必须安装。与 Linux 发行版的安装方式相关,这些工具可能已经安装了,也可能没有。除了开发工具之外,很多软件包含编译期依赖关系,在编译时必须满足。很多应用程序要求在编译时必须能找到支持库和头文件,如果没有的话必须也安装它们。
二进制文件,一旦被编译,那么就可以在与它被编译的系统中,拥有相同的库文件的系统中顺利执行。因此,最好在与安装的目标系统相同的操作系统中编译它。
在从 SRPMs 构建 RPMs 的时候,尽可能使用非 root 用户,这非常重要。作为 RPM 构建过程的一步,RPM 工具将编译好的软件安装到一个虚拟的文件系统环境中。如果控制 RPM 构建过程的 spec 文件出错,可能导致 RPM 安装到真实的文件系统中。使用非 root 用户构建 RPM,尽管不是总是可行,但是防止了偶然的写入真实文件系统的事故,因为非 root 用户通常对 RPM 在安装时试图写入的目录没有写权限。
在当前的 SuSE 发行版中,RPMs 被配置为支持非 root 用户在 /usr/src/packages 子目录构建 RPM。在 Redhat 发行版中,必须进行配置,才能支持非 root 用户的构建。
要在 Redhat 发行版中配置普通用户构建 RPM:
1. 作为要执行构建的非特权用户登录
2. 创建 RPM 构建所需的目录结构
$ mkdir -p ~/rpmbuild/{BUILD,RPMS,S{OURCE,PEC,RPM}S}
或者
$ cp -a /usr/src/redhat ~/rpmbuild
3. 配置 RPM 在构建时使用新的目录结构,而不是默认的目录结构:
$ echo "%_topdir $HOME/rpmbuild" > ~/.rpmmacros
在执行了这些命令之后,RPM 将会在用户的个人目录下 rpmbuild 目录中构建。要在其他位置构建 RPMs,只要调整路径为合适的值。

Page 10
重构建现有的打包
源代码 RPMs
包含 .spec 文件的 tar 打包
准备好合适的编译环境之后,就可以重建现有的打包了。在较新的系统中,命令:
$ rpmbuild --rebuild name-ver-rel.src.rpm
可以用来编译 SRPMs 生成二进制 RPM,而命令
$ rpmbuild --recompile name-ver-rel.src.rpm
可以用来编译生成未打包的二进制文件。
在过去的系统中,命令分别是 $rpm --rebuild 和 $rpm --recompile
一些开发者以 tar 打包的形式发布源代码,包含了一个 spec 文件。仍然可以用 RPM 来编译这个软件。在较新的系统中,命令:
$ rpmbuild -ta tarball
可以用来编译 tar 打包,生成一个 SRPM 和一个二进制的 RPM。
在过去的系统中,命令是 $rpm -ta。
要安装源代码 RPM,使用这个命令:
$ rpm -Uvh name-ver-rel.src.rpm
这个命令将原始的源代码 tar 打包,补丁还有辅助文件复制到你定义的 SOURCES 目录。spec 文件将复制到你定义的 SPECS 目录。只有当你想在创建二进制 RPM 之前,修改什么的时候,才需要这样做。

Page 11
创建新的 RPMs
准备所需的补丁和辅助文件
创建 .spec 文件
创建和测试 RPM 文件
很多时候,可以找到要编译的软件的 SRPM。但是如果还没有,那么可以用下面的简单的步骤,从头创建一个:
* 准备任何所需的补丁
* 准备任何所需的辅助文件
* 创建 .spec 文件
* 构建并测试 RPM 文件
有些时候,需要用补丁文件来修正已发布的软件。如果要为所编译的软件打补丁,就必须准备它们。
类似的,应用程序需要一些辅助文件才能运行,但是它们不随源代码发布。例如,系统守护进程经常需要一个 System V 初始化脚本,才能在系统启动时运行,但是它们很少提供这个脚本。如果需要这样的文件,必须创建它们。
另外,还必须准备指令,告诉 RPM 如何编译软件。这些指令保存在一个 spec 文件中,在编译 RPM 的时候,RPM 软件将用到它们。
在创建了这些基本的组件之后,就可以构建并测试 RPM 了。通常,这是一个交互的过程——构建过程中,补丁文件以及 spec 文件中的错误必须被捕获并更正,然后重新构建。最后,将得到可行的构建。
将你创建的,并非仅适于你自己的补丁文件,以及 spec 文件提交给软件的作者,这是不错的做法。

Page 12
为软件打补丁
SRPM 包含原始的源代码和补丁 为什么要补丁? 创建补丁
在准备要打包的软件时,通常需要修改软件的源代码。作出修改有很多原因,包括:
* 需要修改硬编码的值,例如软件中的目录路径或者使用限额
* 修正已发布的软件中的错误
* 需要将软件与系统中的其他软件更好地整合
打包者对应用程序的源代码作出的任何修改都应当以补丁文件的形式出现,而不是直接修改原始的源代码。
SRPMs 中总是包括原始的源代码,以及修改源代码所需的补丁文件。这一策略简化了长期的管理,因为它意味着所有本地的修改都保存在各个补丁文件中,可以容易地追踪。它也简化了对源代码可靠性的验证,这在今天木马横行的互联网上非常重要。
创建补丁文件很容易。要创建它,首先将要修改的文件复制一个备份,在原来的名字后面加上一个 .orig 扩展名。接下来,修改需要的地方。接下来,使用 diff 命令加上 -N, -a, -u 和 -r 选项来生成原始文件与修改过的文件的不同之处。最后,将这些不同之处保存为补丁文件。
例如,假设程序 less 需要对源代码中的 edit.c 和 filename.c 做出一些定制。要创建这些修改的补丁文件:
1. 下载并解压源代码
$ tar -zxvf less-378.tar.gz
2. 备份要修改的文件
$ cd less-378
$ cp edit.c edit.c.orig
$ cp filename.c filename.c.orig
3. 修改源代码
$ vi edit.c filename.c
4. 将修改过的不同之处保存到补丁文件中
$ diff -Naur edit.c.orig edit.c > edit.patch
$ diff -Naur filename.c.orig filename.c > filename.patch
这时,生成了两个针对 less 源代码的补丁文件,可以用来创建打过补丁的 less 的 SRPM。

Page 13
创建辅助文件
定时任务 日志轮换 环境设置 特殊情况
很多时候,需要创建辅助文件来正确地运行一个应用程序。很多应用程序需要规律性地定时运行。例如,SquirrelMail 程序创建临时文件,并由定期运行的 tmpwatch 工具删除它。在 Redhat 和 SuSE 发行版中,下列目录被用于执行定时任务:
* /etc/cron.d/
* /etc/cron.hourly/
* /etc/cron.daily/
* /etc/cron.weekly/
* /etc/cron.monthly/
应用程序可以在这些目录中插入 shell 脚本,这些脚本将被每小时,每天,每周或每月执行一次。需要更灵活的定时的程序可以将 crontab 放在 /etc/cron.d/ 目录。在打包需要定时运行某个命令的应用程序时,必须创建合适的文件,放在其中某个目录中。
类似的,一些应用程序需要 shell 或者环境的修改。打包时进行这些修改的 shell 脚本可以放在 /etc/profile.d/ 目录。
会生成日志文件的程序需要保证日志文件可以定期得到轮换,因此应当将一个进行设置的文件放在 /etc/logrotate.d/ 目录中。
需要在系统启动时运行的守护进程需要创建一个初始化脚本。大多数守护进程需要的是一个 System V 启动脚本,而采用超级进程启动的守护进程需要创建的是一个 xinetd 或是 inetd 初始化脚本。
一些程序需要更多配置。基于 X 的应用程序需要向 X 环境中的菜单系统添加条目,因此需要提供一个配置文件,向菜单结构中添加它们。Web 应用程序和 Apache 模块总是需要对 Apache web 服务器的配置进行修改,因此需要配置文件来修改 Apache web 服务器的行为。进行认证的应用程序需要为 PAM 子系统提供配置文件。

Page 14
创建 System V 初始化脚本
独立的守护进程 chkconfig
使用 System V 初始化脚本允许使用标准的方法来管理独立的守护进程,运行:
# /etc/init.d/script name (start|stop|restart)
在为守护进程创建 RPM 的时候,最好创建并安装 SysV 初始化脚本,这样系统管理员可以像管理其他系统自带的守护进程一样,管理它们。
在创建 SysV 初始化脚本的时候,可以基于已有的,简单的脚本,做出必要的修改。在 rhel/fc 中可以参考 /etc/init.d/smartd,在 SLES/SL 中提供了 /etc/init.d/skeleton。
rhel/fc 中,SysV 初始化脚本的官方文档可以在 /usr/share/doc/initscripts-*/sysvinitfiles 文件中找到,而 SLES/SL 中,可以查看 /etc/init.d/README。
chkconfig 命令允许系统管理员容易地控制守护进程应当在哪些运行级启动。例如:
# chkconfig --level 2345 httpd on
要启用这一控制,SysV 初始化脚本的开始必须有特殊的两行,例如:
#!/bin/bash
#
# startup script for the Apache Web Server
#
# chkconfig: 2345 85 15
# description: Apache is a World Wide Web server.
#
首先,chkconfig: 这一行表示,这个守护进程默认应当在运行级 2, 3, 4 还有 5 启动,启动顺序是 85,结束顺序是 15。如果在任何运行级都不应自动启动服务,那么在运行级处使用负号,不要使用数字。这种情况下,安装 RPM 之后,系统管理员可以用
# chkconfig scriptname on
来注册 SysV 初始化脚本。
在 RPM spec 文件中,在 post 安装后脚本部分,应当用这个命令来注册 SysV 初始化脚本:
/sbin/chkconfig --add scriptname

Page 15
创建菜单
freedesktop.org 桌面菜单规约 .desktop 文件
用 RPM 打包应用程序时,最好为它创建一个菜单入口,这样用户可以容易地找到并执行它。
历史上,GNOME 和 KDE 桌面使用自己不同的菜单,菜单文件有不同的格式。发现这个问题后,两个组织走到一起,创建了桌面入口标准。
标准定义了目录 /usr/share/applications/ 为每个菜单入口定义了一个 XML 文件,文件名是 applicationname.desktop
创建了 .desktop 文件之后,可以用 desktop-file-install 命令安装它。这个文件可以用 desktop-file-validate 命令来验证。
对于基本的没有提供描述译文的 .desktop 文件,可以直接在打包的 spec 文件中定义并创建它。
.desktop 文件的完整结构和规则可以在这里找到:
http://standards.freedesktop.org/menu-spec/latest/
spec 文件范例,如何生成和安装 .desktop 文件
%install
......
# 创建菜单入口
cat > %{name}.desktop <<EOF
[Desktop Entry]
Name=BZFlag
Comment=%{summary}
Exec=%{name}
Icon=bzflag-m.xpm
Terminal=0
Type=Application
EOF

mkdir -p %{buildroot}%{_datadir}/applications
desktop-file-install --vendor TimRiker --dir %{buildroot}%{_datadir}/applications --add-category X-Red-Hat-Extra --add-category Application --add-category Game %{name}.desktop



Page 16
.spec 文件
定义元信息 编译 安装 脚本
创建了所需的补丁文件和辅助文件之后,必须创建一个 spec 文件。spec 文件是以一种混合了宏语言、shell 命令以及描述文本的方式书写的。在 spec 文件中,数字符号 (#) 用来表示注释,与绝大多数其他 Unix 配置文件中是一样的。
spec 文件包含几个紧密相关的段落:
* Header 头部
* Prep 准备
* Build 构建
* Install 安装
* Files 文件
* Scripts 脚本
* Changelog 变更记录
总之,这些段落定义了构成应用程序的源文件和补丁,提供了源代码以及应用程序用途的详细信息,指示 RPM 如何编译,定义了 RPM 在安装时需要安装的文件,以及如何安装它们。spec 文件也包含可选的脚本,可以分别在安装过程和卸载过程的前后执行。

Page 17
构建 RPM 过程中涉及到的目录和文件
foo.spec

Summary: The world famous foo
Name: foo
Version: 1.03
Release: 1
License: GPL
Group: Application/System
Source0: foo-%{version}.tar.bz2
Source1: foo.sysinit
Patch0: foo-fix1.patch
Patch1: foo-fix2.patch
BuildRoot: /var/tmp/%{name}-root

%description
This foo daemon serves bar clients.

%prep
%setup -q

%build
%configure
make

%install
rm -rf %{buildroot}
%makeinstall

%clean
rm -rf %{buildroot}

%files
%defattr(-,root,root)
/etc/init.d/foo
%{_sbindir}/foo
/usr/share/man/man8/foo.8

%files devel
%defattr(-,root,root)
/usr/include/foo.h
/usr/lib/foo.a

%changelog
* Mon Apr 30 2003 Dax Kelson
- ver 1.03

1. %prep
* 将文件 (SOURCES/) 解压到构建目录 (BUILD/)
* 打补丁 (SOURCES/ => BUILD/)
2. %build
* 配置 (BUILD/)
* 编译 (BUILD/)
3. %install
* 创建虚拟根文件系统 (/var/tmp/foo-root/)
* 将编译后的二进制文件和相关文件复制到虚拟根分区中的安装位置 (BUILD/ => /var/tmp/foo-root/)
4. %files
* 指定虚拟根分区中,要打包到不同的 RPMs 中的文件 (/var/tmp/foo-root/ => RPMS/i386)

Page 18
使用宏
在 RPM 中大量使用了宏,来进行配置。配置宏可以设置为全局的,只要放在 /usr/lib/rpm/macros 配置文件中。也可以进行个人设置,当 RPM 的任何命令执行时,会查找配置文件 $HOME/.rpmmacros,文件中所定义的任何配置指令将覆盖全局的配置选项。
宏也常常用在 spec 文件中。在 spec 文件中常用的命令都有预先定义的宏,很多系统中常用的目录和路径也有预先定义的宏。
在配置文件和  spec 文件中,为宏名称赋值的方法是,首先写出宏名称,接着写出值。例如,$HOME/.rpmmacros 中下面的语句
%_topdir /export/home/rpmmaker/rpmbuild
将 /export/home/rpmmake/rpmbuild 赋给宏 %_topdir。
在配置文件和 spec 文件中,宏的值可以这样引用,只要将宏名称包含在花括号中就可以了。例如,任何时候宏 %{_topdir} 出现在 spec 文件中时,对于设定了这个宏的用户,它将被自动替换为值 /export/home/rpmmaker/rpmbuild
由于宏在书写 spec 文件时如此有用,很多发行版销售商提供了很多预定义的宏,可以在书写 spec 文件时使用。在 Redhat 发行版中,这些销售商自定义的宏放在 /etc/rpm 子目录。在 SuSE 发行版中,这些销售商自定义的宏放在 /usr/lib/rpm/suse_macros 文件中。另外,/usr/lib/rpm 目录中的配置文件定义了很多标准的宏。在为多种发行版构建打包时,必须小心不要使用销售商自定义的宏。

Page 19
常用的宏
%_prefix        /usr
%_exec_prefix        %{_prefix}
%_bindir        %{_exec_prefix}/bin
%_sbindir        %{_exec_prefix}/sbin
%_libexecdir        %{_exec_prefix}/libexec
%_datadir        %{_prefix}/share
%_sysconfdir        %{_prefix}/etc
%_sharedstatedir        %{_prefix}/var
%_lib                lib
%_libdir        %{_exec_prefix}/%{_lib}
%_includedir        %{_prefix}/include
%_oldincludedir        /usr/include
%_infodir        %{_prefix}/info
%_mandir        %{_prefix}/man

%configure \
CFLAGS="${CFLAGS:-%optflags}" ; export CFLAGS; \
CXXFLAGS="${CXXFLAGS:-%optflags}" ; export CXXFLAGS; \
FFLAGS="${FFLAGS:-%optflags}" ; export FFLAGS; \
./configure --host=%{_host} --build=%{_build} \\\
        --target=%{_target_platform} \\\
        --program-prefix=%{?_program_prefix} \\\
        --prefix=%{_prefix} \\\
        --exec-prefix=%{_exec_prefix} \\\
        --bindir=%{_bindir} \\\
        --sbindir=%{_sbindir} \\\
        --sysconfdir=%{_sysconfdir} \\\
        --datadir=%{_datadir} \\\
        --includedir=%{_includedir} \\\
        --libdir=%{_libdir} \\\
        --libexecdir=%{_libexecdir} \\\
        --localstatedir=%{_localstatedir} \\\
        --sharedstatedir=%{_sharedstatedir} \\\
        --mandir=%{_mandir} \\\
        --infodir=%{_infodir}

%makeinstall \
    make \\\
        prefix=%{buildroot}%{_prefix} \\\
        exec_prefix=%{buildroot}%{_exec_prefix} \\\
        bindir=%{buildroot}%{_bindir} \\\
        sbindir=%{buildroot}%{_sbindir} \\\
        sysconfdir=%{buildroot}%{_sysconfdir} \\\
        datadir=%{buildroot}%{_datadir} \\\
        includedir=%{buildroot}%{_includedir} \\\
        libdir=%{buildroot}%{_libdir} \\\
        libexecdir=%{buildroot}%{_libexecdir} \\\
        localstatedir=%{buildroot}%{_localstatedir} \\\
        sharedstatedir=%{buildroot}%{_sharedstatedir} \\\
        mandir=%{buildroot}%{_mandir} \\\
        infodir=%{buildroot}%{_infodir} \\\
    install


Page 20
常用的头部字段
Name, Version, Release, License, Group, Source, Patch, URL, Requires, BuildRequires
Head 段落通常是 spec 文件的第一段。它提供了要打包的应用程序的信息。头部的字段包括:
* Name - 应用程序的名称
* Version - 应用程序的版本
* Release - 打包的修订版本
* License - 许可方式 (警告:不要用 Copying 或者 Copyright.)
* Group - 应用程序所属的组
* Source - 应用程序的源代码
* Patch - 应用程序的补丁
* URL - 应用程序原始代码的位置
* Requires - 应用程序运行所必需的软件
* BuildRequires - 编译应用程序时必需的软件
Group 字段有效的取值可以在 Redhat 发行版的 /usr/share/doc/rpm-*/GROUPS 文件中找到。
通常,一个 RPM 会需要多于一个 Source 文件和/或 Patch 文件。这时,Source 和 Patch 字段只要简单地编号:
Source0:
Source1:
Patch0:
Patch1:
Requires 和 BuildRequires 字段是可选的。RPM 会在构建时自动计算软件的依赖性关系。Requires 字段允许开发者列出运行时依赖关系,如果他们需要的话。类似的,BuildRequires 字段用来指定为正确编译,必须安装的软件。尽管不常用,指出任何不明显的构建依赖,警告试图编译软件的人,还是礼貌的做法。Requires 和 BuildRequires 都可以列出它们需要的软件名称,如果需要特定的版本,就列出名称和版本号。
头部通常还有两个字段。Summary 字段用来提供要打包的应用程序的短的,一行的自荐性描述,而 %description 字段提供很长的,可能分为多个段落的描述。
如果要在 spec 文件中创建,定义使用自定义宏,它们通常放在头部。

Page 21
高级的头部字段 Arch, Epoch
特殊情况下会在头部使用其他的字段。很多 Architecture 选项可以用来控制软件包构建的体系结构。BuildArch 用来强制软件包为特定体系结构构建,而不是为构建过程所在的平台的默认体系结构。通常,它用来指示所构建的打包是一个 .noarch.rpm:
BuildArch: noarch
并不是所有软件都能在任何平台中编译,就好像并不是所有软件都能在任何体系结构中运行一样。两个指令可以用来强制这些要求。ExclusiveArch 可以用来列出支持这一软件的平台,在其他平台中 RPM 将不会编译它。ExcludeArch 可以用来列出不支持这一软件的平台,RPM 在其他平台中才会编译它。语句
ExcludeArch: s390 s390x
表示软件应当在除了 31 位和 64 位的 s/390 硬件之外的那些机器上构建,而语句
ExclusiveArch: i386 s390 s390x x86_64
表示软件包应当只在 32 位 x86 硬件,31 位和 64 位 s/390 硬件以及 64 位 AMD (Opteron) 硬件中构建,但不在任何其他系统中构建。
RPM 在头部还提供了 Epoch 字段。通常,RPM 软件使用软件包版本和发行标记来判断一个软件包是否比另一个要新。一些软件使用非标准的版本号,或者改变了版本命名。例如,Postfix MTA 过去使用 YearMonthData 作为版本号 (类似于 postfix-19990906.tar.gz)。最近,Postfix 的作者采用了更为传统的双数位版本命名系统 (类似于 postfix-2.0.9.tar.gz)。在 RPM 比较 19990906 与 2.0.9 的时候,19990906 显然要更新 (版本号更高),尽管实际上它出现四年后,postfix-2.0.9 才发布。要更正这些问题,RPM 使用 Epoch 字段。通常,如果不出现,这个字段被认为是 0,如果需要时可以设置为一个更高的值。当比较版本号时,RPM 首先比较 Epoch,其次是 Version,最后是 Release。因此,Postfix 打包在 Epoch 为 1,Version 为 2.0.9 时,就比 Epoch 为 0,Version 为 19990906 的打包要新了。

Page 22
Prep 段落 准备工作
在 Header 头部之后,下一段落通常是 Prep。这一段落总是以标识 %prep 开始,用来准备要编译的软件。通常,这一段落将归档中的源代码解压,并应用补丁。这些可以用标准的 shell 命令完成,但是更多地使用预定义的宏。
常见的一个宏是 %setup。
这个宏解压源代码,将当前目录改为源代码解压之后产生的目录。这个宏还有一些选项可以用。例如,在解压后,%setup 宏假设产生的目录是
%{name}-%{version}
如果 tar 打包中的目录不是这样命名的,可以用 -n 选项来指定要切换到的目录。例如:
%setup -n %{name}-April2003Rel
另一个 %setup 常用的选项是 -q,它将 tar 命令的繁复输出关闭。
这里常见的另一个宏是 %patch。
这个宏将头部定义的补丁应用于源代码。如果定义了多个补丁,它可以用一个数字的参数来指示应用哪个补丁文件。它也接受 -b extension 参数,指示 RPM 在打补丁之前,将文件备份为扩展名是 extension 的文件。
下面的宏
%patch2 -b .test
指示 RPM 应用 Patch2,将任何要修改的文件备份为扩展名是 .test 的文件。
%patch 宏的 -p 选项控制着要传给 /usr/bin/patch 命令的 -p 选项。通常,会使用 -p1,但是,这当然依赖于补丁文件是如何创建的。

Page 23
构建
在 Prep 段落之后,spec 文件通常包含一个 Build 段落,总是以 %build 标识开始。
在这个段落中,包含用来配置和编译已配置的软件的命令。与 Prep 段落一样,这些命令可以是 shell 命令,也可以是宏。
如果要编译的宏使用了 autoconf,那么应当用 %configure 宏来配置软件。这个宏自动为 autoconf 指定了安装软件的正确选项,编译优化的软件。
如果软件不是用 autoconf 配置的,那么使用合适的 shell 命令来配置它。
软件配置之后,必须编译它。由于各个应用程序的编译方法都各自不同,没有用来编译的宏。只要写出要用来编译的 shell 命令就可以了。
环境变量 $RPM_OPT_FLAGS 在编译软件时很常用。这个 shell 变量包含针对 gcc 编译器套件的正确的优化选项,使用这样的语法:
make CC="gcc $RPM_OPT_FLAGS"
或者
make CFLAGS="$RPM_OPT_FLAGS"
就可以保证总是使用合适的优化选项。也可以使用其他编译器标志和选项。默认的 $RPM_OPT_FLAGS 是:
-O2 -g -march=i386 -mcpu=i686

Page 24
Install 段落
在 Build 段落之后,是 Install 段落。这个段落总是以标记 %install 开始。
这个段落用于将已编译的软件安装到虚拟的目录结构中,从而可以打包成一个 RPM。
在 Header 段落,可以定义 Buildroot,它定义了虚拟目录树的位置,软件将安装到那里。通常,它是这样的:
Buildroot: %{_tmppath}/%{name}-root
或是
Buildroot: %{_tmppath}/%{name}-%{version}-root
使用 RPM 内建的宏来指定 /var/tmp 目录中一个私用的目录。
在 spec 文件的其余部分可以用 shell 变量 $RPM_BUILD_ROOT 获取 Buildroot 的值。
mkdir -p $RPM_BUILD_ROOT/usr/share/icons/
cp %{SOURCE3} $RPM_BUILD_ROOT/usr/share/icons/
Install 段落通常列出要将已编译的软件安装到 Buildroot 中的命令
宏 %makeinstall 可以用于安装支持 autoconf 的软件。这个软件自动地将软件安装到 $RPM_BUILD_ROOT 下的正确的子目录中。
有时,软件包必须被构建多次,由于打包错误或其他原因。每次构建时,Install 段落将复制文件到 Buildroot 中。要防止由于 Buildroot 中的旧文件而导致错误的打包,必须在安装新文件之前将 Buildroot 中任何现有的文件删除。为此,可以使用一个 clean 脚本。这个脚本通常以 %clean 标记表示,通常仅仅包含这样一句:
rm -rf $RPM_BUILD_ROOT
如果有的话,在制作了在 Install 段落中安装的文件的打包之后,将运行 %clean,保证下次构建之前 Buildroot 被清空。

Page 25
Files 段落
在 Install 段落之后,下一个段落是 Files,列出了要打包到一个 RPM 中的文件和目录。这个段落通常以标记 %files 开始。在这个段落中,每行一个,简单地列出文件和目录,相对于 Bduilroot,它们将被存档到打包中。可以在这里使用通配符,例如
/usr/bin/*
指示 RPM 将 $RPM_BUILD_ROOT/usr/bin 目录中所有文件打包。
在列出文件和目录时,必须小心列出所有需要的文件,不要列出任何不应被打包的文件。在列出一个目录时要更加小心。列出一个目录意味着 RPM 要打包这个目录以及其中的所有文件,因此语句
/usr/bin
指示 RPM 将 $RPM_BUILD_ROOT/usr/bin 目录中所有文件打包,但是也会创建一个似乎拥有 /usr/bin 目录的不正确的打包。
在 Files 段落,有一些宏可以用。应当总是应用 %defattr 宏来指定之后列出文件的默认的所有者和权限。例如,语句 %defattr(0770,root,root) 将定义其后列出的所有文件和目录,直到下一个 %defattr 为止,它们在安装后的所有者是 root.root,拥有权限 0770。另外,单独的文件可以用 %attr 指定与 %defattr 不同的所有者和权限。例如:
%files
%defattr(-,root,root)
%{_libdir}/libamanda*.so
%attr(660,amanda,disk) /var/lib/amanda/.amandahosts
一些宏用来指示要安装的文件具有特殊的属性。宏 %dir 可以用来指示要打包的是一个目录,而不是目录中的文件。宏
%config(noreplace)
用来指示被安装的是一个配置文件,在软件包升级时不应被覆盖。

Page 26
可选的脚本段落
有时需要在安装的前后,在系统中运行一些命令。例如,在安装了新的动态链接库之后,应当运行 ldconfig 命令来使系统使用新安装的库。
RPM spec 文件可以包含分别在安装和卸载前后运行的脚本。这些脚本通常在 Files 段落之后列出,是简单的 Bourne shell 脚本,列在一个指示它们何时执行的宏后面。可用的值为:
* %pre - 安装前执行
* %post - 安装后执行
* %preun - 卸载前执行
* %postun - 卸载后执行
最常见的,这些命令用在需要使用新系统帐号才能运行的软件打包中。%pre 脚本可以用来添加需要的帐号,%postun 可以用来在卸载软件时删除这个不再需要的帐号。在 Redhat 系统中准备需要用户帐号的打包时,参考 /usr/share/doc/setup-*/uidgid 文件,它列出了 Redhat 附带的软件已经使用了的 UIDs 和 GIDs。
有时,需要在 %pre, %post, %preun 和 %postun 中执行的脚本是随机的,要根据当前系统中软件的安装情况进行抉择。例如,Mailman 邮件列表管理程序需要一些邮件别名才能工作,因此它的打包需要在 %post 脚本中,向系统添加一些邮件别名,在 %postun 脚本中移除它们。这些别名要写入的位置是随系统中安装的 MTA 而不同的——postfix 使用文件 /etc/postfix/aliases 作为别名数据库,而 Sendmail 使用文件 /etc/aliases 作为别名数据库。
这种情况下,要采用的动作取决于当前系统状态的话,可以用 shell 脚本的条件判断。不过,RPM 提供了一种触发机制,可以用来在其他软件安装/卸载时执行动作。这些脚本以
%triggerin -- package
还有
%triggerun -- package
标记。第一个标记表示软件 package 安装或升级时运行的脚本,而第二个表示软件 package 卸载时运行的脚本。

Page 27
Changelog 段落
spec 中的最终段落是 Changelog 段落。这个段落总是以 %changelog 标记开始,用来列出对打包的任何修改。
尽管日志的结构技术上可以是自由格式,但是大多数 RPM 系统中使用下面的格式:
* 日期 打包人 <打包人的电子邮件> 版本-发行标记
- 所作的更改
- 其他更改
日期必须是下列格式:
Wed Nov 20 2002
这种格式的当前日期可以用命令
date +"%a %b %d %Y"
得到。
每次准备打包的新的修订版时,打包人只要在 Chanlog 段落起始处加上类似的一段。
下列范例是来自 Fedora Core 3 firefox RPM spec:
* Wed Mar 02 2005 Christopher Aillon <caillon@redhat.com> 0:1.0.1-1.3.2
- Remerge firefox-1.0-pango-selection.patch
* Thu Feb 24 2005 Christopher Aillon <caillon@redhat.com> 0:1.0.1-1.3.1
- Update to 1.0.1 fixing several security flaws.
- Mark some generated files as ghost (#136015)
- Add RPM version to the useragent
- BuildRequires pango-devel
- Enable pango rendering by default
- Enable smooth scrolling by default
Redhat 使用的一个约定是引用它们的错误跟踪系统的错误 Id。在这个例子中,引用了一个有关 RPM 打包的错误。详情可以通过下面的网址查看:
https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=136015

Page 28-31
最后的 spec 文件

Page 32
其他内容
除了基本的 spec 文件结构,还有一些高级的需求。通常,一个应用程序需要打包为两个或多个软件包。例如,LessTif 软件包提供了多种不同的内容:一个运行时库,为连接到 Motif 部件集的软件所用,编程的头文件和库文件,开发者用它们来创建应用程序,还有一个窗口管理器。这是三个明显不同的应用程序,不同的用户需要不同的组合。因此, RPM spec 文件可以设定为生成子打包,通过同一个源代码生成两个或多个二进制打包。
另一个常见的需求是在不能获得源代码时,打包二进制文件。例如,Adobe 发布了 Acrobat Reader for Linux,但是在第七版之前,他们只发布二进制可执行文件的 tar 打包。可以为此创建 RPM,允许用户使用 RPM 工具来管理这个程序。要创建这样的 spec 文件,只要简单地省略 Build 段落,在 %install 段落中,手动复制文件到虚拟根文件系统中就可以了。
打包人有时想创建交互式的 RPM,也就是说,在安装过程中询问用户问题。RPM 故意地不支持创建交互的打包!只为保证所有安装过程可以脚本化。要小心设计软件包,避免安装时的交互。
打包人通常需要为多个发行版准备打包。需要考虑一些潜在的复杂情况,才能使单个 spec 文件用于在多个发行版中编译 RPM:
* 不同的发行版预定义了不同的宏。大多数在 Redhat 发行版中定义的宏处于一个 “基线” 上,可以假设绝大多数发行版中也定义了它们,包括 SuSE 发行版。因此,只使用 Redhat 系统中定义的宏,有助于跨发行版的兼容性。
* 不同的发行版使用不同版本的 RPM。旧版本的 Linux 发行版使用旧版本的 RPM 3,而较新的系统使用新的 RPM 4。不同的 RPM 版本中有行为和语法的差别,必须消除。
* 有时不同的发行版将文件安装在不同的位置。Linux Standards Base (LSB) 的努力消除了很多这样的因素,但是还是可能出现。
打包者总会想发布支持多种语言的打包,使用户可以看到以母语显示的打包描述以及相关信息。RPM 提供了一个 specspo 机制,可以用来为打包文件保存已翻译的消息。

Page 33
构建软件包
当准备好 spec 文件之后,接下来是使用 spec 文件构建软件。基本的构建命令,在较新的系统中是 rpmbuild -b spec,在过去的系统中是 rpm -b spec。这个命令支持下面各种不同的参数,取决于要处理 spec 文件的哪一部分:
* -bp - 处理 spec 文件的 Prep 部分
* -bc - 处理 spec 文件的 Prep 和 Build 部分
* -bi - 处理 spec 文件的 Prep, Build 和 Install 部分
* -bl - 校验 spec 文件的 Files 部分
* -bb - 根据 spec 文件构建二进制 RPM
* -bs - 根据 spec 文件构建源代码 RPM
* -ba - 根据 spec 文件同时构建二进制 RPM 和源代码 RPM
最常用的是
rpmbuild -ba spec
有时会用 --target 参数来强制 RPM 为特定的平台编译软件。例如,在 32 位 x86 系统,运行 rhel/fc 的平台中,RPM 默认生成运行在任何 32 位 x86 计算机上的打包,但是对于 80686 级别的计算机会做优化。这个选项可以用来强制 RPM 生成只在 80686 级别的计算机中运行的,或是为 AMD Athlon 更好优化过的,或是为 80386 级别的计算机优化过的打包。命令
rpmbuild -ba --target i686-redhat-linux spec
根据 spec 构建 RPM,只与 80686 级别的机器兼容,比默认的 RPM 优化要稍微更好一点。
在构建打包时,RPM 提供在命令行覆盖或修改 RPM 宏的能力。打包人通常用这个特性来生成可以用来编译相同的软件,但是使用不同选项的 spec。例如,rhel/fc 的 Postfix spec 在 Header 段落包含了各种宏定义,在编译期启用或禁用支持各种特性。这个语句
%define LDAP 0
用来定义 LDAP 的值为 0,在后面 Build 段落中的命令使用这个变量来编译不带 LDAP 支持的 Postfix。使用这样的命令行来覆盖这个变量的值:
rpmbuild -ba --define 'LDAP 1' postfix.spec
Postfix 在编译时就有了 LDAP 支持。

Page 34
数字签名的软件包
由 spec 文件创建了二进制和源代码 RPM 之后,可以使用 GPG 或 PGP 为结果 RPM 签名。签名为下载软件包的最终用户提供了两个重要的功能:
* 它们证明软件包可信,向用户保证,打包来自它应该来自的地方。
* 它们保证打包的完整性,向用户保证软件包在打包人签名之后,没有遭到修改 (尽管 RPM 还通过其他机制提供了这一保证)
这些特性在当今木马横行的互联网上都非常重要。
要签署一个打包,必须首先有一个 GPG 密钥。如果没有的话,可以很容易地生成一个:
$ gpg --gen-key
生成密钥之后,修改你的 RPM macros 来指示 RPM 使用 GPG 签署打包:
echo "%_signature gpg" >> $HOME/.rpmmacros
同时,指定 RPM 应当使用哪个密钥来签署打包:
echo "%_gpg_name 邮件地址" >> $HOME/.rpmmacros
最后,指定 RPM 如何定位你的 GPG 密钥:
echo "%_gpg_path $HOME/.gnupg" >> $HOME/.rpmmacros
配置好 RPM 使用 GPG 之后,可以用 rpmsign 命令来签署你构建的打包:
$ rpmsign --addsign /path/to/the.rpm
可以导出你的公钥:
$ gpg --export --armor > gpg-pub-key
然后将公钥发给安装你的 RPM 的用户,他们可以用它来校验你的 RPM 是由你签署的。要做到这一点,他们必须首先导入你的 GPG 公钥到他们的 RPM GPG 钥匙环中:
# rpmsign --import /path/to/gpg-pub-key
导入公钥之后,可以校验打包的签名了:
$ rpmsign -K package-1.0-1.i386.rpm
package-1.0-1.i386: (sha1) dsa sha1 md5 gpg OK
如果打包通过校验,那么用户就知道它的签名来自他们信任的一方了。

Page 35
修订打包
除创建新的 RPM 之外,打包人另一个经常性的任务是更新现有的打包,在应用程序有新的版本可用时重建打包。修正现有的源代码 RPM 只要很简单的几步:
1. 安装最新的 SRPM
2. 将应用程序的最新的源代码放在 SOURCES 目录
3. 修改 spec 文件为使用最新的源代码
4. 试着做 spec 文件的 Prep 段落:
$ rpmbuild -bp application.spec
在尝试的时候可能会发现,一些补丁不再适用于新版本的源代码了。这时,查看补丁文件的内容,以及应用程序的源代码,检查为什么不适用。
1. 补丁无法应用,是因为不再需要了。这时,只要从 spec 文件中移除补丁就可以了
2. 补丁仍然需要,但是无法应用,因为应用程序的代码在其他部分发生了变化。这时,创建一个新版本的补丁,使它可以适用于新版本的源代码
可以成功完成 Prep 段落之后,更新 spec 文件中的 Changelog 段落以及版本信息,然后构建新打包:
$ rpmbuild -ba application.spec

Page 36
其他资源
有很多资源,提供了更多有关 RPM 和如何创建 RPM 的信息。最好的资源是 http://www.rpm.org ,提供了各种有关 RPM 的文档,以及 RPM 的源代码。这个站点有一本免费下载的书,《Maximum RPM》。尽管它有些过时,但是仍然是不错的补充资源。
很多工具可以简化 RPM 的创建,包括文本编辑器的 spec 文件编辑模式:
http://www.tihlde.hist.no/~stigb/rpm-spec-mode.el
http://pegasus.rutgers.edu/~elflord/vim/syntax/spec.vim
还有各种生成 spec 文件的工具:
http://rpmrebuild.sourceforge.net
http://www.cpan.org/modules/by-m ... pecfile-1.17.tar.gz
http://checkinstall.izto.org
为多个系统准备打包的主要困难是需要有为每个系统准备独立的构建环境。有很多程序可以用来简化在同一台机器上创建多个构建环境:
http://thomas.apesstaart.org/projects/mach
http://www.solucorp.qc.ca/miscprj/s_context.jc
一些网站提供各种高质量的编译好的 RPM,也可以用来寻找已有的 RPM:
http://freshrpms.net
http://www.fedoraproject.org
http://www.rpmfind.net
http://www.GuruLabs.com/downloads.html
有很多工具可以用来简化安装 RPM 的工作,包括:
http://current.tigris.org
http://www.linux.duke.edu/projects/yum
http://www.autorpm.org
http://www.mat.univie.ac.at/~gerald/autoupdate
http://apt4rpm.sourceforge.net
http://www.smartpm.org


实验

任务 1 (6 小题) (p.39-p.42)
任务 2 (10 小题) (p.43-p.51)
任务 3 (53 小题) (p.52-p.79)
任务 4 (13 小题) (p.80-p.86)
回复 支持 反对

使用道具 举报

发表于 2005-5-3 14:46:56 | 显示全部楼层
强人斑竹,佩服的五体投地了,不是一般的敬业啊。
回复 支持 反对

使用道具 举报

发表于 2005-5-3 17:34:55 | 显示全部楼层
嗯,对我们初学者来说,这些资料很有用,谢了,希望楼主以后多贴些适合初学者的资料!
回复 支持 反对

使用道具 举报

发表于 2005-5-3 18:04:50 | 显示全部楼层
呵呵 初学者好像用不到这些呢 yum/apt 的文档更适合初学者

这里还有一些非常有用的文档,可以学习 rpm 系统的使用
http://www.rpm.org/rpmapi-4.1/pages.html

rpm Related Pages
Here is a list of all related documentation pages:

    * Default configuration: /usr/lib/rpm/macros   http://www.rpm.org/rpmapi-4.1/config_macros.html

    * Default configuration: /usr/lib/rpm/rpmpopt-4.1   http://www.rpm.org/rpmapi-4.1/config_rpmpopt.html

    * Default configuration: /usr/lib/rpm/rpmrc   http://www.rpm.org/rpmapi-4.1/config_rpmrc.html

    * Generating buiild dependencies automatically   http://www.rpm.org/rpmapi-4.1/builddpendencies.html

    * Using a build root   http://www.rpm.org/rpmapi-4.1/buildroot.html

    * Passing conditional parameters into a rpm build   http://www.rpm.org/rpmapi-4.1/conditionalbulds.html

    * Dependencies   http://www.rpm.org/rpmapi-4.1/dependencies.html

    * Package format   http://www.rpm.org/rpmapi-4.1/pkgformat.html

    * Immutable header regions in rpm-4.0.1 and later   http://www.rpm.org/rpmapi-4.1/hregions.html

    * Macro syntax   http://www.rpm.org/rpmapi-4.1/macros.html

    * Multiple build areas   http://www.rpm.org/rpmapi-4.1/multiplebuilds.html

    * Query formats   http://www.rpm.org/rpmapi-4.1/queryformat.html

    * Signature header   http://www.rpm.org/rpmapi-4.1/signatures.html

    * Relocateable packages   http://www.rpm.org/rpmapi-4.1/relocateable.html

    * Spec file tags   http://www.rpm.org/rpmapi-4.1/specfile.html

    * Trigger scriptlets   http://www.rpm.org/rpmapi-4.1/triggers.html

    * Package ordering in rpm-4.0.1 and later   http://www.rpm.org/rpmapi-4.1/tsort.html

    * Todo List
Generated at Thu Apr 19 15:29:51 2001 for rpm by doxygen
回复 支持 反对

使用道具 举报

发表于 2005-5-3 20:59:41 | 显示全部楼层
这个东西一定要保存好哦~
回复 支持 反对

使用道具 举报

发表于 2005-5-7 11:41:03 | 显示全部楼层
学会一个命令
fedora-extras 仓库
fedora-rpmdevtools 软件包
fedora-buildrpmtree 命令
作用:构造非 root 用户的 rpm 目录树,并且设置在个人目录中进行 rpm 打包的宏
回复 支持 反对

使用道具 举报

发表于 2005-5-12 22:29:44 | 显示全部楼层
rpm 相关的手册页已经翻译完了,可以在这里查看,也可以到 http://sf.linuxforum.net/projects/cmpp 去下载所有的 已翻译的中文手册页, 打包为 rpm 格式


gendiff.1
  1. GENDIFF(1)                                                          GENDIFF(1)



  2. NAME
  3.        gendiff - 致力于创建无错的 diff 文件的工具

  4. SYNOPSIS
  5.        gendiff <directory> <diff-extension>

  6. DESCRIPTION
  7.        gendiff  是一个简单的脚本,目标是根据单一的目录生成一个 diff 文件。它以
  8.        一个目录名,以及一个 "diff 扩展名" 作为它的参数。diff 扩展名应当是一 个
  9.        唯 一 的 字符序列,添加到所有原始的,未修改的文件后面。程序的输出是一个
  10.        diff 文件,可以使用 patch 程序来应用它,重新创造修改。

  11.        通常,创建 diff 文件的步骤是创建两个完全相同的目录,在其中一个中进行 修
  12.        改,然后使用 diff 工具来创建两个目录之间区别的列表。使用 gendiff 消除了
  13.        对额外的,原始的,未修改的目录复件的要求。只有需要修改的个别文件需要 被
  14.        保存。

  15.        在 编辑之前,复制一份文件,将所选的扩展名附加到文件名后面。也就是说,如
  16.        果要修改 somfile.cpp,并且已经选择了扩展名 "fix",那么在修改之前,将 它
  17.        复制为 somefile.cpp.fix。然后,修改原来的文件 (somefile.cpp)。

  18.        这样编辑所有文件之后,进入源代码所在的那个目录的上级目录,然后输入

  19.            $ gendiff somedirectory .fix > mydiff-fix.patch

  20.        应当将输出重定向到一个文件 (像例子中一样),除非你想在标准输出上看到结果
  21.        。


  22. SEE ALSO
  23.        diff(1), patch(1)


  24. AUTHOR
  25.        Marc Ewing <marc@redhat.com>


  26. TRANSBY
  27.        LinuxForum.Net CMPP 中文手册页计划 [url=http://cmpp.linuxforum.net]

  28.        * Tue May 3 2005 Yuan Yijun <bbbush@163.com> rpm-4.4.1-3
  29.        - 初始版本, 来自于 rpm 的手册页集合



  30. 4th Berkeley Distribution       Mon Jan 10 2000                     GENDIFF(1)
复制代码


rpm2cpio.8
  1. rpm2cpio(8)                      Red Hat Linux                     rpm2cpio(8)



  2. NAME
  3.        rpm2cpio - 从 RPM 软件包中提取 cpio 归档

  4. SYNOPSIS
  5.        rpm2cpio [filename]

  6. DESCRIPTION
  7.        rpm2cpio 将指定的一个 .rpm 文件转换为一个 cpio 文档,输出到标准输出。如
  8.        果给出了 ‘-’ 参数,那么将从标准输入读取 rpm 文件。

  9.        rpm2cpio rpm-1.1-1.i386.rpm
  10.        rpm2cpio - < glint-1.0-1.i386.rpm


  11. SEE ALSO
  12.        rpm(8)

  13. AUTHOR
  14.        Erik Troan <ewt@redhat.com>


  15. TRANSBY
  16.        LinuxForum.Net CMPP 中文手册页计划 [url=http://cmpp.linuxforum.net]

  17.        * Tue May 3 2005 Yuan Yijun <bbbush@163.com> rpm-4.4.1-3
  18.        - 初始版本, 来自于 rpm 的手册页集合




  19. Red Hat, Inc.                   11 January 2001                    rpm2cpio(8)
复制代码


rpmcache.8
  1. RPMCACHE(8)                      Red Hat Linux                     RPMCACHE(8)



  2. NAME
  3.        rpmcache - 缓存 RPM 打包头部

  4. SYNOPSIS
  5.        rpmcache [ PACKAGE_NAME ... ]


  6. DESCRIPTION
  7.        rpmcache 遍历文件树,可能通过 FTP 使用远程文件,使用 glob(7) 表达式过滤
  8.        路径,读取 rpm 打包头部。最新的软件包 (对于相同的软件包名称,比较代/ 版
  9.        本/ 发 行数字,以及构建时间,来解决冲突) 的头部,如果唯一的话,就缓存在
  10.        rpm 数据库中。rpm 数据库缓存可以用来提供解决软件包未知依赖关系时的建 议
  11.        。

  12.        没有特定于 rpmcache 的选项,只有一般的 rpm 选项。参见 rpmcache 用法信息
  13.        ,察看当前已实现的内容。

  14.        要搜索的文件树路径是以 rpm 宏配置的。最终路径是 5 个独立的元素的拼装 。
  15.        下面是用于配置 rpmcache 的宏名称。在文件树中将遍历:


  16.        %_bhpath
  17.               " 路径" 一级包含要遍历的文件树的文件树路径 (或 URL) 的前缀部分。
  18.               这里不能使用 glob(7) 表达式。

  19.        %_bhcoll
  20.               "集合" 一级包含一个字符串 (或 glob(7) 表达式),来匹 配  %_bhpath
  21.               的子目录。

  22.        %_bhN  " 名 称" 一级包含一个字符串 (或 glob(7) 表达式),来匹配 %_bhcoll
  23.               的子目录。可以用 PACKAGE_NAME 参数来构造一个 glob(7) 表达式, 匹
  24.               配 Redhat 构建系统中任何指定软件包的名称,在 Redhat 之外几乎没有
  25.               任何用处。

  26.        %_bhVR "版本发行" 一级包含一个字符串 (或 glob(7) 表达式),来匹配  %_bhN
  27.               的子目录。

  28.        %_bhA  "体系结构" 一级包含一个字符串 (或 glob(7) 表达式),来匹配 %_bhVR
  29.               的子目录。

  30.        缓存数据库的位置也使用一个 rpm 宏

  31.        %_cache_dbpath
  32.               来配置。默认的值是 /var/spool/up2date/cache。

  33.        缓存数据库与 rpm 数据库的格式完全相同,可以用在 rpm 命令中。例如,要 使
  34.        用 缓存数据库,来提供建议,给出满足软件包安装时依赖关系的软件包,可以将
  35.        下面的宏配置在 /etc/rpm/macros 或 ~/.rpmmacros 中:

  36.        %_solve_dbpath
  37.               用于提供依赖关系建议的数据库的位置


  38.    范例 (最小) 配置,针对一个 Redhat 文件树:
  39.        %_cache_dbpath  /var/spool/up2date/cache
  40.        %_solve_dbpath  %{_cache_dbpath}
  41.        %_bhpath        file://localhost/mnt/redhat/beehive/comps/dist
  42.        %_bhcoll        7.3
  43.        %_bhN           @(basesystem|bash|filesystem|glibc-common|glibc|ldconfig|libtermcap|mktemp|setup|termcap)
  44.        %_bhVR          *
  45.        %_bhA           @(i[3456]86|noarch)

  46.    范例 (最小) 配置,针对一个 Redhat FTP 树:
  47.        %_cache_dbpath  /var/spool/up2date/cache
  48.        %_solve_dbpath  %{_cache_dbpath}
  49.        %_bhpath        ftp://localhost/mnt/dist
  50.        %_bhcoll        @(7.3|7.2|7.1|7.0|6.2|6.1|6.0|5.2|5.1|5.0)
  51.        %_bhN           @(%{_arch})
  52.        %_bhVR          *
  53.        %_bhA           @(i[3456]86|noarch)

  54. BUGS
  55.        Yup. 请将有关 rpm-devel 软件包的错误报告和特性需求提 交 到  bugzilla :
  56.        http://bugzilla.redhat.com/ <URL:http://bugzilla.redhat.com/>

  57. SEE ALSO
  58.        rpm(8), glob(7),

  59.         http://www.rpm.org/ <URL:http://www.rpm.org/>

  60. AUTHORS
  61.        Jeff Johnson <jbj@redhat.com>


  62. TRANSBY
  63.        LinuxForum.Net CMPP 中文手册页计划 [url=http://cmpp.linuxforum.net]

  64.        * Tue May 3 2005 Yuan Yijun <bbbush@163.com> rpm-4.4.1-3
  65.        - 初始版本, 来自于 rpm 的手册页集合



  66. Red Hat, Inc.                    05 July 2002                      RPMCACHE(8)
复制代码


rpmdeps.8
  1. RPMDEPS(8)                       Red Hat Linux                      RPMDEPS(8)



  2. NAME
  3.        rpmdeps - 生成 RPM 软件包依赖关系

  4. SYNOPSIS
  5.        rpmdeps {-P|--provides} {-R|--requires} FILE ...


  6. DESCRIPTION
  7.        rpmdeps 根据 FILE 参数集合,生成软件包依赖关系。FILE 参数中的每个都进行
  8.        搜索,查找 Elf32/Elf64,脚本解释器,以及每个脚本的依赖性关系,将依赖 性
  9.        关系输出到标准输出。

  10. SEE ALSO
  11.        rpm(8),

  12.        rpmbuild(8),

  13. AUTHORS
  14.        Jeff Johnson <jbj@redhat.com>

  15. TRANSBY
  16.        LinuxForum.Net CMPP 中文手册页计划 [url=http://cmpp.linuxforum.net]

  17.        * Tue May 3 2005 Yuan Yijun <bbbush@163.com> rpm-4.4.1-3
  18.        - 初始版本, 来自于 rpm 的手册页集合




  19. Red Hat, Inc.                   24 October 2002                     RPMDEPS(8)
复制代码


rpmgraph.8
  1. RPMGRAPH(8)                      Red Hat Linux                     RPMGRAPH(8)



  2. NAME
  3.        rpmgraph - 显示 RPM 软件包依赖关系图

  4. SYNOPSIS
  5.        rpmgraph PACKAGE_FILE ...


  6. DESCRIPTION
  7.        rpmgraph   使用 PACKAGE_FILE 参数来产生一个软件包依赖关系图。每个 PACK-
  8.        AGE_FILE 参数都被读取并添加到 rpm 事务集中。事务集的元素使用拓扑排序 得
  9.        到偏序关系。元素的偏序关系被输出到标准输出。

  10.        依 赖关系图中的节点是软件包名称,有向图中的边指向每个节点的父节点。父节
  11.        点被定义为,将软件包依赖性作为一个偏序关系,一个软件包的最近的前驱。 这
  12.        意味着,给定一个软件包,它的父节点是它依赖的软件包中的最后一个。

  13.        输出是 dot(1) 有向图格式,可以使用 graphviz 软件包中的 dotty 图像编辑器
  14.        来显示或打印。没有特定于 rpmgraph 的选项,只有一般的 rpm 选 项 。 参 见
  15.        rpmgraph 用法信息,察看当前已实现的内容。

  16. SEE ALSO
  17.        dot(1),

  18.        dotty(1),

  19.         http://www.graphviz.org/ <URL:http://www.graphviz.org/>

  20. AUTHORS
  21.        Jeff Johnson <jbj@redhat.com>


  22. TRANSBY
  23.        LinuxForum.Net CMPP 中文手册页计划 [url=http://cmpp.linuxforum.net]

  24.        * Tue May 3 2005 Yuan Yijun <bbbush@163.com> rpm-4.4.1-3
  25.        - 初始版本, 来自于 rpm 的手册页集合



  26. Red Hat, Inc.                    30 June 2002                      RPMGRAPH(8)
复制代码


rpm.8
  1. RPM(8)                                 Red Hat Linux                                RPM(8)



  2. NAME
  3.        rpm - RPM 软件包管理器

  4. SYNOPSIS
  5.    查询和校验软件包:
  6.        rpm {-q|--query} [select-options] [query-options]



  7.        rpm {-V|--verify} [select-options] [verify-options]



  8.        rpm --import PUBKEY ...



  9.        rpm {-K|--checksig} [--nosignature] [--nodigest]
  10.            PACKAGE_FILE ...


  11.    安装,升级和卸载软件包:
  12.        rpm {-i|--install} [install-options] PACKAGE_FILE ...



  13.        rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...



  14.        rpm {-F|--freshen} [install-options] PACKAGE_FILE ...



  15.        rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts]
  16.            [--notriggers] [--repackage] [--test] PACKAGE_NAME ...


  17.    其他:
  18.        rpm {--initdb|--rebuilddb}



  19.        rpm {--addsign|--resign} PACKAGE_FILE ...



  20.        rpm {--querytags|--showrc}



  21.        rpm {--setperms|--setugids} PACKAGE_NAME ...


  22.    选择选项
  23.         [PACKAGE_NAME] [-a,--all] [-f,--file FILE]
  24.         [-g,--group GROUP] {-p,--package PACKAGE_FILE]
  25.         [--fileid MD5] [--hdrid SHA1] [--pkgid MD5] [--tid TID]
  26.         [--querybynumber HDRNUM] [--triggeredby PACKAGE_NAME]
  27.         [--whatprovides CAPABILITY] [--whatrequires CAPABILITY]


  28.    查询选项
  29.         [--changelog] [-c,--configfiles] [-d,--docfiles] [--dump]
  30.         [--filesbypkg] [-i,--info] [--last] [-l,--list]
  31.         [--provides] [--qf,--queryformat QUERYFMT]
  32.         [-R,--requires] [--scripts] [-s,--state]
  33.         [--triggers,--triggerscripts]


  34.    校验选项
  35.         [--nodeps] [--nofiles] [--noscripts]
  36.         [--nodigest] [--nosignature]
  37.         [--nolinkto] [--nomd5] [--nosize] [--nouser]
  38.         [--nogroup] [--nomtime] [--nomode] [--nordev]


  39.    安装选项
  40.         [--aid] [--allfiles] [--badreloc] [--excludepath OLDPATH]
  41.         [--excludedocs] [--force] [-h,--hash]
  42.         [--ignoresize] [--ignorearch] [--ignoreos]
  43.         [--includedocs] [--justdb] [--nodeps]
  44.         [--nodigest] [--nosignature] [--nosuggest]
  45.         [--noorder] [--noscripts] [--notriggers]
  46.         [--oldpackage] [--percent] [--prefix NEWPATH]
  47.         [--relocate OLDPATH=NEWPATH]
  48.         [--repackage] [--replacefiles] [--replacepkgs]
  49.         [--test]


  50. DESCRIPTION
  51.        rpm 是一个强大的 软件包管理器,可以用来构建,安装,查询,校验,升级和卸
  52.        载单独的软件打包。一个 打包 包括文件的归档,以及用来安装和卸载归档文 件
  53.        的元信息。元信息包括辅助脚本,文件属性以及打包的描述性信息。打包 有两种
  54.        ,二进制打包,用来封装要安装的软件;源代码打包,包含源代码以及为生成 二
  55.        进制打包,必要的文件。

  56.        必 须选择下列模式之一: Query 查询, Verify 校验, Signature Check 检查签
  57.        名, Install/Upgrade/Freshen 安装/升级/更新, Uninstall 卸载,  Initialize
  58.        Database         初始化数据库, Rebuild Database 重构数据库, Resign 重签名, Add
  59.        Signature 添加签名, Set Owners/Groups 设置属主, Show Querytags 显示查询
  60.        标记, 以及 Show Configuration 显示配置.

  61.    一般选项
  62.        这些选项可以用在所有不同的模式中。

  63.        -?, --help
  64.               输出更长的帮助信息。

  65.        --version
  66.               输出一行信息,包括使用的 rpm 的版本号。

  67.        --quiet
  68.               输出尽可能少的信息 - 通常只有错误会显示。

  69.        -v     输出冗余信息 - 通常,常规的进度信息将显示。

  70.        -vv    输出大量丑陋的调试信息。

  71.        --rcfile FILELIST
  72.               FILELIST 中冒号分隔的每个文件名都被 rpm 按顺序读取,从中获得配置
  73.               信息。只有列表的第一个文件必须存在,波浪线将被替换为 $HOME。默认
  74.               的     FILELIST            是          /usr/lib/rpm/rpmrc:/usr/lib/rpm/red-
  75.               hat/rpmrc:/etc/rpmrc:~/.rpmrc

  76.        --pipe CMD
  77.               将 rpm 的输出通过管道送到命令 CMD。

  78.        --dbpath DIRECTORY
  79.               使用 DIRECTORY 中的数据库,而不是默认的路径 /var/lib/rpm

  80.        --root DIRECTORY
  81.               以 DIRECTORY 作为根文件系统,进行所有操作。这意味着将使用 DIREC-
  82.               TORY   中 的 数 据库来进行依赖性检测,任何小程序 (也就是安装中的
  83.               %post 和构建中的 %prep) 都将在一个 chroot(2) 到 DIRECTORY 之后执
  84.               行。

  85.    安装和升级选项
  86.        安装命令的一般形式是


  87.        rpm {-i|--install} [install-options] PACKAGE_FILE ...


  88.        这样安装了一个新软件包。

  89.        升级命令的一般形式是


  90.        rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...


  91.        这 样安装或升级已安装的软件包到新版本。它与安装类似,只是所有其他版本的
  92.        打包在新软件包安装后都将移除。


  93.        rpm {-F|--freshen} [install-options] PACKAGE_FILE ...


  94.        仅当系统中存在更早的版本时,这样会升级软件包。PACKAGE_FILE 必须指 定 为
  95.        ftp  或 http URL,这样软件包可以在安装之前去下载。参见 FTP/HTTP OPTIONS
  96.        中有关 rpm 的内嵌 ftp 和 http 客户端支持。


  97.        --aid  需要时将建议的软件包加入事务集。

  98.        --allfiles
  99.               安装或升级软件包中所有 missingok 文件,哪怕它们已经存在。

  100.        --badreloc
  101.               与 --relocate 搭配使用,允许所有文件的重定位,而不仅仅是在二进制
  102.               打包中,重定位提示包含的那些 OLDPATH。

  103.        --excludepath OLDPATH
  104.               不安装名称以 OLDPATH 开始的文件。

  105.        --excludedocs
  106.               不安装任何标记为文档的文件 (包括手册页和 texinfo)。

  107.        --force
  108.               与使用 --replacepkgs, --replacefiles, 以及 --oldpackage 相同。

  109.        -h, --hash
  110.               在打包被解压时,输出 50 个 hash 符号 (#),用来与 -v|--verbose 配
  111.               合,得到漂亮一点的输出。

  112.        --ignoresize
  113.               安装前不检测已挂载文件系统的空闲空间。

  114.        --ignorearch
  115.               允许安装或升级,即使二进制打包的体系结构与主机不匹配。

  116.        --ignoreos
  117.               允许安装或升级,即使二进制打包的操作系统与主机不匹配。

  118.        --includedocs
  119.               安装文档文件。这是默认的行为。

  120.        --justdb
  121.               只更新数据库,不更新文件系统。

  122.        --nodigest
  123.               读取时不校验打包或头部校验。

  124.        --nosignature
  125.               读取时不校验打包或头部签名。

  126.        --nodeps
  127.               在安装或升级前,不进行依赖性检测。

  128.        --nosuggest
  129.               不建议提供了所需依赖关系的软件包。

  130.        --noorder
  131.               不为安装重排序。通常软件包列表会被重排序,以满足依赖性关系。

  132.        --noscripts

  133.        --nopre

  134.        --nopost

  135.        --nopreun

  136.        --nopostun
  137.               不执行对应的小程序。--noscripts 选项与

  138.               --nopre --nopost --nopreun --nopostun

  139.               等价,将 %pre, %post, %preun, 和 %postun 小程序全部关闭。

  140.        --notriggers

  141.        --notriggerin

  142.        --notriggerun

  143.        --notriggerpostun
  144.               不执行任何对应的触发小程序。--notriggers 选项与

  145.               --notriggerin --notriggerun --notriggerpostun

  146.               等价,将 %triggerin, %triggerun, 和 %triggerpostun 小程序全部 关
  147.               闭。

  148.        --oldpackage
  149.               允许用旧软件包替换一个新软件包。

  150.        --percent
  151.               打 印从软件包中解压文件的百分比。这是为了使 rpm 在其他工具中运行
  152.               时简单一些。

  153.        --prefix NEWPATH
  154.               对于可重定位的包,将以软件包重定位提示的安装前缀开始的所有文件路
  155.               径转换为以 NEWPATH 开始。

  156.        --relocate OLDPATH=NEWPATH
  157.               对 于克重定位的二进制打包,将软件包重定位提示中,以 OLDPATH 开始
  158.               的文件路径转换为以 NEWPATH 开始。这一选项可以使用多次,如果软 件
  159.               包中多个 OLDPATH 要重定位的话。

  160.        --repackage
  161.               在 卸 载 前 重 新 打 包 文 件 。过去安装的打包将根据宏 %_repack-
  162.               age_name_fmt 命名,将创建于宏 %_repackage_dir 指定的目录中 (默认
  163.               值是 /var/spool/repackage)。

  164.        --replacefiles
  165.               安装软件包,即使他们替换了其他已安装的软件包的文件。

  166.        --replacepkgs
  167.               安装软件包,即使其中有些软件包已经被安装到了系统中。

  168.        --test 不安装软件包,仅仅检测并报告可能的冲突。

  169.    卸载选项
  170.        卸载命令的一般形式是


  171.        rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--notriggers]
  172.        [--repackage] [--test] PACKAGE_NAME ...


  173.        同时还可以用下列选项:

  174.        --allmatches
  175.               删除匹配 PACKAGE_NAME 的软件包的所有版本。通常情况下,如果 PACK-
  176.               AGE_NAME 匹配多个软件包将导致错误。

  177.        --nodeps
  178.               在卸载前不检测依赖关系。

  179.        --noscripts

  180.        --nopreun

  181.        --nopostun
  182.               不执行相应的小程序。--noscripts 选项在卸载过程中等价于

  183.               --nopreun --nopostun

  184.               将 %preun, 和 %postun 小程序的执行关闭。

  185.        --notriggers

  186.        --notriggerun

  187.        --notriggerpostun
  188.               不执行相应的触发小程序。--notriggers 选项等价于

  189.               --notriggerun --notriggerpostun

  190.               将 %triggerun, 和 %triggerpostun 小程序的执行关闭。

  191.        --repackage
  192.               卸 载 前 重 新 打 包 文 件 。 过去安装的软件包将根据宏 %_repack-
  193.               age_name_fmt 命名,存放到宏 %_repackage_dir 定义的目录中 (默认值
  194.               是 /var/spool/repackage)。

  195.        --test  不真正卸载任何东西,仅仅尝试它们。与 -vv 选项联合使用,在调试时
  196.               很有用。

  197.    查询选项
  198.        查询命令的一般形式是


  199.        rpm {-q|--query} [select-options] [query-options]


  200.        可以指定输出时软件包信息的格式。为此,使用选项

  201.         --qf|--queryformat QUERYFMT

  202.        附带 QUERYFMT 格式化字符串。查询命令是标准的 printf(3) 格式的修改版本。
  203.        格式包括静态字符串 (可能包括标准的 C 转义字符,新行符,跳格以及其他特殊
  204.        字符) 以及 printf(3) 类型标记。由于 rpm 已知输出类型,因此应当忽略类 型
  205.        标 记,使用头部字段名来代替,包含在 {} 中。字段名是大小写不敏感的,起始
  206.        的 RPMTAG_ 部分可以被忽略。

  207.        可选的输出格式是用 :typetag 表示。当前,支持的类型有:

  208.        :armor  将公钥以 ASCII 包装。

  209.        :base64
  210.               以 base64 编码二进制数据。

  211.        :date  使用 strftime(3) "%c" 格式。

  212.        :day   使用 strftime(3) "%a %b %d %Y" 格式。

  213.        :depflags
  214.               格式化依赖性标志。

  215.        :fflags
  216.               格式化文件标志。

  217.        :hex   以十六进制格式化。

  218.        :octal 以八进制格式化。

  219.        :perms 格式化文件权限。

  220.        :shescape
  221.               转义单引号,用于脚本。

  222.        :triggertype
  223.               显示触发的后缀。

  224.        例如,要只输出所查询的软件包的名称,可以使用 %{NAME} 作为格式化字符串。
  225.        要 分两列输出软件包名称和发行版信息,可以用 %-30{NAME}%{DISTRIBUTION}。
  226.        如果执行时使用 --querytags 参数,rpm 将输出它已知的所有标记列表。

  227.        查询的选项有两个子集:软件包选择和信息选择。

  228.    软件包选择选项:
  229.        PACKAGE_NAME
  230.               查询名称为 PACKAGE_NAME 的已安装软件包。

  231.        -a, --all
  232.               查询所有已安装软件包。

  233.        -f, --file FILE
  234.               查询包含 FILE 的软件包。

  235.        --fileid MD5
  236.               查询包含给定文件描述字的软件包,例如,文件内容的 MD5 校验和。

  237.        -g, --group GROUP
  238.               查询属主为 GROUP 的软件包。

  239.        --hdrid SHA1
  240.               查询包含给定头部描述字的软件包,例如,不可变头部区域的 SHA1 校验
  241.               和。

  242.        -p, --package PACKAGE_FILE
  243.               查 询 (未安装的) 软件包 PACKAGE_FILE。这个文件可以指定为一个 ftp
  244.               或 http 样式的 URL,这时软件包头部将被下载并查询。参见  FTP/HTTP
  245.               OPTIONS 中有关 rpm 的内部 ftp 和 http 客户端支持信息。参数 PACK-
  246.               AGE_FILE 如果不是一个二进制文件,将被解释为一个 ASCII 软件包说明
  247.               。 其中可以有以 ’#’ 开始的注释,其他的每行都可以包含以空格分隔的
  248.               匹配表达式,如果是远程的地址,也包括 URL。这些将被扩展为路径,替
  249.               换 manifest 参数的位置,作为 PACKAGE_FILE 参数的附加查询内容。

  250.        --pkgid MD5
  251.               查 询 含有给定软件包描述字的软件包,例如,包的头部以及有效内容的
  252.               MD5 校验和。

  253.        --querybynumber HDRNUM
  254.               直接查询第 HDRNUM 个数据库入口;这只在调试时有用。

  255.        --specfile SPECFILE
  256.               解释并查询 SPECFILE,就好像它是一个软件包。尽管并非所有信息都 可
  257.               获 得,但这种查询允许 rpm 从 spec 文件中抽取信息,而不必写一个解
  258.               释器。

  259.        --tid TID
  260.               查询包含给定 TID 事务描述字的软件包。当前使用 unix 时间戳作为 事
  261.               务描述字。任何在一次事务中安装或卸载的软件包拥有相同的描述字。

  262.        --triggeredby PACKAGE_NAME
  263.               查询被软件包 PACKAGE_NAME 触发的软件包。

  264.        --whatprovides CAPABILITY
  265.               查询提供了 CAPABILITY 能力的软件包。

  266.        --whatrequires CAPABILITY
  267.               查询所有需要 CAPABILITY 才能运作的软件包。

  268.    软件包查询选项:
  269.        --changelog
  270.               显示软件包的修改信息。

  271.        -c, --configfiles
  272.               只显示配置文件 (暗含了 -l).

  273.        -d, --docfiles
  274.               只显示文档文件 (暗含了 -l).

  275.        --dump 转储文件信息:


  276.               path size mtime md5sum mode owner group isconfig isdoc rdev symlink


  277.        这个选项必须与至少下列之一联合使用 -l, -c, -d.

  278.        --filesbypkg
  279.               列出所选每个软件包中的文件。

  280.        -i, --info
  281.               显 示 软件包信息,包括名称,版本,描述。如果指定了 --queryformat
  282.               就使用它。

  283.        --last 列出软件包时,以安装时间排序,最新的在上面。

  284.        -l, --list
  285.               列出软件包中的文件。

  286.        --provides
  287.               列出软件包提供的特性。

  288.        -R, --requires
  289.               列出软件包依赖的其他软件包。

  290.        --scripts
  291.               列出软件包自定义的小程序,他们是安装和卸载等等过程的一部分。

  292.        -s, --state
  293.               显示软件包中文件的状态 states (暗含了 -l)。每个文件的状态是 nor-
  294.               mal, not installed, 或 replaced 其中之一。

  295.        --triggers, --triggerscripts
  296.               显示软件包中包含的触发脚本,如果有的话。

  297.    校验选项
  298.        校验命令的一般形式是


  299.        rpm {-V|--verify} [select-options] [verify-options]


  300.        校验软件包,是将已安装的文件的信息,与从软件包中获取的保存在 rpm 数据库
  301.        中的有关文件的元数据进行比较。校验比较的内容有每个文件的大小,MD5 校 验
  302.        和 ,许可,类型,属主。任何不对的地方都回显示出来。如果软件包中文件未安
  303.        装,例如在安装过程中使用 "--excludedocs" 选项跳过的文档,将被跳过。

  304.        软件包选择选项与软件包查询是相同的 (包括以说明文件作为参数)。其他独有的
  305.        选项包括:

  306.        --nodeps
  307.               不校验软件包的依赖关系。

  308.        --nodigest
  309.               读取时不校验软件包或头部校验。

  310.        --nofiles
  311.               不校验文件的任何属性。

  312.        --noscripts
  313.               不执行 %verifyscript 小程序,如果有的话。

  314.        --nosignature
  315.               读取时不校验软件包或头部签名。

  316.        --nolinkto

  317.        --nomd5

  318.        --nosize

  319.        --nouser

  320.        --nogroup

  321.        --nomtime

  322.        --nomode

  323.        --nordev
  324.               不校验相应的文件属性。

  325.        输出是 8 个字符的字符串,可能的属性标记为:

  326.        c %config 配置文件
  327.        d %doc 文档
  328.        g %ghost 占位文档 (就是说,文件内容不包含在软件包有效内容里面)
  329.        l %license 许可文件
  330.        r %readme 说明文件

  331.        从头部开始,接下来是文件名,每 8 个字符表示将文件属性与数据库中记录的值
  332.        进行一次比较的结果。一个单独的 "." (句点) 表示测试通过了,而一个单独 的
  333.        "?"  (问号) 表示测试可能无法进行 (例如,文件许可禁止了读权限)。最后,加
  334.        重的字母表示相应的 --verify 测试失败了。

  335.        S file Size 大小不一致
  336.        M Mode 模式不一致 (包括许可和文件类型)
  337.        5 MD5 sum 校验和不一致
  338.        D Device 主从设备号不匹配
  339.        L readLink(2) 路径不匹配
  340.        U User 属主不一致
  341.        G Group 组属主不一致
  342.        T mTime 时间不一致


  343.    数字签名和校验
  344.        数字签名命令的一般形式是



  345.        rpm --import PUBKEY ...


  346.        rpm {--checksig} [--nosignature] [--nodigest]
  347.            PACKAGE_FILE ...


  348.        选项 --checksig 用来检测 PACKAGE_FILE 中所有的签名和摘要,保证打包的 完
  349.        整 性和来源。注意在读取打包时总会检测签名,而 --checksig 在校验与某个打
  350.        包关联的所有签名和摘要时有用。

  351.        没有公钥就无法校验数字签名。可以用 --import 来向 rpm 数据库添 加         ASCII
  352.        文 本化的公钥。每个导入的公钥都有一个头部,钥匙环的管理与软件包管理完全
  353.        类似。例如,要显示所有已导入的公钥,使用:

  354.        rpm -qa gpg-pubkey*

  355.        已导入的公钥的细节,可以查询并显示。下面是有关 Redhat GPG/DSA 公钥的 信
  356.        息:

  357.        rpm -qi gpg-pubkey-db42a60e

  358.        最后,已导入的公钥可以像软件包一样被删除。下面是如何卸载 Redhat GPG/DSA
  359.        公钥:

  360.        rpm -e gpg-pubkey-db42a60e

  361.    签署软件包
  362.        rpm --addsign|--resign PACKAGE_FILE ...


  363.        选项 --addsign 与 --resign 都可以为每个软件包 PACKAGE_FILE 生成并插入新
  364.        的 签名,替换任何已有的签名。存在两个选项,是由于历史的原因,现在它们的
  365.        行为没有区别。

  366.    使用 GPG 来签署软件包
  367.        为使用 GPG 来签署软件包,必须配置 rpm 运行 GPG,并且要能找到包含合适 密
  368.        钥 的 钥匙环。默认情况下,rpm 使用与 GPG 相同的约定来查找钥匙环,也就是
  369.        $GNUPGHOME 环境变量。如果你的钥匙环不在 GPG 要求的位置,就必须 配 置 宏
  370.        %_gpg_path 为要使用的 GPG 钥匙环的位置。

  371.        为了与老版本的 GPG, PGP 和 rpm 兼容,只应配置 V3 OpenPGP 签名的打包。可
  372.        以使用 DSA 或者 RSA 校验算法,但是推荐用 DSA。

  373.        如果想签署自己创建的打包,还需要创建自己的公钥和私钥对 (参见 GPG 手 册)
  374.        。还需要配置 rpm 宏:

  375.        %_signature
  376.               签名类型。当前只支持 gpg 和 pgp。

  377.        %_gpg_name
  378.               用来签署打包的密钥的所有者 "用户" 的名称

  379.        例如,要使用 GPG 来签署打包,用户是 "John Doe <jdoe@foo.com>",钥匙环位
  380.        置在 /etc/rpm/.gpg,使用可执行文件 /usr/bin/gpg,可以将这一段

  381.        %_signature gpg
  382.        %_gpg_path /etc/rpm/.gpg
  383.        %_gpg_name John Doe <jdoe@foo.com>
  384.        %_gpgbin /usr/bin/gpg

  385.        包含在宏配置文件中。对于系统范围的设置,使用 /etc/rpm/macros,对于个 人
  386.        设置,使用 ~/.rpmmacros。

  387.    重建数据库选项
  388.        重建数据库的命令的一般形式是


  389.        rpm {--initdb|--rebuilddb} [-v] [--dbpath DIRECTORY] [--root DIRECTORY]


  390.        使用 --initdb 来创建新的数据库,使用 --rebuilddb 来重建数据库索引,根据
  391.        已安装的软件包头部。

  392.    显示配置
  393.        命令

  394.        rpm --showrc

  395.        将显示 rpm 使用的,在 rpmrc 和 macros 配置文件中定义的选项的值。

  396.    FTP/HTTP 选项
  397.        rpm  可以作为一个 FTP 和/或 HTTP 客户端,可以查询或安装互联网上的软件包
  398.        包。要安装、升级和查询的软件包文件可以以 ftp 或 http 样式的 URL 指定:

  399.        ftp://USER:PASSWORD@HOST:PORT/path/to/package.rpm

  400.        如果忽略了 :PASSWORD 选项,将提示密码,每个用户名/主机组合提示一次。 如
  401.        果 忽 略 了用户名和密码,将使用匿名 ftp。在所有情况下,都会使用被动 ftp
  402.        (PSAV)。

  403.        rpm 允许在使用 ftp URL 时使用下面的选项:

  404.        --ftpproxy HOST
  405.               使用主机 HOST 作为所有 ftp 传输的代理服务器,允许用户通过代理 系
  406.               统防火墙访问 ftp。这个选项也可以用宏 %_ftpproxy 指定。

  407.        --ftpport PORT
  408.               连 接到 ftp 代理服务器的 TCP PORT 端口,而不是默认的端口。这个选
  409.               项也可以用宏 %_ftpport 指定。

  410.        rpm 允许在使用 http URL 时使用下面的选项:

  411.        --httpproxy HOST
  412.               使用主机 HOST 作为所有 http 传输的代理服务器,允许用户通过代理系
  413.               统防火墙访问 http。这个选项也可以用宏 %_httpproxy 指定。

  414.        --httpport PORT
  415.               连接到 http 代理服务器的 TCP PORT 端口,而不是默认的端口。这个选
  416.               项也可以用宏 %_httpport 指定。

  417. LEGACY ISSUES
  418.    执行 rpmbuild
  419.        rpm 的构建模式,现在由 /usr/bin/rpmbuild 命令完成。尽管使用下面的  popt
  420.        别 名提供的兼容性已经够用,但是不够完美;因此通过 popt 别名提供的构建兼
  421.        容性将从 rpm 中移除。安装 rpmbuild 软件包,参见 rpmbuild(8) 中,有关 过
  422.        去记录在 rpm(8) 中的,rpm 构建模式的文档。

  423.        将下面的这些添加到 /etc/popt 中,如果想使用 rpm 命令行运行 rpmbuild的话
  424.        :

  425.        rpm     exec --bp               rpmb -bp
  426.        rpm     exec --bc               rpmb -bc
  427.        rpm     exec --bi               rpmb -bi
  428.        rpm     exec --bl               rpmb -bl
  429.        rpm     exec --ba               rpmb -ba
  430.        rpm     exec --bb               rpmb -bb
  431.        rpm     exec --bs               rpmb -bs
  432.        rpm     exec --tp               rpmb -tp
  433.        rpm     exec --tc               rpmb -tc
  434.        rpm     exec --ti               rpmb -ti
  435.        rpm     exec --tl               rpmb -tl
  436.        rpm     exec --ta               rpmb -ta
  437.        rpm     exec --tb               rpmb -tb
  438.        rpm     exec --ts               rpmb -ts
  439.        rpm     exec --rebuild               rpmb --rebuild
  440.        rpm     exec --recompile               rpmb --recompile
  441.        rpm     exec --clean               rpmb --clean
  442.        rpm     exec --rmsource               rpmb --rmsource
  443.        rpm     exec --rmspec               rpmb --rmspec
  444.        rpm     exec --target               rpmb --target
  445.        rpm     exec --short-circuit    rpmb --short-circuit

  446. FILES
  447.    rpmrc 配置文件
  448.        /usr/lib/rpm/rpmrc
  449.        /usr/lib/rpm/redhat/rpmrc
  450.        /etc/rpmrc
  451.        ~/.rpmrc

  452.    Macro 宏定义文件
  453.        /usr/lib/rpm/macros
  454.        /usr/lib/rpm/redhat/macros
  455.        /etc/rpm/macros
  456.        ~/.rpmmacros

  457.    Database 数据库
  458.        /var/lib/rpm/Basenames
  459.        /var/lib/rpm/Conflictname
  460.        /var/lib/rpm/Dirnames
  461.        /var/lib/rpm/Filemd5s
  462.        /var/lib/rpm/Group
  463.        /var/lib/rpm/Installtid
  464.        /var/lib/rpm/Name
  465.        /var/lib/rpm/Packages
  466.        /var/lib/rpm/Providename
  467.        /var/lib/rpm/Provideversion
  468.        /var/lib/rpm/Pubkeys
  469.        /var/lib/rpm/Removed
  470.        /var/lib/rpm/Requirename
  471.        /var/lib/rpm/Requireversion
  472.        /var/lib/rpm/Sha1header
  473.        /var/lib/rpm/Sigmd5
  474.        /var/lib/rpm/Triggername

  475.    Temporary 临时文件
  476.        /var/tmp/rpm*

  477. SEE ALSO
  478.        popt(3),
  479.        rpm2cpio(8),
  480.        rpmbuild(8),

  481.        http://www.rpm.org/ <URL:http://www.rpm.org/>

  482. AUTHORS
  483.        Marc Ewing <marc@redhat.com>
  484.        Jeff Johnson <jbj@redhat.com>
  485.        Erik Troan <ewt@redhat.com>


  486. TRANSBY
  487.        LinuxForum.Net CMPP 中文手册页计划 [url=http://cmpp.linuxforum.net]

  488.        * Tue May 3 2005 Yuan Yijun <bbbush@163.com> rpm-4.4.1-3
  489.        - 初始版本, 来自于 rpm 的手册页集合



  490. Red Hat, Inc.                         09 June 2002                                RPM(8)
复制代码


rpmbuild.8
  1. RPMBUILD(8)                      Red Hat Linux                     RPMBUILD(8)



  2. NAME
  3.        rpmbuild - 构建 RPM 打包

  4. SYNOPSIS
  5.    构建打包:
  6.        rpmbuild  {-ba|-bb|-bp|-bc|-bi|-bl|-bs} [rpmbuild-options] SPECFILE ...



  7.        rpmbuild {-ta|-tb|-tp|-tc|-ti|-tl|-ts} [rpmbuild-options] TARBALL ...



  8.        rpmbuild {--rebuild|--recompile} SOURCEPKG ...


  9.    其他:
  10.        rpmbuild --showrc


  11.    rpmbuild 选项
  12.         [--buildroot DIRECTORY] [--clean] [--nobuild]
  13.         [--rmsource] [--rmspec] [--short-circuit] [--sign]
  14.         [--target PLATFORM]


  15. DESCRIPTION
  16.        rpmbuild 是用来构建软件的二进制和源代码打包的。一个软件包 package 包 括
  17.        文 件的归档以及用来安装和卸载归档中文件的元数据。元数据包括辅助脚本,文
  18.        件属性,以及有关的描述性的信息。软件包有两种 package:二进制软件包, 用
  19.        来 封装要安装的软件,源代码软件包,包含了源代码和要构建二进制打包需要的
  20.        内容。

  21.        必须选择下列基本模式之一:0 Build Package, Build Package from  Tarball,
  22.        Recompile Package, Show Configuration.

  23.    一般的选项
  24.        这些选项可以用于所有不同的模式。

  25.        -?, --help
  26.               输出较长的帮助信息

  27.        --version
  28.               输出一行信息,包含 rpmbuild 的版本号

  29.        --quiet
  30.               输出尽可能少的信息 - 通常只有错误信息才会显示出来

  31.        -v     输出冗余信息 - 通常常规的进度信息都将被显示

  32.        -vv    输出大量丑陋的调试信息

  33.        --rcfile FILELIST
  34.               FILELIST 中冒号分隔的每个文件名都被 rpm 按顺序读取,从中获得配置
  35.               信息。只有列表的第一个文件必须存在,波浪线将被替换为 $HOME。默认
  36.               的     FILELIST       是    /usr/lib/rpm/rpmrc:/usr/lib/rpm/red-
  37.               hat/rpmrc:/etc/rpmrc:~/.rpmrc

  38.        --pipe CMD
  39.               将 rpm 的输出通过管道送到命令 CMD。

  40.        --dbpath DIRECTORY
  41.               使用 DIRECTORY 中的数据库,而不是默认的路径 /var/lib/rpm

  42.        --root DIRECTORY
  43.               以 DIRECTORY 作为根文件系统,进行所有操作。这意味着将使用 DIREC-
  44.               TORY   中 的 数 据库来进行依赖性检测,任何小程序 (也就是安装中的
  45.               %post 和构建中的 %prep) 都将在一个 chroot(2) 到 DIRECTORY 之后执
  46.               行。

  47.    构建选项
  48.        构建命令的一般形式是


  49.        rpmbuild -bSTAGE|-tSTAGE [      rpmbuild-options
  50.         ] FILE ...


  51.        如 果要用某个 spec 文件构建,使用 -b 参数。如果需要根据一个可能是压缩过
  52.        的 tar 归档文件中的 spec 文件构建,就使用 -t 参数。第一个参数之后的字符
  53.        STAGE 指定了要完成的构建和打包的阶段,是下列其中之一:

  54.        -ba    构建二进制和源代码打包 (在执行 %prep, %build 和 %install 之后)

  55.        -bb    构建二进制打包 (在执行 %prep, %build 和 %install 之后)

  56.        -bp    执行 spec 文件的 "%prep" 阶段。通常,这会解包源代码并应用补丁

  57.        -bc    执行 spec 文件的 "%build" 阶段 (在执行了 %prep 阶段之后)。这通常
  58.               等价于执行了一次 "make"

  59.        -bi    执行 spec 文件的 "%install" 阶段 (在执行了 %prep 和 %build 阶 段
  60.               之后)。这通常等价于执行了一次 "make install"

  61.        -bl    执行一次 "列表检查"。spec 文件的 "%files" 段落中的宏被扩展,检测
  62.               是否每个文件都存在。

  63.        -bs    只构建源代码打包

  64.        还可以用下列选项:

  65.        --buildroot DIRECTORY
  66.               在构建时,使用目录 DIRECTORY 覆盖默认的值

  67.        --clean
  68.               在制作打包之后删除构建树

  69.        --nobuild
  70.               不执行任何构建步骤。用于测试 spec 文件

  71.        --rmsource
  72.               在构建后删除源代码 (也可以单独使用,例 如  "rpmbuild  --rmsource
  73.               foo.spec")

  74.        --rmspec
  75.               在 构 建 之 后 删 除  spec  文件 (也可以单独使用,例如 "rpmbuild
  76.               --rmspec foo.spec")

  77.        --short-circuit
  78.               直接跳到指定阶段 (也就是说,跳过指定阶段前面的所有步骤)。只有 与
  79.               -bc 或  -bi 连用才有意义。

  80.        --sign  在打包中包含 GPG 签名。签名可以用来校验打包的完整性和来源。参见
  81.               rpm(8) 的 "GPG 签名" 章节中的配置细节。

  82.        --target PLATFORM
  83.               在构建时,将 PLATFORM 解析为 arch-vendor-os,并以此设置宏 %_tar-
  84.               get, %_target_cpu, 和 %_target_os 的值。

  85.    重建和重编译选项
  86.        还有两种发起构建的方法:


  87.        rpmbuild --rebuild|--recompile SOURCEPKG ...


  88.        这样执行的话,rpmbuild 安装指定的源代码打包,然后进行准备,编译和安装。
  89.        另外,--rebuild 构建一个新的二进制打包,在构建结束时,构建目录被删除  (
  90.        就好像用了 --clean),源代码和 spec 文件也被删除。

  91.    SHOWRC
  92.        命令


  93.        rpmbuild --showrc


  94.        将显示 rpmbuild 使用的,在 rpmrc 和 macros 配置文件中定义的选项的值。

  95. FILES
  96.    rpmrc 配置文件
  97.        /usr/lib/rpm/rpmrc
  98.        /usr/lib/rpm/redhat/rpmrc
  99.        /etc/rpmrc
  100.        ~/.rpmrc

  101.    Macro 宏定义文件
  102.        /usr/lib/rpm/macros
  103.        /usr/lib/rpm/redhat/macros
  104.        /etc/rpm/macros
  105.        ~/.rpmmacros

  106.    Database 数据库
  107.        /var/lib/rpm/Basenames
  108.        /var/lib/rpm/Conflictname
  109.        /var/lib/rpm/Dirnames
  110.        /var/lib/rpm/Filemd5s
  111.        /var/lib/rpm/Group
  112.        /var/lib/rpm/Installtid
  113.        /var/lib/rpm/Name
  114.        /var/lib/rpm/Packages
  115.        /var/lib/rpm/Providename
  116.        /var/lib/rpm/Provideversion
  117.        /var/lib/rpm/Pubkeys
  118.        /var/lib/rpm/Removed
  119.        /var/lib/rpm/Requirename
  120.        /var/lib/rpm/Requireversion
  121.        /var/lib/rpm/Sha1header
  122.        /var/lib/rpm/Sigmd5
  123.        /var/lib/rpm/Triggername

  124.    Temporary 临时文件
  125.        /var/tmp/rpm*

  126. SEE ALSO
  127.        popt(3),
  128.        rpm2cpio(8),
  129.        gendiff(1),
  130.        rpm(8),

  131.        http://www.rpm.org/ <URL:http://www.rpm.org/>

  132. AUTHORS
  133.        Marc Ewing <marc@redhat.com>
  134.        Jeff Johnson <jbj@redhat.com>
  135.        Erik Troan <ewt@redhat.com>


  136. TRANSBY
  137.        LinuxForum.Net CMPP 中文手册页计划 [url=http://cmpp.linuxforum.net]

  138.        * Tue May 3 2005 Yuan Yijun <bbbush@163.com> rpm-4.4.1-3
  139.        - 初始版本, 来自于 rpm 的手册页集合



  140. Red Hat, Inc.                    09 June 2002                      RPMBUILD(8)
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表