centos浅谈之rpm和rpmbuild

本文为转载,内容很精彩,原文链接: http://www.centoscn.com/CentOS/2014/1029/4015.html

一、简介     

 

       RPM(Red Hat Package Manager)是用于 Linux 分发版(distribution)的最常见的软件包管理器。RPM包命名方式:name-version-release.architecture.rpm。RPM有五种基本的操作功能:安装、卸载、升级、查询和验证。这五种基本功能的实现仅仅需要用rpm + 选项 + rpm包就能轻易地实现。

       如果想发布rpm格式的源码包或者是二进制包,就要使用rpmbuild工具(rpm最新打包工具)。rpmbuild根据本地源码包的成功编译安装而写了spec文件(该文件要以.spec结束)。

二、详解

1、RPM

(1)rpm二进制包(.rpm文件)

常用命令组合:

[cpp] view plaincopy
 
  1. -ivh:安装显示安装进度--install--verbose--hash  
  2. -Uvh:升级软件包--Update;  
  3. -qpl:列出RPM软件包内的文件信息[Query Package list];  
  4. -qpi:列出RPM软件包的描述信息[Query Package install package(s)];  
  5. -qf:查找指定文件属于哪个RPM软件包[Query File];  
  6. -Va:校验所有的RPM软件包,查找丢失的文件[View Lost];  
  7. -e:删除包  

1)安装:

        rpm -i your-package.rpm(your-package.rpm是rpm包的文件名),安装过程中可能出现下面的警告或者提示:.. conflict with ... ,则可能是要安装的包里有一些文件可能会覆盖现有的文件,缺省时这样的情况下是无法正确安装的可以用rpm-i --force强制安装即可。若出现... is needed by ...和... is not installed ... 此包需要的一些软件你没有安装可以用rpm-i --nodeps可以忽略所有依赖关系和文件问题,什么包都能安装上,但这种强制安装的软件包不能保证完全发挥功能 。

2)查询:

      rpm -qa 将列出所有安装过的包 ,rpm -qa | grep httpd  #[搜索指定rpm包是否安装]--all搜索*httpd*
      rpm -ql httpd  #[搜索rpm包]--list所有文件安装目录
      which mysql   #查找rpm包中的文件安装到那里去了
      rpm -qpi Linux-1.4-6.i368.rpm #[查看rpm包]--query--package--install package信息
      rpm -qpf Linux-1.4-6.i368.rpm #[查看rpm包]--file
      rpm -qpR file.rpm       #[查看包]依赖关系
      查找rpm中包含哪些文件:一个没有安装过的软件包,使用rpm -qlp *.rpm;一个已经安装的软件包,可以使用rpm -ql *.rpm 。
      获取关于一个软件包的信息:一个没有安装过的软件包,使用rpm -qlp *.rpm ;一个已经安装过的软件包,使用rpm -qi *.rpm。

      rpm -qf `which 程序名` 返回软件包的全名
      rpm -qif `which 程序名` 返回软件包的有关信息 
      rpm -qlf `which 程序名` 返回软件包的文件列表 

      首先获得这个程序的完整路径,可以用whereis或者which,然后使用rpm -qf例如:
# whereis ftptop 
ftptop: /usr/bin/ftptop /usr/share/man/man1/ftptop.1.gz 
# rpm -qf /usr/bin/ftptop 
proftpd-1.2.8-1 
# rpm -qf /usr/share/doc/proftpd-1.2.8/rfc/rfc0959.txt 
proftpd-1.2.8-1
3)删除:
rpm -e file.rpm      #[删除一个rpm包]--erase

 

有时会出现一些错误或者警告: ... is needed by ... 这说明这个软件被其他软件需要,不能随便卸载 ,可以用rpm -e --nodeps强制卸载 。

4)升级:

rpm -Uvh file.rpm    #[升级一个rpm]--upgrade

5)验证:

rpm –V file.rpm。对已经安装了的程序进行验证。

(2)rpm源码包(.src.rpm文件)

.src.rpm结尾的文件是由软件的源代码包装而成的,用户要安装这类RPM软件包,必须使用命令:

rpmbuild --recompile vim-4.6-4.src.rpm   #这个命令会把源代码解包并编译、安装它,如果用户使用命令。
rpmbuild --rebuild vim-4.6-4.src.rpm  #在安装完成后,还会把编译生成的可执行文件重新包装成i386.rpm的RPM软件包。

一般会采用的方法:

1.执行rpm -i you-package.src.rpm 
2. cd /usr/src/redhat/SPECS 
3. rpmbuild -bb your-package.specs 一个和你的软件包同名的specs文件,这时在/usr/src/redhat/RPM/i386/ (根据具体包的不同,也可能是i686,noarch等等) 这个目录下,有一个新的rpm包,这个是编译好的二进制文件。
执行rpm -i new-package.rpm即可安装完成。

或者:

1.执行rpm -i your-package.src.rpm 
2. cd /usr/src/redhat/SPECS 
3. rpmbuild -bp your-package.specs 一个和你的软件包同名的specs文件 
4. cd /usr/src/redhat/BUILD/your-package/ 一个和你的软件包同名的目录 
5. ./configure 这一步和编译普通的源码软件一样,可以加上参数 
6. make 
7. make install 

(3)不安装获取rpm包中的文件

使用工具rpm2cpiocpio命令格式: rpm2cpio file.rpm |cpio -div
rpm2cpio file.rpm | cpio -vi 
rpm2cpio file.rpm | cpio -idmv 
rpm2cpio file.rpm | cpio --extract --make-directories 
      其中参数i和extract相同,表示提取文件;v表示指示执行进程 ;d和make-directory相同,表示根据包中文件原来的路径建立目录 ;m表示保持文件的更新时间。

      同样适用于.src.rpm源码包。

(4)rpm的配置文件

 RPM包管理的配置文件是 rpmrc ,可以在自己的系统中找到。

[root@localhost RPMS]# locate rpmrc
/usr/lib/rpm/rpmrc
/usr/lib/rpm/redhat/rpmrc
也可以通过 rpm --showrc 。 

 

 

2、RPMBUILD

 

     它是用来指示转换的源码编译成二进制文件的包,在centos下默认目录为当前用户下,如/root。因为系统有默认的rpm构建的目录,若要重新指定rpm构建的目录位置,需要在当前用户目录下建一个.rpmmacros文件,通过更改 %_topdir 设置来告诉 RPM 查找和创建不同目录集中的文件,如%_topdir /home/your_userid/rpm,然后手动创建这样一个完整的目录树:~/rpm ~/rpm/SOURCES ~/rpm/SPECS ~/rpm/BUILD ~/rpm/RPMS ~/rpm/RPMS/i386 ~/rpm/SRPMS(也可运行时程序自动创建,比如任意执行个spec文件,rpmbuild -bp file.spec虽然执行失败但会创建目录)。

(1)目录

       此次在当前root用户下手动创建目录,mkdir –p /root/rpmbuild,mkdir -pv ~/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}。

 

centos浅谈之rpm和rpmbuild_第1张图片

--BUILD #编译之前,如解压包后存放的路径
--BUILDROOT #编译后存放的路径
--RPMS #打包完成后rpm包存放的路径
--SOURCES #源包所放置的路径
--SPECS #spec文档放置的路径
--SPRMS #源码rpm包放置的路径
注:一般我们都把源码打包成tar.gz格式然后存放于SOURCES路径下(rpm -ivh +源码包,会自动解压到SOURCES目录下),而在SPECS路径下编写spec文档,通过命令打包后,默认会把打包后的rpm包放在RPMS下,而源码包会被放置在SRPMS下

(2)rpmbuild相关命令

基本格式:rpmbuild [options] [spec文档|tarball包|源码包],以下依次列出三种不同文件
1.从spec文档建立有以下选项:
-bp  #只执行spec的%pre 段(解开源码包并打补丁,即只做准备)
-bc  #执行spec的%pre和%build 段(准备并编译)
-bi  #执行spec中%pre,%build与%install(准备,编译并安装)
-bl  #检查spec中的%file段(查看文件是否齐全)
-ba  #建立源码与二进制包(常用)
-bb  #只建立二进制包(常用)
-bs  #只建立源码包
2.从tarball包建立,与spec类似
-tp #对应-bp
-tc #对应-bc
-ti #对应-bi
-ta #对应-ba
-tb #对应-bb
-ts #对应-bs
3.从源码包建立
--rebuild  #建立二进制包,通-bb
--recompile  #同-bi
4.其他的一些选项
--buildroot=DIRECTORY  #确定以root目录建立包
--clean  #完成打包后清除BUILD下的文件目录
--nobuild  #不进行%build的阶段
--nodeps  #不检查建立包时的关联文件
--nodirtokens
--rmsource  #完成打包后清除SOURCES
--rmspec #完成打包后清除SPEC
--short-cricuit
--target=CPU-VENDOR-OS #确定包的最终使用平台

 

 (3) spec文档的编写

Name:软件包的名称,后面可使用%{name}的方式引用,具体命令需跟源包一致
Summary: 软件包的内容概要
Version: 软件的实际版本号,具体命令需跟源包一致
Release: 发布序列号,具体命令需跟源包一致
Group: 软件分组,建议使用标准分组
-----------------------------------------
软件包所属类别,具体类别有:
Amusements/Games (娱乐/游戏)
Amusements/Graphics(娱乐/图形)
Applications/Archiving (应用/文档)
Applications/Communications(应用/通讯)
Applications/Databases (应用/数据库)
Applications/Editors (应用/编辑器)
Applications/Emulators (应用/仿真器)
Applications/Engineering (应用/工程)
Applications/File (应用/文件)
Applications/Internet (应用/因特网)
Applications/Multimedia(应用/多媒体)
Applications/Productivity (应用/产品)
Applications/Publishing(应用/印刷)
Applications/System(应用/系统)
Applications/Text (应用/文本)
Development/Debuggers (开发/调试器)
Development/Languages (开发/语言)
Development/Libraries (开发/函数库)
Development/System (开发/系统)
Development/Tools (开发/工具)
Documentation (文档)
System Environment/Base(系统环境/基础)
System Environment/Daemons (系统环境/守护)
System Environment/Kernel (系统环境/内核)
System Environment/Libraries (系统环境/函数库)
System Environment/Shells (系统环境/接口)
User Interface/Desktops(用户界面/桌面)
User Interface/X (用户界面/X窗口)
User Interface/X Hardware Support (用户界面/X硬件支持)
----------------------------------------------------
License: 软件授权方式,通常就是GPL
Source:源代码包,可以带多个用Source1、Source2等源,后面也可以用%{source1}、%{source2}引用
BuildRoot: 这个是安装或编译时使用的“虚拟目录”,考虑到多用户的环境,一般定义为:
%{_tmppath}/%{name}-%{version}-%{release}-root

%{_tmppath}/%{name}-%{version}-%{release}-buildroot-%(%{__id_u}-n}
该参数非常重要,因为在生成rpm的过程中,执行makeinstall时就会把软件安装到上述的路径中,在打包的时候,同样依赖“虚拟目录”为“根目录”进行操作。
后面可使用$RPM_BUILD_ROOT 方式引用。
URL: 软件的主页
Vendor: 发行商或打包组织的信息,例如RedFlag Co,Ltd
Disstribution: 发行版标识
Patch: 补丁源码,可使用Patch1、Patch2等标识多个补丁,使用%patch0或%{patch0}引用
Prefix: %{_prefix}这个主要是为了解决今后安装rpm包时,并不一定把软件安装到rpm中打包的目录的情况。这样,必须在这里定义该标识,并在编写%install脚本的时候引用,才能实现rpm安装时重新指定位置的功能
Prefix: %{_sysconfdir}这个原因和上面的一样,但由于%{_prefix}指/usr,而对于其他的文件,例如/etc下的配置文件,则需要用%{_sysconfdir}标识
Build Arch:指编译的目标处理器架构,noarch标识不指定,但通常都是以/usr/lib/rpm/marcros中的内容为默认值
Requires:该rpm包所依赖的软件包名称,可以用>=或<=表示大于或小于某一特定版本,例如:
libpng-devel >= 1.0.20 zlib
※“>=”号两边需用空格隔开,而不同软件名称也用空格分开
还有例如PreReq、Requires(pre)、Requires(post)、Requires(preun)、Requires(postun)、BuildRequires等都是针对不同阶段的依赖指定
Provides: 指明本软件一些特定的功能,以便其他rpm识别
Packager: 打包者的信息
%description 软件的详细说明
#spec脚本主体
spec脚本的主体中也包括了很多关键字和描述,下面会一一列举。我会把一些特别需要留意的地方标注出来。
%prep 预处理脚本
%setup -n %{name}-%{version} 把源码包解压并放好
注:可根据你的源码的名字格式,来确认解压后名字的格式,否则可能导致install的时候找不到对应的目录
通常是从/usr/src/redhat/SOURCES里的包解压到/usr/src/redhat/BUILD/%{name}-%{version}中。
一般用%setup-c就可以了,但有两种情况:一就是同时编译多个源码包,二就是源码的tar包的名称与解压出来的目录不一致,此时,就需要使用-n参数指定一下了。
%patch 打补丁
通常补丁都会一起在源码tar.gz包中,或放到SOURCES目录下。一般参数为:
%patch -p1 使用前面定义的Patch补丁进行,-p1是忽略patch的第一层目录
%Patch2 -p1 -b xxx.patch 打上指定的补丁,-b是指生成备份文件

◎补充一下
%setup 不加任何选项,仅将软件包打开。
%setup -n newdir 将软件包解压在newdir目录。
%setup -c 解压缩之前先产生目录。
%setup -b num 将第num个source文件解压缩。
%setup -T 不使用default的解压缩操作。
%setup -T -b 0 将第0个源代码文件解压缩。
%setup -c -n newdir 指定目录名称newdir,并在此目录产生rpm套件。
%patch 最简单的补丁方式,自动指定patch level。
%patch 0 使用第0个补丁文件,相当于%patch ?p 0。
%patch -s 不显示打补丁时的信息。
%patch -T 将所有打补丁时产生的输出文件删除。

%build 开始构建包
在/usr/src/redhat/BUILD/%{name}-%{version}目录中进行make的工作 ,常见写法:
make %{?_smp_mflags} OPTIMIZE="%{optflags}"
都是一些优化参数,定义在/usr/lib/rpm/marcros中

%install 开始把软件安装到虚拟的根目录中
在/usr/src/redhat/BUILD/%{name}-%{version}目录中进行makeinstall的操作。这个很重要,因为如果这里的路径不对的话,则下面%file中寻找文件的时候就会失败。 常见内容有:
%makeinstall 这不是关键字,而是rpm定义的标准宏命令。也可以使用非标准写法:
make DESTDIR=$RPM_BUILD_ROOT install

make prefix=$RPM_BUILD_ROOT install

需要说明的是,这里的%install主要就是为了后面的%file服务的。所以,还可以使用常规的系统命令:

install -d $RPM_BUILD_ROOT/ #建立目录
cp -a * $RPM_BUILD_ROOT/

%clean 清理临时文件
通常内容为:
引用
[ "$RPM_BUILD_ROOT" != "/" ] && rm-rf "$RPM_BUILD_ROOT"
rm -rf $RPM_BUILD_DIR/%{name}-%{version}

※注意区分$RPM_BUILD_ROOT和$RPM_BUILD_DIR:
$RPM_BUILD_ROOT是指开头定义的BuildRoot,而$RPM_BUILD_DIR通常就是指/usr/src/redhat/BUILD,其中,前面的才是%file需要的。

%pre rpm安装前执行的脚本

%post rpm安装后执行的脚本

%preun rpm卸载前执行的脚本

%postun rpm卸载后执行的脚本

%preun %postun 的区别是什么呢?
前者在升级的时候会执行,后者在升级rpm包的时候不会执行

%files 定义那些文件或目录会放入rpm中
这里会在虚拟根目录下进行,千万不要写绝对路径,而应用宏或变量表示相对路径。如果描述为目录,表示目录中除%exclude外的所有文件。
%defattr (-,root,root)指定包装文件的属性,分别是(mode,owner,group),-表示默认值,对文本文件是0644,可执行文件是0755

%exclude 列出不想打包到rpm中的文件
※小心,如果%exclude指定的文件不存在,也会出错的。
%changelog 变更日志

(4) spec文档中常用的几个宏(变量)

1.RPM_BUILD_DIR:      /usr/src/redhat/BUILD
2. RPM_BUILD_ROOT: 
  /usr/src/redhat/BUILDROOT
3. %{_sysconfdir}: 
   /etc
4.%{_sbindir}: 
      /usr/sbin
5.%{_bindir}: 
          /usr/bin
6.%{_datadir}: 
        /usr/share
7.%{_mandir}: 
          /usr/share/man
8.%{_libdir}: 
          /usr/lib64
9.%{_prefix}: 
          /usr
10. %{_localstatedir}: 
  /usr/var

(5) 创建RPM包的例子

要创建的rpm包为:test-1.0.1-1.el6.i686.rpm,打包的压缩文件为:test-1.0.1.tar.gz。

1.把test-1.0.1.tar.gz拷贝到SOURCE目录底下。

2.转至SPECS目录底下,编写test.spec描述文件,这个文件是创建rpm包最重要的部分,它会制定rpm包里的软件的安装目录,以及安装软件前后要注意的问题,软件的依赖及系统要求。

3.编译RPM,执行命令:rpmbuild –ba test.spec。这样以后,就开始创建rpm包。

4.执行rpmbuild –ba test.spec后,会首先把test-1.0.1.tar.gz解压缩到BUILD目录,BUILDROOT这个目录用来存放执行时存放的临时文件夹,这个目录也很重要,需要把在此目录建立相关目录以及拷贝相关文件信息的脚本写入test.spec文件里,以防编译出错,无法生成RPM包。成功执行完成之后,会在RPMS这个目录生成i686/ test-1.0.1-1.el6.i686.rpm文件。

如下图:

centos浅谈之rpm和rpmbuild_第2张图片

 

(6) 附加SPEC文件

      文件是官方发布的anaconda.spec,Anaconda是RedHat、CentOS、Fedora等Linux的安装管理程序,以后还有很重要的应用。分析该文件对系统的定制很有帮助,因文件内容过长,删除后面不太重要的日志部分。

 

[cpp] view plaincopy
 
  1. %define livearches %{ix86} x86_64 ppc ppc64  
  2. %define _libdir %{_prefix}/lib  
  3.   
  4. Summary: Graphical system installer  
  5. Name:    anaconda  
  6. Version: 13.21.176  
  7. Release: 1%{?dist}  
  8. License: GPLv2+  
  9. Group:   Applications/System  
  10. URL:     http://fedoraproject.org/wiki/Anaconda  
  11.   
  12. # To generate Source0 do:  
  13. # git clone http://git.fedorahosted.org/git/anaconda.git  
  14. # git checkout -b archive-branch anaconda-%{version}-%{release}  
  15. # ./autogen.sh  
  16. # ./configure  
  17. # make dist  
  18. Source0: %{name}-%{version}.tar.bz2  
  19. Patch1000: anaconda-centos-installclass.patch  
  20. Patch1001: anaconda-centos-upgrade-from-centos.patch  
  21. Patch1002: anaconda-centos-droprepos.patch  
  22.   
  23. BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)  
  24.   
  25. # Versions of required components (done so we make sure the buildrequires  
  26. # match the requires versions of things).  
  27. %define dmver 1.02.17-6  
  28. %define gettextver 0.11  
  29. %define genisoimagever 1.1.9-4  
  30. %define intltoolver 0.31.2-3  
  31. %define libnlver 1.0  
  32. %define libselinuxver 1.6  
  33. %define pykickstartver 1.74.8  
  34. %define rpmpythonver 4.2-0.61  
  35. %define slangver 2.0.6-2  
  36. %define yumver 2.9.2  
  37. %define partedver 1.8.1  
  38. %define pypartedver 3.0  
  39. %define syscfgdatever 1.9.48  
  40. %define pythonpyblockver 0.45-2  
  41. %define e2fsver 1.41.0  
  42. %define nmver 1:0.7.1-3.git20090414  
  43. %define dbusver 1.2.3  
  44. %define createrepover 0.4.7  
  45. %define yumutilsver 1.1.11-3  
  46. %define iscsiver 6.2.0.870-3  
  47. %define pythoncryptsetupver 0.0.6  
  48. %define mehver 0.8  
  49. %define sckeyboardver 1.3.1  
  50. %define libblkid 2.17.1-1  
  51. %define fcoeutilsver 1.0.12-3.20100323git  
  52. %define isomd5sumver 1.0.6  
  53.   
  54. BuildRequires: audit-libs-devel  
  55. BuildRequires: bzip2-devel  
  56. BuildRequires: device-mapper-devel >= %{dmver}  
  57. BuildRequires: e2fsprogs-devel >= %{e2fsver}  
  58. BuildRequires: elfutils-devel  
  59. BuildRequires: gettext >= %{gettextver}  
  60. BuildRequires: gtk2-devel  
  61. BuildRequires: intltool >= %{intltoolver}  
  62. BuildRequires: isomd5sum-devel >= %{isomd5sumver}  
  63. BuildRequires: libarchive-devel  
  64. BuildRequires: libX11-devel  
  65. BuildRequires: libXt-devel  
  66. BuildRequires: libXxf86misc-devel  
  67. BuildRequires: libblkid-devel >= %{libblkid}  
  68. BuildRequires: libcurl-devel  
  69. BuildRequires: libnl-devel >= %{libnlver}  
  70. BuildRequires: libselinux-devel >= %{libselinuxver}  
  71. BuildRequires: libsepol-devel  
  72. BuildRequires: libxml2-python  
  73. BuildRequires: newt-devel  
  74. BuildRequires: pango-devel  
  75. BuildRequires: pykickstart >= %{pykickstartver}  
  76. BuildRequires: python-devel  
  77. BuildRequires: python-urlgrabber >= 3.9.1-5  
  78. BuildRequires: rpm-devel  
  79. BuildRequires: rpm-python >= %{rpmpythonver}  
  80. BuildRequires: slang-devel >= %{slangver}  
  81. BuildRequires: xmlto  
  82. BuildRequires: yum >= %{yumver}  
  83. BuildRequires: zlib-devel  
  84. BuildRequires: NetworkManager-devel >= %{nmver}  
  85. BuildRequires: NetworkManager-glib-devel >= %{nmver}  
  86. BuildRequires: dbus-devel >= %{dbusver}  
  87. BuildRequires: system-config-keyboard >= %{sckeyboardver}  
  88. %ifarch %livearches  
  89. BuildRequires: desktop-file-utils  
  90. %endif  
  91. BuildRequires: iscsi-initiator-utils-devel >= %{iscsiver}  
  92. %ifarch s390 s390x  
  93. BuildRequires: s390utils-devel  
  94. %endif  
  95.   
  96. Requires: python-meh >= %{mehver}  
  97. Requires: policycoreutils  
  98. Requires: rpm-python >= %{rpmpythonver}  
  99. Requires: comps-extras  
  100. Requires: parted >= %{partedver}  
  101. Requires: pyparted >= %{pypartedver}  
  102. Requires: yum >= %{yumver}  
  103. Requires: libxml2-python  
  104. Requires: python-urlgrabber >= 3.9.1-5  
  105. Requires: system-logos  
  106. Requires: pykickstart >= %{pykickstartver}  
  107. Requires: system-config-date >= %{syscfgdatever}  
  108. Requires: device-mapper >= %{dmver}  
  109. Requires: device-mapper-libs >= %{dmver}  
  110. Requires: dosfstools  
  111. Requires: e2fsprogs >= %{e2fsver}  
  112. Requires: gzip  
  113. Requires: xz  
  114. Requires: libarchive  
  115. %ifarch %{ix86} x86_64 ia64  
  116. Requires: dmidecode  
  117. %endif  
  118. Requires: python-pyblock >= %{pythonpyblockver}  
  119. Requires: libuser-python  
  120. Requires: newt-python  
  121. Requires: authconfig  
  122. Requires: system-config-firewall-base  
  123. Requires: cryptsetup-luks  
  124. Requires: python-cryptsetup >= %{pythoncryptsetupver}  
  125. Requires: mdadm  
  126. Requires: lvm2  
  127. Requires: util-linux-ng >= 2.15.1  
  128. Requires: system-config-keyboard >= %{sckeyboardver}  
  129. Requires: dbus-python  
  130. Requires: cracklib-python  
  131. Requires: python-nss  
  132. Requires: tigervnc-server  
  133. %ifarch %livearches  
  134. Requires: usermode  
  135. Requires: zenity  
  136. %endif  
  137. Requires: createrepo >= %{createrepover}  
  138. Requires: squashfs-tools  
  139. Requires: genisoimage >= %{genisoimagever}  
  140. %ifarch %{ix86} x86_64  
  141. Requires: syslinux >= 3.73  
  142. Requires: makebootfat  
  143. Requires: device-mapper  
  144. %endif  
  145. %ifarch s390 s390x  
  146. Requires: openssh  
  147. %endif  
  148. Requires: isomd5sum  
  149. Requires: yum-utils >= %{yumutilsver}  
  150. Requires: NetworkManager >= %{nmver}  
  151. Requires: dhclient  
  152. Requires: anaconda-yum-plugins  
  153. Requires: libselinux-python >= %{libselinuxver}  
  154. Requires: fcoe-utils >= %{fcoeutilsver}  
  155. %ifarch %{sparc}  
  156. Requires: elftoaout piggyback  
  157. %endif  
  158. Obsoletes: anaconda-images <= 10  
  159. Provides: anaconda-images = %{version}-%{release}  
  160. Obsoletes: anaconda-runtime < %{version}-%{release}  
  161. Provides: anaconda-runtime = %{version}-%{release}  
  162. Obsoletes: booty  
  163.   
  164. %description  
  165. The anaconda package contains the program which was used to install your  
  166. system.  These files are of little use on an already installed system.  
  167.   
  168. %prep  
  169. %setup -q  
  170. %patch1000 -p1  
  171. %patch1001 -p1  
  172. %patch1002 -p1  
  173.   
  174.   
  175. %build  
  176. %configure --disable-static  
  177. %{__make} %{?_smp_mflags}  
  178.   
  179. %install  
  180. %{__rm} -rf %{buildroot}  
  181. %{__make} install DESTDIR=%{buildroot}  
  182. find %{buildroot} -type f -name "*.la" | xargs %{__rm}  
  183.   
  184. %ifarch %livearches  
  185. desktop-file-install --vendor="" --dir=%{buildroot}%{_datadir}/applications %{buildroot}%{_datadir}/applications/liveinst.desktop  
  186. %else  
  187. %{__rm} -rf %{buildroot}%{_bindir}/liveinst %{buildroot}%{_sbindir}/liveinst  
  188. %endif  
  189.   
  190. %find_lang %{name}  
  191.   
  192. %clean  
  193. %{__rm} -rf %{buildroot}  
  194.   
  195. %ifarch %livearches  
  196. %post  
  197. update-desktop-database &> /dev/null || :  
  198. %endif  
  199.   
  200. %ifarch %livearches  
  201. %postun  
  202. update-desktop-database &> /dev/null || :  
  203. %endif  
  204.   
  205. %files -f %{name}.lang  
  206. %defattr(-,root,root)  
  207. %doc COPYING  
  208. %doc docs/command-line.txt  
  209. %doc docs/install-methods.txt  
  210. %doc docs/mediacheck.txt  
  211. %doc docs/anaconda-release-notes.txt  
  212. /lib/udev/rules.d/70-anaconda.rules  
  213. %{_sbindir}/anaconda  
  214. %ifarch i386 i486 i586 i686 x86_64  
  215. %{_sbindir}/gptsync  
  216. %{_sbindir}/showpart  
  217. %endif  
  218. %{_datadir}/anaconda  
  219. %{_prefix}/lib/anaconda  
  220. %{_prefix}/lib/anaconda-runtime  
  221. %ifarch %livearches  
  222. %{_bindir}/liveinst  
  223. %{_sbindir}/liveinst  
  224. %config(noreplace) %{_sysconfdir}/pam.d/*  
  225. %config(noreplace) %{_sysconfdir}/security/console.apps/*  
  226. %{_sysconfdir}/X11/xinit/xinitrc.d/*  
  227. %{_datadir}/applications/*.desktop  
  228. %{_datadir}/icons/hicolor/*  
  229. %endif  
  230.   
  231. %changelog  
  232. * Sat Jun 23 2012 Karanbir Singh <[email protected]> - 13.21.176.1.el6.centos  
  233. - Build for CentOS-6.3  

 

三、总结

(1)IBM官方网站中rpm包的使用讲解的很全面,参看http://www.ibm.com/developerworks/cn/linux/management/package/rpm/part1/和rpmbuild的spec文件的解析参看http://www.ibm.com/developerworks/cn/linux/l-rpm/。

(2)rpm和rpmbuild内容众多丰富,该博客总结部分内容,以便使用时能快速查找到。

(3)若有读者想沟通交流的,可发信息到邮箱[email protected]

你可能感兴趣的:(linux,rpm,rpmbuild)