Linux基础服务 ·

SRPM编译打包RPM

注意:新版的 rpm 已经将 RPM 与 SRPM 的命令分开了,SRPM 使用的是 rpmbuild 这个命令,而不是 rpm !如果你是 Red Hat 7.3 以前的用户,那么请使用 rpm 来替代 rpmbuild !

默认值安装 SRPM 文件

假设我下载了一个 SRPM 的文件,又不想要修订这个文件内的源代码与相关的配置值, 那么可以利用 rpmbuild 配合选项即可直接编译安装。选项主要有底下两个:

--rebuild 这个选项会将后面的 SRPM 进行『编译』与『打包』的动作,最后会产生 RPM 的文件,但是产生的 RPM 文件并没有安装到系统上。当你使用 --rebuild 的时候,最后通常会发现一行字体:
Wrote: /usr/src/redhat/RPMS/i386/pkgname.i386.rpm
这个就是编译完成的 RPM 文件!这个文件就可以用来安装!安装的时候请加绝对路径来安装即可!
--recompile 这个动作会直接的『编译』『打包』并且『安装』!请注意, rebuild 仅『编译并打包』而已,而 recompile 不但进行编译跟打包,还同时进行『安装』了!

不过,要注意的是,这两个选项都没有修改过 SRPM 内的配置,仅是通过再次编译来产生 RPM 可安装软件文件而已。 一般来说,如果编译的动作顺利的话,那么编译过程所产生的中间缓存文件都会被自动删除,如果发生任何错误, 则该中间文件会被保留在系统上,等待使用者的排错!

那么,该如何排错呢?如果想要自行排错, 或者是想要修改 SRPM 内的配置时,就得要知道利用 SRPM 的时候,系统会动用到哪些重要的目录了! 底下我们就来谈一谈当处理 SRPM 时,系统会使用到的目录。

SRPM 使用的路径与所需软件

SRPM 既然含有 source code ,那么其中必定有配置文件,所以首先我们必需要知道,这个 SRPM 在进行编译的时候会使用到的目录。

你可以到你的 /usr/src 这个目录里面去查看一下,通常每个 distribution 提供的目录都不太相同,以 CentOS 5.x 为例,他是以 /usr/src/redhat/ 为工作目录, Openlinux 则是以 /usr/src/openlinux 为工作目录!早期要使用SRPM 时,必须是root 的身份才能够使用编译行为,同时源代码都会被放置到/usr/src/redhat/ 目录内!

不过从 CentOS 6.x 开始(包含 CentOS 7.x ),因为每个用户应该都有能力自己安装自己的软件,因此SRPM 安装、设定、编译、最终结果所使用的目录都与操作者的家目录有关,假设你用 root 的身份来进行 SRPM 的操作, 那么你应该就会使用到下列的目录:

/root/rpmbuild/SPECS 这个目录当中放置的是该软件的配置文件,例如这个软件的信息参数、设定项目等等都放置在这里;
/root/rpmbuild/SOURCES 这个目录当中放置的是该软件的原始档(*.tar.gz 的文件) 以及config 这个配置文件;
/root/rpmbuild/BUILD 在编译的过程中,有些暂存的资料都会放置在这个目录当中;
/root/rpmbuild/RPMS 经过编译之后,并且顺利的编译成功之后,将打包完成的文件放置在这个目录当中。里头有包含了 x86_64, noarch.... 等等的次目录。
/root/rpmbuild/SRPMS 与RPMS 内相似的,这里放置的就是SRPM 封装的文件!有时候你想要将你的软件用SRPM 的方式释出时, 你的SRPM 文件就会放置在这个目录中了。

此外,在编译的过程当中,可能会发生不明的错误,或者是配置的错误,这个时候就会在 /tmp 底下产生一个相对应的错误文件,你可以根据该错误档进行排错的工作! 等到所有的问题都解决之后,也编译成功了,那么刚刚解压缩之后的文件,就是在 /usr/src/redhat/SPECS, SOURCES, BUILD 等等的文件都会被删掉,而只剩下放置在 /usr/src/redhat/RPMS 底下的文件了!

由于 SRPM 需要重新编译,而编译的过程当中,我们至少需要有 make 与其相关的程序,及 gcc, c, c++ 等其他的编译用的程序语言来进行编译。 所以,如果你在安装的过程当中没有选取软件开发工具之类的软件,可以使用 使用『 yum groupinstall "Development Tools" 』来安装开发软件。


尝试下载的 ntp 的SRPM 软件直接安装到系统中(不要编译),然后查阅一下所有用到的目录。

配置文件的主要内容(*.spec)

在 /root/rpmbuild/SOURCES 里面会放置源代码 (tarball) 以及相关的补丁(patch file), 而我们也知道编译需要的步骤大概就是 ./configure, make, make check, make install 等,这些动作就写在 SPECS 目录中!让我们来瞧一瞧SPECS 里面的文件内容!

要注意到的是 ntp.sepc 这个文件,这是主要的将 SRPM 编译成 RPM 的配置文件,他的基本规则可以这样看:

  1. 整个文件的开头以 Summary 为开始,这部份的设定都是最基础的说明内容;
  2. 然后每个不同的段落之间,都以 % 来做为开头,例如 %prep 与 %install 等;

我们来谈一谈几个常见的 SRPM 设定段落:

  • 系统整体信息方面:

刚刚你看到的就有底下这些重要的项目:

参数 参数意义
Summary 本软件的主要说明,例如上表中说明了本软件是针对 NTP 的软件功能与工具等!
Name 本软件的软件名称(最终会是 RPM 文件的文件名构成之一)
Version 本软件的版本(也会是 RPM 文件名的构成之一)
Release 这个是该版本打包的次数说明(也会是RPM文件名的构成之一)。由于我们想要动点手脚,所以请将『 19%{?dist}.1 』 修改为『 20.vbird 』看看
License 这个软件的授权模式,看起来涵盖了所有知名的 Open source 授权!!
Group 这个软件在安装的时候,主要是放置于哪一个软件群组当中(yum grouplist 的特点!);
URL 这个源代码的主要官方网站;
SourceN 这个软件的来源,如果是网路上下载的软件,通常一定会有这个信息来告诉大家这个源代码的来源!此外,如果有多个软件来源,就会以 Source0, Source1... 来处理源代码!
PatchN 就是作为补丁的 patch file !也是可以有好多个!
BuildRoot 设定作为编译时,该使用哪个目录来暂存中间文件(如编译过程的目标文件/链接文件等文件)。
上述为必须要存在的项目,底下为可使用的额外设定值
Requires 如果你这个软件还需要其他的软件的支持,那么这里就必需写上来,则当你制作成 RPM 之后,系统就会自动的去检查!这就是『相依属性』的主要来源!
BuildRequires 编译过程中所需要的软件。Requires 指的是『安装时需要检查』的,因为与实际运作有关,这个BuildRequires 指的是『编译时』所需要的软件,只有在 SRPM 编译成为 RPM 时才会检查的项目。

上面几个资料通常都必需要写!但是如果你的软件没有相依属性的关系时,那么就可以不需要那个 Requires !根据上面的设定,最终的文件名就会是『{Name}-{Version}-{Release}.{Arch}.rpm』的样式, 以我们上面的设定来说,文件名应该会是『ntp- 4.2.6p5-20.vbird.x86_64.rpm』的样子!

  • %description:

将你的软件做一个简短的说明!这个也是必需要的。还记得使用『 rpm -qi 软件名称』会出现一些基础的说明吗?上面这些东西包括 Description 就是在显示这些重要信息的!所以,这里记得要详加解释!

  • %prep:

pre 这个关键字原本就有『在...之前』的意思,因此这个项目在这里指的就是『尚未进行设定或安装之前,你要编译完成的 RPM帮你事先做的事情』,就是 prepare 的简写!那么他的工作事项主要有:

  1. 进行软件的补丁(patch) 等相关工作;
  2. 寻找软件所需要的目录是否已经存在?确认用的!
  3. 事先建立你的软件所需要的目录,或者事先需要进行的任务;
  4. 如果待安装的 Linux 系统内已经有安装的时候可能会被覆盖掉的文件时,那么就必需要进行备份(backup)的工作了!

在本案例中,你会发现程序会使用 patch 去进行补丁的动作!所以程序的源代码才会更新到最新!

  • %build:

build 就是建立!所以,这个段落就是在谈怎么 make 编译成为可执行的程序!你会发现在此部分的程序码方面,就是 ./configure, make等项目!一般来说,如果你会使用 SRPM 来进行重新编译的行为, 通常就是要重新 ./configure 并给予新的参数设定!于是这部份就可能会修改到!

  • %install:

编译完成(build) 之后,就是要安装!安装就是写在这里,也就是类似 Tarball 里面的 make install 的意思!

  • %files:

这个软件安装的文件都需要写到这里来,当然包括了『目录』!所以连同目录请一起写到这个段落当中!以备查验!此外,你也可以指定每个文件的类型,包括帮助文件 (%doc 后面接的) 与配置文件 (%config 后面接的) 等等。

  • %changelog:

这个项目主要则是在记录这个软件曾经的更新纪录!星号(*) 后面应该要以时间,修改者, email 与软件版本来作为说明, 减号(-) 后面则是你要作的详细说明!在这部份我就新增了两行,内容如下:

SRPM 的编译指令(-ba/-bb)

要将在 /root/rpmbuild 底下的资料编译或者是单纯的打包成为 RPM 或 SRPM 时,就需要 rpmbuild 指令与相关选项的帮忙了!我们只介绍两个常用的选项给您了解一下:

  1. 先进入到 BUILD 这个目录中,亦即是: /root/rpmbuild/BUILD 这个目录;
  2. 依照 *.spec 文件内的 Name 与 Version 定义出工作的目录名称,以我们上面的例子为例,那么系统就会在 BUILD 目录中先删除 ntp-4.2.6p5 的目录,再重新建立一个 ntp-4.2 .6p5 的目录,并进入该目录;
  3. 在新建的目录里面,针对 SOURCES 目录下的来源代码,也就是 *.spec 里面的 Source 设定的那个文件,以 tar 进行解压缩,以我们这个例子来说,则会在 /root/rpmbuild/BUILD/ ntp-4.2.6p5 当中,将 /root/rpmbuild/SOURCES/ntp-* 等等多个源代码文件进行解压缩!
  4. 再来开始 %build 及 %install 的设定与编译!
  5. 最后将完成打包的文件给他放置到该放置的地方去,如果你的系统是 x86_64 的话,那么最后编译成功的 *.x86_64.rpm 文件就会被放置在 /root/rpmbuild/RPMS/x86_64 里面!如果是 noarch 那么自然就是 /root/rpmbuild/RPMS/noarch 目录下!

整个步骤大概就是这样子!最后的结果资料会放置 在 RPMS 那个目录底下!

我们这个案例中想要同时打包 RPM 与SRPM , 因此请您自行处理一下『 rpmbuild -ba ntp.spec 』!

有 vbird 的软件出现了!另外,有些文件软件是与硬体等级无关的(因为是单纯的文件!),所以如上表所示, 你会发现 ntp-doc-4.2.6p5-20.vbird.noarch.rpm 是 noarch !

一个打包自己软件的范例

我们自己来编辑一下自己制作的 RPM!我们这里就举个例子!现在我们将 main 这个程序加上 Makefile 后,将他制作成为 main-0.1-1.x86_64.rpm!

那该如何进行呢?底下就让我们来处理处理吧!

制作源代码文件 tarball 产生:

假设官网提供的是 main-0.l 版本之外,同时提供了一个 patch 文件~ 那我们就得要这样作:

  • main-0.1.tar.gz 放在 /root/rpmbuild/SOURCES/
  • main_0.1_to_0.2_patch 放在 /root/rpmbuild/SOURCES/
  • main.spec 自行撰写放在 /root/rpmbuild/SPECS/

接下来就是 spec 文件的建立!

建立 *.spec 的配置文件

这个文件的建置是所有 RPM 制作里面最重要的项目!你必须要仔细的设定他,不要随便处理!CentOS 7.x 会主动的将必要的设定参数列出来!

编译成为 RPM 与SRPM

老实说,那个 spec 文件建置妥当后,后续的动作就简单的要命了!开始来编译吧!

很快的,我们就已经建立了几个 RPM 文件!接下来让我们好好测试一下打包起来的成果!

安装/测试/实际查询

用很简单的方式,就可以将自己的软件或者程序给他修改与设定妥当!以后你就可以自行设定你的 RPM !当然,也可以手动修改你的 SRPM 的源代码内容!

参与评论