Linux——SRPM的使用:rpmbuild(optional)

79 篇文章 0 订阅
72 篇文章 1 订阅

1、利用默认值安装SRPM文件(--rebuild/--recompile)

关于rpmbuild选项与参数

--rebuild

这个选项会将后面的 SRPM 进行『编译』与『打包』的动作,最后会产生 RPM 的文件,但是产生的 RPM 文件并没有安装到系统上。当你使用 --rebuild 的时候,最后通常会发现一行字体:

Wrote: /root/rpmbuild/RPMS/x86_64/pkgname.x86_64.rpm这个就是编译完成的 RPM 文件,这个文件就可以用来安装,安装的时候请加绝对路径来安装即可!

--recompile这个动作会直接的『编译』『打包』并且『安装』啰!请注意, rebuild 仅『编译并打包』而recompile不但进行编译和打包,还同时进行安装。

这两个选项都没有修改过 SRPM 内的设定值,仅是透过再次编译来产生 RPM 可
安装软件文件而已。 一般来说,如果编译的动作顺利的话,那么编译过程所产生的中间暂存盘都会
被自动删除,如果发生任何错误, 则该中间文件会被保留在系统上,等待用户的除错动作!
例题:请由 http://vault.centos.org/ 下载正确的 CentOS 版本中, 在 updates 软件库当中的 ntp 软件 SRPM,请下载最
新的那个版本即可,然后进行编译的行为。
答:目前 (2015/09) 最新的版本为:ntp-4.2.6p5-19.el7.centos.1.src.rpm 这一个,所以我是这样作的:

· 先下载软件:
wget http://vault.centos.org/7.1.1503/updates/Source/SPackages/ntp-4.2.6p5-19.el7.centos.1.src.rpm
· 再尝试直接编译看看:
rpmbuild --rebuild ntp-4.2.6p5-19.el7.centos.1.src.rpm
· 上面的动作会告诉我还有一堆相依软件没有安装~所以我得要安装起来才行:
yum install libcap-devel openssl-devel libedit-devel pps-tools-devel autogen autogen-libopts-devel
· 再次尝试编译的行为:
rpmbuild --rebuild ntp-4.2.6p5-19.el7.centos.1.src.rpm
· 最终的软件就会被放置到:
/root/rpmbuild/RPMS/x86_64/ntp-4.2.6p5-19.el7.centos.1.x86_64.rpm

2、SRPM使用的路径与需要的软件

假设使用root身份进行操作

/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 底下产生一个相对应的错误档,你可以根据该错误档进行除错的工作呢! 等到所有的问题都解决之后,也编译成功了,那么刚刚解压缩之后的文件,就是在 /root/rpmbild/{SPECS, SOURCES, BUILD} 等等的文件都会被杀掉,而只剩下放置在 /root/rpmbuild/RPMS 底下的文件了!
由于 SRPM 需要重新编译,而编译的过程当中,我们至少需要有 make 与其相关的程序,及 gcc, c, c++ 等其他的编译用的程序语言来进行编译,更多说明请参考第二十一章原始码所需基础软件吧。所以,如果你在安装的过程当中没有选取软件开发工具之类的软件,这时就得要使用上一小节介绍的yum 来安装就是了!那个 "Development Tools" 的软件群组请不要忘记安装了!

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

 

我们知道在 /root/rpmbuild/SOURCES 里面会放置原始档 (tarball) 以及相关的修补档 (patch file), 而我们也知道编译需要的步骤大抵就是 ./configure, make, make check, make install 等,那这些动作写入在哪里呢? 就在 SPECS 目录中

root@study ~]# cd /root/rpmbuild/SPECS
[root@study SPECS]# vim ntp.spec
# 1. 首先,这个部分在介绍整个软件的基本相关信息!不论是版本还是释出次数等。
Summary: The NTP daemon and utilities # 简易的说明这个软件的功能
Name: ntp # 软件的名称
Version: 4.2.6p5 # 软件的版本
Release: 19%{?dist}.1 # 软件的释出版次
# primary license (COPYRIGHT) : MIT # 底下有很多 # 的批注说明!
.....(中间省略).....
License: (MIT and BSD and BSD with advertising) and GPLv2
Group: System Environment/Daemons
Source0: http://www.eecis.udel.edu/~ntp/ntp_spool/ntp4/ntp-4.2/ntp-%{version}.tar.gz
Source1: ntp.conf # 写 SourceN 的就是原始码!
Source2: ntp.keys # 原始码可以有很多个!
.....(中间省略).....
Patch1: ntp-4.2.6p1-sleep.patch # 接下来则是补丁文件,就是 PatchN 的目的!
Patch2: ntp-4.2.6p4-droproot.patch
.....(中间省略).....
# 2. 这部分则是在设定相依属性需求的地方!
URL: http://www.ntp.org # 底下则是说明这个软件的相依性,
Requires(post): systemd-units # 还有编译过程需要的软件有哪些等等!
Requires(preun): systemd-units
Requires(postun): systemd-units
Requires: ntpdate = %{version}-%{release}
BuildRequires: libcap-devel openssl-devel libedit-devel perl-HTML-Parser
BuildRequires: pps-tools-devel autogen autogen-libopts-devel systemd-units
.....(中间省略).....
%package -n ntpdate # 其实这个软件包含有很多次软件喔!
Summary: Utility to set the date and time via NTP
Group: Applications/System
Requires(pre): shadow-utils
Requires(post): systemd-units
Requires(preun): systemd-units
Requires(postun): systemd-units
.....(中间省略).....
# 3. 编译前的预处理,以及编译过程当中所需要进行的指令,都写在这里
# 尤其 %build 底下的数据,几乎就是 makefile 里面的信息啊!
%prep # 这部份大多在处理补丁的动作!
%setup -q -a 5
%patch1 -p1 -b .sleep # 这些 patch 当然与前面的 PatchN 有关!
%patch2 -p1 -b .droproot
.....(中间省略).....
%build # 其实就是 ./configure, make 等动作!
sed -i 's|$CFLAGS -Wstrict-overflow|$CFLAGS|' configure sntp/configure
export CFLAGS="$RPM_OPT_FLAGS -fPIE -fno-strict-aliasing -fno-strict-overflow"
export LDFLAGS="-pie -Wl,-z,relro,-z,now"
%configure \ # 不就是 ./configure 的意思吗!
 --sysconfdir=%{_sysconfdir}/ntp/crypto \
 --with-openssl-libdir=%{_libdir} \
 --without-ntpsnmpd \
 --enable-all-clocks --enable-parse-clocks \
 --enable-ntp-signd=%{_localstatedir}/run/ntp_signd \
 --disable-local-libopts
echo '#define KEYFILE "%{_sysconfdir}/ntp/keys"' >> ntpdate/ntpdate.h
echo '#define NTP_VAR "%{_localstatedir}/log/ntpstats/"' >> config.h
make %{?_smp_mflags} # 不就是 make 了吗!
.....(中间省略).....
%install # 就是安装过程所进行的各项动作了!
make DESTDIR=$RPM_BUILD_ROOT bindir=%{_sbindir} install
mkdir -p $RPM_BUILD_ROOT%{_mandir}/man{5,8}
sed -i 's/sntp\.1/sntp\.8/' $RPM_BUILD_ROOT%{_mandir}/man1/sntp.1
mv $RPM_BUILD_ROOT%{_mandir}/man{1/sntp.1,8/sntp.8}
rm -rf $RPM_BUILD_ROOT%{_mandir}/man1
.....(中间省略).....
# 4. 这里列出,这个软件释出的文件有哪些的意思!
%files # 这软件所属的文件有哪些的意思!
%dir %{ntpdocdir}
%{ntpdocdir}/COPYRIGHT
%{ntpdocdir}/ChangeLog
.....(中间省略).....
# 5. 列出这个软件的更改历史纪录文件!
%changelog
* Tue Jun 23 2015 CentOS Sources <bugs@centos.org> - 4.2.6p5-19.el7.centos.1
- rebrand vendorzone
* Thu Apr 23 2015 Miroslav Lichvar <mlichvar@redhat.com> 4.2.6p5-19.el7_1.1
- don't step clock for leap second with -x option (#1191122)
.....(后面省略).....

要注意到的是 ntp.sepc 这个文件,这是主要的将 SRPM 编译成 RPM 的配置文件,他的基本规则可以这样看:
(1)整个文件的开头以 Summary 为开始,这部份的设定都是最基础的说明内容;
(2)然后每个不同的段落之间,都以 % 来做为开头,例如 %prep 与 %install 等;

常见的 SRPM 设定段落:
<1>系统整体信息方面:

参数参数意义
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』
<2>%description:
将你的软件做一个简短的说明!这个也是必需要的。还记得使用『 rpm -qi 软件名称 』会出现一些基础的说明吗? 上面这些东西包括 Description 就是在显示这些重要信息的啦!所以,这里记得要详加解释喔!
<3>%prep:
pre 这个关键词原本就有『在...之前』的意思,因此这个项目在这里指的就是『尚未进行设定或安装之前,你要编译完成的 RPM 帮你事先做的事情』,就是 prepare 的简写啰!那么他的工作事项主要有:
(1)进行软件的补丁 (patch) 等相关工作;
(2)寻找软件所需要的目录是否已经存在?确认用的!
(3)事先建立你的软件所需要的目录,或者事先需要进行的任务;
(4)如果待安装的 Linux 系统内已经有安装的时候可能会被覆盖掉的文件时,那么就必需要进行备份(backup)的工作了!
在本案例中,你会发现程序会使用 patch 去进行补丁的动作啦!所以程序的原始码才会更新到最新
啊!
<4>%build:                                                                                                                                                                             build 就是建立啊!所以当然啰,这个段落就是在谈怎么 make 编译成为可执行的程序啰! 你会发现在此部分的程序代码方面,就是 ./configure, make 等项目哩!一般来说,如果你会使用 SRPM 来进行重新编译的行为, 通常就是要重新 ./configure 并给予新的参数设定!于是这部份就可能会修改到!
§ %install:
编译完成 (build) 之后,就是要安装啦!安装就是写在这里,也就是类似 Tarball 里面的 make install 的意思啰!
§ %files:
这个软件安装的文件都需要写到这里来,当然包括了『目录』喔!所以连同目录请一起写到这个段落当中!以备查验呢!^_^ !此外,你也可以指定每个文件的类型,包括文件档 (%doc 后面接的) 与配置文件 (%config 后面接的) 等等。
§ %changelog:
这个项目主要则是在记录这个软件曾经的更新纪录啰!星号 (*) 后面应该要以时间,修改者, email 与软件版本来作为说明, 减号 (-) 后面则是你要作的详细说明啰!在这部份鸟哥就新增了两行,内容如下:

%changelog
* Wed Sep 09 2015 VBird Tsai <vbird@mail.vbird.idv.tw>- 4.2.6p5-20.vbird
- only rbuild this SRPM to RPM
* Tue Jun 23 2015 CentOS Sources <bugs@centos.org> - 4.2.6p5-19.el7.centos.1
- rebrand vendorzone
....(底下省略)....

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

[root@study ~]# rpmbuild -ba ntp.spec <==编译并同时产生 RPM 与 SRPM 文件
[root@study ~]# rpmbuild -bb ntp.spec <==仅编译成 RPM 文件

这个时候系统就会这样做:
(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 那个目录底下

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值