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 的源代码内容!

参与评论