1. 概述
RPM套件管理器(简称RPM,全称Red Hat Package Manager,亦称为The RPM Package Manager)是在Linux下广泛使用的软件包管理器。最早由Red Hat研制,现在也由开源社区开发。RPM通常随附于Linux发行版,但也有单独将RPM作为应用软件发行的发行版(例如Gentoo)。RPM仅适用于安装用RPM来打包的软件,目前是GNU/Linux下软件包资源最丰富的软件包类型。2008-1-5发布了最新的RPM version 5.0.0.
1.1 RPM 5.0.0新特性
根据 RPM 5.0.0 的发布公告描述,该版本获得了下列新特性:
* 对 RPM 的编译环境进行了全面的修补,支持链接外部的第三方库。
* RPM 代码库已移植到所有主流平台,包括 BSD、Linux、Solaris、Mac OS X、Windows/Cygwin。现在支持使用所有主流的 C 编译器套件编译,如 GNU GCC、Sun Studio、Intel C/C++ 等。
* RPM 包支持 LZMA 压缩、XML Archive (XAR) 文件格式。
* 添加了包规范 (.spec 文件)。
1.2 RPM著名前端简介:
up2date:被用于Red Hat Enterprise Linux和CentOS (CentOS-3和CentOS-4)。
yum:被用于Fedora,CentOS-5,Red Hat Enterprise Linux 5和openSUSE Linux等。
YaST和Zypper:被用于openSUSE Linux。
urpmi:被用于Mandriva Linux。
rpmdrake:Mandriva Linux下urpmi的图形化前端。
apt-rpm: 移植到Debian的Advanced Packaging Tool (APT)。
Smart Package Manager:被大量Linux发行版采用。
poldek:相当快速并具有功能丰富的前端,不依赖rpmlib,只用于PLD Linux。
1.3 SRPM
SRPM即Source RPM,包含原码(Source Code)的RPM文件,特别要注意的是,这个套件的内容“并没有经过编译”。SRPM 与TAR的区别,虽然srpm也为原始码,但他仍然含有该套件所需要的相关性套件说明,以及所有rpm文件所提供的资料。SRPM与RPM的区别:srpm提供了参数设定文件(configure与makefile)。也即SRPM多了一个重新编译的动作。
在上一节当中,我们介绍了 RPM 这个既可爱又可恨的家伙,RPM 的可爱在于他的资料库管理方式,很容易去查询与升级,而他的可恨呢?呵呵!就是在于他的 binary 的档案不能再改变他的原始设定内容 ( 就是 *.rpm 的档案不能再重新编译的意思 ),与套件及套件之间的属性相依的问题~还真是伤脑筋吶!
没有关系,现在有解决的方法了!我们可以 利用『含有 source code 的 SRPM 』来重新编译 *.rpm 的档案成为我们所希望的样式了!就因为在 SRPM 里面含有的不是 binary 的档案,而是含有 source code ,因此 SRPM 是不能直接拿来安装成为可执行的档案的。必需要将他重新编译,并且打包成为类似 i386, i586, i686 等等 RPM 的档案之后,才能够安装在我们的系统当中哩!这个时候你就应该会想象啦,咦!既然如此的话,那么在编译的过程当中,我们是否可以加入其他的设定参数,来让 我们的 SRPM 可以依照我的想法来编译呢!?哈哈!答对了!所以呢,这个时候我们就要来修改别人的 SRPM 以及编译自己的套件啦!
不过这里需要特别留意的就是,因为 SRPM 需要重新编译,而编译的过程当中,我们至少需要有 make 与其相关的程式,及 gcc, c, c++ 等其他的编译用的程式语言来进行编译,所以,如果您在安装的过程当中没有选取软体开发工具之类的套件,呵呵!得重新拿出你的光碟,然后再安装喔!哈哈!只 是得要克服一大堆的属性相依的问题就是了~嗯!还是建议您再次的看一下如何安裝吧!
2 RPM/SRPM的命令和配置
2.1 rpm/srpm文件名称
a>rpm 格式——***.rpm
srpm格式——***.src.rpm
b> rpm文件名称的意义:
rp-pppoe-3.1- 5 .i386 . rpm
名称-版本-编译次数-适用平台-扩展名
2.2 .rpm资料库: /var/lib/rpm
2.3 .rpm安装(install)
rpm -ivh file.rpm
同时安装多个rpm
rpm -ivh a.rpm b.rpm *.rpm
网络安装
rpm -ivh http://...file.rpm
--nodeps 强制安装
--nomd5 不检查MD5
--test 测试
rpm -i ( or --install) options file1.rpm ... fileN.rpm 通过rpm -ivh可以把rpm软件包安装到系统中,当然也可以使用不同的参数选项,笔者建议使用-ivh ,使用该选项可以解决大部分rpm软件包的安装,至于详细的参数说明可用查看rpm的man 文档。
可以使用 rpm -i filename.rpm
安装源 RPM 包。 安装完之后,.spec 文件将在您的 %_specdir 目录中,源文件和补丁文件将在您的 %_sourcedir 目录中。
2.4 删除
rpm -e ( or --erase) options pkg1 ... pkgN 如果某个软件包你再也不想使用了,那就用以上这个命令彻底的把你指定的rpm软件包清除掉把。
(1)解除安装的过程一定要由最上层往下解除
rpm -e file
(2)重建资料库
rpm --rebuilddb
2.5 升级
rpm -U ( or --upgrade) options file1.rpm ... fileN.rpm 由于开源软件更新速度快,用户当然要使用最新版本的软件包,此时最合适的就是rpm升级功能,当然最理想的参数选项就是-Uvh。
2.6 查询
rpm -q ( or --query) options 实际上我们通常使用rpm工具最多的功能还是它的查询功能,比如查看软件包的版本、依赖关系等软件包的详细说明都要用到。最有用的参数选项是-qpi。
rpm查询,就是查询/var/lib/rpm这个目录下的资料库的档案啦
for example:
[root@z1014p14 ~]# rpm -qa --queryformat
"%{name}-%{version}-%{release}.%{arch}/n"|grep alchemist
alchemist-1.0.36-1.2.2.ppc64
2.7校验已安装的软件包 rpm验证与数位签章
rpm -V ( or --verify, or -y) options 一般我们可用通过该命令来验证已安装软件包,根据笔者的经验该命令一般没什么用途,只做一个了解就ok了。
3 .SRPM的使用
3.1 利用系统默认值来安装srpm
--rebuild 将srpm编译 打包 最后产生rpm包,但并不安装
--recompile 直接编译、打包并且安装
如果顺利的话,则编译过程中产生的暂存档都会被自动删除,若出错,则暂存档会被保留在系统上。
3.2 RPM 使用到的目录:
SRPM 既然含有 source code ,那么其中必定有设定档啰,所以首先我们必需要知道,这个 SRPM 在进行编译的时候,会使用到哪些目录呢?这样一来才能够来修改嘛!你可以到你的 /usr/src 这个目录里面去查看一下,通常每个 distribution 提供的目录都不太相同,以 Mandrake 9.0 为例,他是以 /usr/src/RPM 为工作目录, Red Hat 是以 /usr/src/redhat 为工作目录, Openlinux 则是以 /usr/src/openlinux 为工作目录!无论如何,反正就是在 /usr/src 这个目录下就对了!好了到 /usr/src/redhat 里头去看一看呦:
· /usr/src/redhat/SPEC:这个目录当中放置的是该套件的设定档,例如这个套件的资讯参数、设定项目等等都放置在这里;
· /usr/src/redhat/SOURCE:这个目录当中放置的是该套件的原始档(*.tar.gz的档案)以及 config 这个设定档;
· /usr/src/redhat/BUILD:在编译的过程中,有些暂存的资料都会放置在这个目录当中;
· /usr/src/redhat/RPMS:经过编译之后,并且顺利的编译成功之后,将打包完成的档案放置在这个目录当中。里头有包含了 i386, i586, i686, noarch.... 等等的次目录。
此外,在编译的过程当中,可能会发生不明的错误,或者是设定的错误,这个时候就会在 /tmp 底下产生一个相对应的错误档,您可以根据该错误档进行除错的工作呢!等到所有的问题都解决之后,也编译成功了,那么刚刚解压缩之后的档案,就是在 /usr/src/redhat/SPEC, SOURCE, BUILD 等等的档案都会被杀掉,而只剩下放置在 /usr/src/redhat/RPMS 底下的档案了!
3.3 .spec文件规范
能熟练掌握以上命令以及部分参数含义,管理日常的rpm软件包就不成问题了。然而随着Linux风靡全球,越来越多的开发者喜欢采用RPM格式来发布自己的软件包。那么RPM软件包是怎样制作的呢?对大多数Linux开发工程师来说是比较陌生的。
其实,制作RPM软件包并不是一件复杂的工作,其中的关键在于编写SPEC软件包描述文件。要想制作一个rpm软件包就必须写一个软件包描述文件 (SPEC)。这个文件中包含了软件包的诸多信息,如软件包的名字、版本、类别、说明摘要、创建时要执行什么指令、安装时要执行什么操作、以及软件包所要 包含的文件列表等等。
在Linux下RPM软件包的管理与RPM软件包的制作关键在rpm工具的使用和spec描述文件的起草。要想制作一个RPM格式的软件包必须编写软件包 描述文件。其标准命名格式为:软件名-版本号-释出号.spec,这个文件详细描述了有关该软件包的诸多信息,如软件名,版本,类别,说明摘要,创建时要 执行什么指令,安装时要执行什么操作,以及软件包所要包含的文件等等。有了这个文件RPM就可以制作出相应的rpm软件包
4.打包
如果想发布rpm格式的源码包或者是二进制包,就要使用rpmbuild工具(rpm最新打包工具)。如果我们已经根据本地源码包的成功编译安装而 写了spec文件(该文件要以.spec结束),那我们就可以建立一个打包环境,也就是目录树的建立,一般是在/usr/src/redhat/目录下建 立5个目录。它门分别是BUILD、SOURCE、SPEC、SRPM、RPM。其中BUILD目录用来存放打包过程中的源文件,SOURCE用来存放打 包是要用到的源文件和patch,SPEC用来存放spec文件,SRPM、RPM分别存放打包生成的rpm格式的源文件和二进制文件。当然我们可以根据 需要来选用不同的参数打包文件,笔者总结如下3条。
1) 只生成二进制格式的rpm包
rpmbuild -bb xxx.spec
用此命令生成软件包,执行后屏幕将显示如下信息:(每行开头为行号)
1 Executing: %prep 2 + umask 022 3 + cd /usr/src/dist/BUILD 4 + exit 0 5 Executing: %build 6 + umask 022 7 + cd /usr/src/dist/BUILD |
生成的文件会在刚才建立的RPM目录下存在。
2)只生成src格式的rpm包
rpmbuild -bs xxx.spec
生成的文件会在刚才建立的SRPM目录下存在。
3) 只需要生成完整的源文件
rpmbuild -bp xxx.spec
源文件存在目录BUILD下。
读者朋友可能对这个命令不太明白,这个命令的作用就是把tar包解开然后把所有的补丁文件合并而生成一个完整的具最新功能的源文件。
4) 完全打包
rpmbuild -ba xxx.spec
产生以上3个过程分别生成的包。存放在相应的目录下。
软件包制作完成后可用rpm命令查询,看看效果。如果不满意的话可以再次修改软件包描述文件,重新运行以上命令产生新的RPM软件包。
5 分析SPEC文件
Examples:
-
下载 SRPM 软体:
[root @test root]# wget ftp://ftp.redhat.com/pub/redhat/linux/enterprise/rhel5/os/SRPMS/vsftpd-2.0.5-10.el5.src.rpm
-
将 SRPM 解开在/usr/src/redhat 底下的目录当中
[root @test root]# rpm –i vsftpd-2.0.5-10.el5.src.rpm
warning: vsftpd-2.0.5-10.el5.src.rpm: Header V3 DSA signature: NOKEY, key ID 37017186
warning: user brewbuilder does not exist - using root
warning: group brewbuilder does not exist - using root
-
观察一下有哪些原始码呢?
[root @test root]# cd /usr/src/redhat/SOURCES
[root @test SOURCE]# ls –l
patch
vsftpd-2.0.5.tar.gz
xxxx
呵呵!上面显示我们的原始码就是这个档案啦!
好了,来看看我们的设定参数档,亦即是在 /usr/src/redhat/SPECS 内的 *.spec 档案啰!
观察一下预设的设定档案内容:
[root @test root]# cd /usr/src/redhat/SPECS
[root @test SPECS]# vi vsftpd.spec
没错!这个就是SRPM的预设设定内容档案啰,进去修改一下,里面的资料有点像这样:
注意到的是vsftpd .sepc这个档案,这是主要的将SRPM编译成RPM的设定档,他的基本规则可以这样看:
1.整个档案的开头以Summary为开始,这部份的设定都是最基础的说明内容;
2.然后每个不同的段落之间,都以%来做为开头,例如%prep与%install等;
5.1 SPEC格式
我们来谈一谈几个常见的SRPM设定段落:
系统整体资讯方面:
Summary:主要的套件说明,例如上表中,我们说明了他是用途啦! 用一句话概括该软件包尽量多的信息。
Name:这个就是套件的名称,最终RPM软件包是用该名字与版本号,释出号及体系号来命名软件包的。
Version:这个是套件的版本资讯;软件版本号。仅当软件包比以前有较大改变时才增加版本号。
Release:这个是该版本打包的次数说明,软件包释出号。一般我们对该软件包做了一些小的补丁的时候就应该把释出号加1,如果修复了 spec 文件中的一个错误并发布了该软件同一版本的新 RPM,就应该增加发行版号。
Copyright:这个套件的授权模式,软件包所采用的版权规则。具体有:GPL(自由软件),BSD,MIT,Public Domain(公共域),Distributable(贡献),commercial(商业),Share(共享)等,一般的开发都写GPL。
Group:软件包所属类别, 标识软件类型,/usr/share/doc/rpm-4.4.2/GROUPS 文件看到一个 Red Hat 使用的组列表(假设您安装的 RPM 版本是 4.4.2)。但是您还可以使用那些组名以外的名称。
Source: Source0
、 Source1
等等给这些源文件命名(通常为 tar.gz 文件)。
%{name}
和 %{version}
是 RPM 宏,它们扩展成为头中定义的 rpm 名称和版本。因此,在这个实例中, Source0
被设置为 indent-2.2.6.tar.gz
。
不要在 Source
语句中包含任何路径。缺省情况下,RPM 会在 /usr/src/redhat/SOURCES 中寻找文件。请将您的源文件复制或链接到那里。(要使 spec 文件尽量可移植的话,应当尽量避免嵌入自己开发机器上的假想路径。其他开发人员就可以指示 RPM 在别的目录下查找源文件,而不用修改您的 spec 文件。)
Source:源程序软件包的名字。如 stardict-2.0.tar.gz。
Source1:
Source2:
.......
Patch1:
Patch2:
.......
Url:这个原始码的主要官方网站; Packager:这个套件是经由谁来打包的呢?
Vender:发展的厂商哪; 软件开发者的名字。
ExclusiveArch:这个是说明这个套件的适合安装的硬体,
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root
%if %{tcp_wrappers}
BuildPrereq: tcp_wrappers
%endif
BuildRequires: pam-devel
Requires: pam
Requires: /%{_lib}/security/pam_loginuid.so
BuildRequires: libcap-devel
Requires: libcap
BuildRequires: openssl-devel
Requires: openssl
# for -fpie
BuildPrereq: gcc > gcc-3.2.3-13, binutils > binutils-2.14.90.0.4-24, glibc-devel >= 2.3.2-45
Requires: logrotate
Prereq: /sbin/chkconfig, /sbin/service, /usr/sbin/usermod
Obsoletes: anonftp
Provides: ftpserver
Requires:如果你这个套件还需要其他的套件的支援,那么这里就必需写上来,则当你制作成RPM之后,系统就会自动的去检查啦!这就是『相依属性』的主要来源啰!
%description
将您的套件做一个简短的说明!这个也是必需要的。软件包详细说明,可写在多个行上。
·%prep fi
这部份的设定在于『尚未进行设定或安装之前,你要编译完成的RPM帮你事先做的事情』,就是prepare的简写啰!那么他的工作事项主要有:
1.寻找套件所需要的目录是否已经存在?确认用的!
2.事先建立您的套件所需要的目录,或者事先需要进行的任务;
3.如果待安装的Linux系统内已经有安装的时候可能会被覆盖掉的档案时,那么就必需要进行备份(backup)的工作了!
这个段是预处理段,通常用来执行一些解开源程序包的命令,为下一步的编译安装作准备。%prep和下面的%build,%install段一样,除 了可以执行RPM所定义的宏命令(以%开头)以外,还可以执行SHELL命令,命令可以有很多行,如我们常写的tar解包命令。
patch patch
大致的工作就是这些啦!
·%setup
这个段落就是在建立我们在Tarball当中说明的那个Makefile档案啦!所以呢,当然就是执行./config之类的设定档案啰!那么如果你要自己新增自己的参数,就可以在这个地方加入你的设定值!如果你的软体本身没有这方面的需要,里面就不需要编写内容啰!
·%build
build就是建立啊!所以当然啰,这个段落就是在谈怎么make编译成为可执行的程式啰!
·%install
编译完成(build)之后,就是要安装啦!安装就是写在这里,也就是类似Tarball里面的make install的意思啰!
%clean
%post
%preun
·%files
这个套件安装的档案都需要写到这里来,当然包括了『目录』喔!所以连同目录请一起写到这个段落当中 !以备查验呢!^_^
本段是文件段,用于定义软件包所包含的文件,分为三类—说明文档(doc),配置文件(config)及执行程序,还可定义文件存取权限,拥有者及组别。
在 %files
中,您可以使用 一次 %defattr
来定义缺省的许可权、所有者和组;在这个示例中, %defattr(-,root,root)
会安装 root 用户拥有的所有文件,使用当 RPM 从构建系统捆绑它们时它们所具有的任何许可权。
可以用 %attr(permissions,user,group)
覆盖个别文件的所有者和许可权。
可以在 %files 中用一行包括多个文件。
可以通过在行中添加 %doc
或 %config
来标记文件。 %doc
告诉 RPM 这是一个文档文件,因此如果用户安装软件包时使用 --excludedocs
,将不安装该文件。您也可以在 %doc
下不带路径列出文件名,RPM 会在构建目录下查找这些文件并在 RPM 文件中包括它们,并把它们安装到 /usr/share/doc/%{name}-%{version}
。以 %doc 的形式包括 README 和 ChangeLog 这样的文件是个好主意。
%config
告诉 RPM 这是一个配置文件。在升级时,RPM 将会试图避免用 RPM 打包的缺省配置文件覆盖用户仔细修改过的配置。
警告:如果在 %files 下列出一个目录名,RPM 会包括该目录下的所有文件。通常这不是您想要的,特别对于 /bin
这样的目录。
本段是修改日志段。你可以将软件的每次修改记录到这里,保存到发布的软件包中,以便查询之用。每一个修改日志都有这样一种格式:第一行是:* 星期 月 日 年 修改人 电子信箱。其中:星期、月份均用英文形式的前3个字母,用中文会报错。接下来的行写的是修改了什么地方,可写多行。一般以减号开始,便于后续的查阅
好了,那么如果您有自订的资讯想要加入的话,就选择你要加入的那个段落,将他修改一下吧!例如,如果你在设定Makefile的时候,希望能够多一些额外的参数设定,那么就找到 %setup 那个段落,将他修改成您所需要的样子,就可以啰!
- 在安装包之前运行 %post
- 在安装包之后运行 %preun
- 在卸载包之前运行 %postun
- 在卸载包之后运行
6 SRPM 的编译指令:
再来呢?嗯!没错,修改完成了,自然就是要将他编译成可以安装的RPM档案啦!这个时候我们就可以直接在/usr/src/redhat/SPECS底下下达:
[root @test SPECS]# rpmbuild -bb vsftpd.spec <==编译成RPM档案
[root @test SPECS]# rpmbuild -ba vsftpd.spec<==打包成SRPM档案
这个时候系统就会这样做:
1.先进入到BUILD这个目录中,在Mandrake 9.0当中就是/usr/src/RPM/BUILD,在Red Hat底下就是/usr/src/redhat/BUILD这个目录;
2.依照*.spec档案内的Name与Version设定定义出工作的目录名称,以我们上面的例子为例,那么系统就会在BUILD目录中先删除rp-pppoe-3.5的目录,再重新建立一个rp-pppoe-3.5的目录,并进入该目录;
3.在新建的目录里面,针对SOURCES目录下的来源档案,也就是*.spec里面的Source设定的那个档案,以tar进行解压缩,以我们这个例 子来说,则会在/usr/src/redhat/BUILD/rp-pppoe-3.5当中,将/usr/src/redhat/SOURCES/rp- pppoe-3.5.tar.gz进行解压缩啦!
4.然后就开始%setup的工作;
5.再来开始%build及%install的设定与编译!
6.最后将完成打包的档案给他放置到该放置的地方去,如果你的规定的硬体是在i386的系统,那么最后编译成功的*.i386.rpm档案就会被放置在 /usr/src/RPM/RPMS/i386里面啰!如果是i586那么自然就是/usr/src/redhat/RPMS/i586目录下啰!
整个步骤大概就是这样子!最后的结果资料会放置在RPMS那个目录底下就对啦!
6.1 打包自己的套件:
这个就有趣了!我们自己来编辑一下自己制作的RPM怎么样?会很难吗?完全不会!这里简单的以一个小例子来说明喔!请注 意,这个真的只是一个小例子,所以不要觉得奇怪喔!其中,比较需要注意的,由于在上面的步骤说明中,我们知道在将SRPM编译成为RPM的时候,会以 tar这支程式来将档案解开,因此,我们在进行来源档案的建立时,就必需要将他打包成为一个tar.gz的tarball的档案才行!
假设我们编辑了一支script,内容是这样:
[root @test root]# cd /usr/src/redhat/SOURCES
[root @test SOURCES]# vi showvbird.sh
#!/bin/bash
# This file is just used to demo the RPM packaging.
# the only thing is showing the hostname.
HOST=`/bin/hostname`
/bin/echo $HOST
[root @test SOURCES]# chmod 755 showvbird.sh
[root @test SOURCES]# tar –zcvf showvbird.tar.gz showvbird.sh
注意了,我们必需要将他打包才行!
上面的动作中,我们编辑了一个shell script档案,档名为showvbird.sh,并且将他打包成为具有gzip压缩的tarball档案,也就是showvbird.tar.gz这 样的档案才行!请注意,这个showvbird.tar.gz档案『必需』放置在SOURCES目录之下!
再来则是要编辑那个很重要的*.spec档案啰!你可以这样简单的编写一下:
[root @test root]# cd /usr/src/redhat/SPECS
[root @test SPECS]# vi showvbird.spec
Summary: This is a demo RPM package.
Name: showvbird
Version: 1.0
Release: 1
Copyright: GPL
Group: VBird's Home
Source: showvbird.tar.gz <==这个就是刚刚建立起来的 arball档案!
Url: http://linux.vbird.org
Packager: VBird
%description
This package is just a demo RPM.
%prep
%setup
–c
%install
install -m 755 showvbird.sh /usr/local/bin/showvbird.sh
%files
/usr/local/bin/showvbird.sh
好了!开始给他编译并打包成为RPM档案啦!
[root @test SPECS]# rpmbuild -ba --target=ppc vsftpd.spec
Wrote: /usr/src/redhat/RPMS/i586/showvbird-1.0-1.i586.rpm
最后这个被打包成功的档案就被放置在/usr/src/redhat/RPMS/i586/showvbird-1.0-1.i586.rpm啰!然后给他安装一下:
[root @test SPECS]# rpm –ivh /usr/src/RPM/RPMS/i586/showvbird-1.0-1.i586.rpm Preparing... ########################################### [100%] 1:showvbird ########################################### [100%]
[root @test SPECS]# rpm –qi showvbird
Name : showvbird
Relocations: (not relocateable)
Version : 1.0
Vendor: (none)
Release : 1
Build Date: Wed 06 Nov 2002 11:27:17 PM CST
Install date: Wed 06 Nov 2002 11:27:42 PM CST
Build Host: test.linux.org
Group : VBird's Home
Source RPM: showvbird-1.0-1.src.rpm
Size : 143 License:
GPL Packager : VBird
URL : http://linux.vbird.org
Summary : This is a demo RPM package.
Description : This package is just a demo RPM.
[root @test SPECS]# showvbird.sh test.linux.org
[root @test SPECS]# rpm –ql showvbird /usr/local/bin/showvbird.sh <==嘿嘿!已经记录起来了!自己的软体耶!
用很简单的方式,就可以将自己的软体或者程式给他修改与设定妥当!很不错吧!以后您就可以自行设定你的RPM啰!当然,也可以手动修改您的SRPM的来源档内容啰!
7 SPEC中的环境变量
7.1 macros
可以通过更改 %_topdir
设置来告诉 RPM 查找和创建不同目录集中的文件。按照下面的方法在您的主目录下创建一个名为 .rpmmacros的文件:
%_topdir /home/your_userid/rpm
这 个文件会告诉 RPM:它先前在 /usr/src/redhat 下查找的所有目录应该改为在 /home/your_userid/rpm 下查找。 现在,您应该创建这样一个完整的目录树:~/rpm ~/rpm/SOURCES ~/rpm/SPECS ~/rpm/BUILD ~/rpm/RPMS ~/rpm/RPMS/i386 ~/rpm/SRPMS
~/rpm
~/rpm/SOURCES
~/rpm/SPECS
~/rpm/BUILD
~/rpm/RPMS
~/rpm/RPMS/i386
~/rpm/SRPMS
(如果愿意,可以通过在 RPM 中重新定义其它宏,来将其中任何目录放在您想放的任何地方。您可能需要考虑更改的一些宏包括 %_sourcedir
、 %_specdir
、 %_srcrpmdir
、 %_builddir
和 %_rpmdir
。 有关这些宏的缺省值,请查看 /usr/lib/rpm/macros
7.2 rpmrc
如果您在使用不同的 Linux 分发版,RPM 可能会有不同的内置路径。例如,它几乎肯定不会在 /usr/src/redhat 查找源文件!要确定希望的 RPM 安装路径,请运行rpm --showrc
并查看下列部分如何被定义:
-
_sourcedir
- RPM 在哪里查找源文件(tar 文件,等) _srcrpmdir
- RPM 在哪里放入新的源 RPM 文件 _rpmdir
- RPM 将把新的二进制 RPM 文件放在哪里(在特定于体系结构的子目录中)
其中一些根据其它变量定义;例如,当您看到 %{_topdir}
,查找 _topdir
的定义,等等
RPM 在将 RPM 变量存储到 RPM 包文件之前先在您的脚本中扩充它们,有时候这是有用的。 例如,可以在 .spec 文件顶部附近定义您自己的参数,然后在整个 .spec 文件 ― 甚至在您的脚本中使用 %{variable_name}
引用它们:
... %define foo_dir /usr/lib/foo ... %install cp install.time.message $RPM_BUILD_ROOT/%{foo_dir} %files %{foo_dir}/install.time.message %post /bin/cat %{foo_dir}/install.time.message |