22.4 SRPM 的使用 : rpmbuild (Optional)

谈完了 RPM 类型的软件之后,再来我们谈一谈包含了 Source code 的 SRPM 该如何使用呢?假如今天我们由网络上面下载了一个 SRPM 的文件,该如何安装他?又,如果我想要修改这个 SRPM 里面源代码的相关设置值,又该如何订正与重新编译呢? 此外,最需要注意的是,新版的 rpm 已经将 RPM 与 SRPM 的指令分开了,SRPM 使用的是 rpmbuild 这个指令,而不是 rpm 喔!

22.4.1 利用默认值安装 SRPM 文件 (--rebuid/--recompile)

假设我下载了一个 SRPM 的文件,又不想要修订这个文件内的源代码与相关的设置值, 那么我可以直接编译并安装吗?当然可以!利用 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

上面的测试案例是将一个 SRPM 文件抓下来之后,依据你的系统重新进行编译。一般来说,因为该编译可能会依据你的系统硬件而最优化, 所以可能性能会好一些些,但是...人类根本感受不到那种性能优化的效果~所以并不建议你这么作。此外, 这种情况也很能发生在你从不同的 Linux distribution 所下载的 SRPM 拿来想要安装在你的系统上,这样作才算是有点意义。

一般来说,如果你有需要用到 SRPM 的文件,大部分的原因就是...你需要重新修改里面的某些设置,让软件加入某些特殊功能等等的。 所以啰,此时就得要将 SRPM 拆开,编辑一下编译配置文件,然后再予以重新编译啦!下个小节我们来玩玩修改设置的方式!

22.4.2 SRPM 使用的路径与需要的软件

SRPM 既然含有 source code ,那么其中必定有配置文件啰,所以首先我们必需要知道,这个 SRPM 在进行编译的时候会使用到哪些目录呢?这样一来才能够来修改嘛! 不过从 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 文件就会放置在这个目录中了。

鸟哥的图示

Tips 早期要使用 SRPM 时,必须是 root 的身份才能够使用编译行为,同时源代码都会被放置到 /usr/src/redhat/ 目录内喔! 跟目前放置到 /~username/rpmbuild/ 的情况不太一样!

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

由于 SRPM 需要重新编译,而编译的过程当中,我们至少需要有 make 与其相关的程序,及 gcc, c, c++ 等其他的编译用的程序语言来进行编译,更多说明请参考第二十一章源代码所需基础软件吧。 所以,如果你在安装的过程当中没有选取软件开发工具之类的软件,这时就得要使用上一小节介绍的 yum 来安装就是了! 当然,那个 "Development Tools" 的软件群组请不要忘记安装了!

问:尝试将上个练习下载的 ntp 的 SRPM 软件直接安装到系统中 (不要编译),然后查阅一下所有用到的目录为何?答:

# 1\. 鸟哥这里假设你用 root 的身份来进行安装的行为喔!
[root@study ~]# rpm -ivh ntp-4.2.6p5-19.el7.centos.1.src.rpm
Updating / installing...
   1:ntp-4.2.6p5-19.el7.centos.1      ################################# [100%]
warning: user mockbuild does not exist - using root
warning: group mockbuild does not exist - using root
# 会有一堆 warning 的问题,那个不要理它!可以忽略没问题的!

# 2\. 查阅一下 /root/rpmbuild 目录的内容!
[root@study ~]# ll -l /root/rpmbuild
drwxr-xr-x. 3 root root   39 Sep  8 16:16 BUILD
drwxr-xr-x. 2 root root    6 Sep  8 16:16 BUILDROOT
drwxr-xr-x. 4 root root   32 Sep  8 16:16 RPMS
drwxr-xr-x. 2 root root 4096 Sep  9 09:43 SOURCES
drwxr-xr-x. 2 root root   39 Sep  9 09:43 SPECS     # 这个家伙最重要!
drwxr-xr-x. 2 root root    6 Sep  8 14:51 SRPMS

[root@study ~]# ll -l /root/rpmbuild/{SOURCES,SPECS}
/root/rpmbuild/SOURCES:
-rw-rw-r--. 1 root root      559 Jun 24 07:44 ntp-4.2.4p7-getprecision.patch
-rw-rw-r--. 1 root root      661 Jun 24 07:44 ntp-4.2.6p1-cmsgalign.patch
.....(中间省略).....
/root/rpmbuild/SPECS:
-rw-rw-r--. 1 root root   41422 Jun 24 07:44 ntp.spec   # 这就是重点!

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

如前一个小节的练习,我们知道在 /root/rpmbuild/SOURCES 里面会放置原始文件 (tarball) 以及相关的修补档 (patch file), 而我们也知道编译需要的步骤大抵就是 ./configure, make, make check, make install 等,那这些动作写入在哪里呢? 就在 SPECS 目录中啦!让我们来瞧一瞧 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 设置段落:

  • 系统整体信息方面:

刚刚你看到的就有下面这些重要的咚咚啰:

参数 参数意义
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 与软件版本来作为说明, 减号 (-) 后面则是你要作的详细说明啰!在这部份鸟哥就新增了两行,内容如下:

%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
....(下面省略)....

修改到这里也差不多了,您也应该要了解到这个 ntp.spec 有多么重要!我们用 rpm -q 去查询一堆信息时, 其实都是在这里写入的!这样了解否?接下来,就让我们来了解一下如何将 SRPM 给他编译出 RPM 来吧!

22.4.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 那个目录下面就对啦!我们这个案例中想要同时打包 RPM 与 SRPM , 因此请您自行处理一下“ rpmbuild -ba ntp.spec ”吧!

[root@study ~]# cd /root/rpmbuild/SPECS
[root@study SPECS]# rpmbuild -ba ntp.spec
.....(前面省略).....
Wrote: /root/rpmbuild/SRPMS/ntp-4.2.6p5-20.vbird.src.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/ntp-4.2.6p5-20.vbird.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/noarch/ntp-perl-4.2.6p5-20.vbird.noarch.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/ntpdate-4.2.6p5-20.vbird.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/sntp-4.2.6p5-20.vbird.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/noarch/ntp-doc-4.2.6p5-20.vbird.noarch.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/ntp-debuginfo-4.2.6p5-20.vbird.x86_64.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.xZh6yz
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd ntp-4.2.6p5
+ /usr/bin/rm -rf /root/rpmbuild/BUILDROOT/ntp-4.2.6p5-20.vbird.x86_64
+ exit 0

[root@study SPECS]# find /root/rpmbuild -name 'ntp*rpm'
/root/rpmbuild/RPMS/x86_64/ntp-4.2.6p5-20.vbird.x86_64.rpm
/root/rpmbuild/RPMS/x86_64/ntpdate-4.2.6p5-20.vbird.x86_64.rpm
/root/rpmbuild/RPMS/x86_64/ntp-debuginfo-4.2.6p5-20.vbird.x86_64.rpm
/root/rpmbuild/RPMS/noarch/ntp-perl-4.2.6p5-20.vbird.noarch.rpm
/root/rpmbuild/RPMS/noarch/ntp-doc-4.2.6p5-20.vbird.noarch.rpm
/root/rpmbuild/SRPMS/ntp-4.2.6p5-20.vbird.src.rpm
# 上面分别是 RPM 与 SRPM 的文件文件名!

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

22.4.5 一个打包自己软件的范例

这个就有趣了!我们自己来编辑一下自己制作的 RPM 怎么样?会很难吗?完全不会! 我们这里就举个例子来玩玩吧!还记得我们在前一章谈到 Tarball 与 make 时,曾经谈到的 main 这个程序吗?现在我们将这个程序加上 Makefile 后, 将他制作成为 main-0.1-1.x86_64.rpm 好吗?那该如何进行呢?下面就让我们来处理处理吧!

  • 制作源代码文件 tarball 产生:

因为鸟哥的网站并没有直接释出 main-0.2,所以假设官网提供的是 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/
# 1\. 先来处理源代码的部份,假设你的 /root/rpmbuild/SOURCES 已经存在了喔!
[root@study ~]# cd /root/rpmbuild/SOURCES
[root@study SOURCES]# wget http://linux.vbird.org/linux_basic/0520source/main-0.1.tgz
[root@study SOURCES]# wget http://linux.vbird.org/linux_basic/0520source/main_0.1_to_0.2.patch
[root@study SOURCES]# ll main*
-rw-r--r--. 1 root root  703 Sep  4 14:47 main-0.1.tgz
-rw-r--r--. 1 root root 1538 Sep  4 14:51 main_0.1_to_0.2.patch

接下来就是 spec 文件的创建啰!

  • 创建 *.spec 的配置文件

这个文件的创建是所有 RPM 制作里面最重要的课题!你必须要仔细的设置他,不要随便处理!仔细看看吧! 有趣的是,CentOS 7.x 会主动的将必要的设置参数列出来喔!相当有趣! ^_^

[root@study ~]# cd /root/rpmbuild/SPECS
[root@study SPECS]# vim main.spec
Name:           main
Version:        0.1
Release:        1%{?dist}
Summary:        Shows sin and cos value.
Group:          Scientific Support
License:        GPLv2
URL:            http://linux.vbird.org/
Source0:        main-0.1.tgz             # 这两个文件名要正确喔!
Patch0:         main_0.1_to_0.2.patch

%description
This package will let you input your name and calculate sin cos value.

%prep
%setup -q
%patch0 -p1                              # 要用来作为 patch 的动作!

%build
make clean main                          # 编译就好!不要安装!

%install
mkdir -p %{buildroot}/usr/local/bin
install -m 755 main %{buildroot}/usr/local/bin # 这才是顺利的安装行为!

%files
/usr/local/bin/main

%changelog
* Wed Sep 09 2015 VBird Tsai <vbird@mail.vbird.idv.tw> 0.2
- build the program
  • 编译成为 RPM 与 SRPM

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

[root@study SPECS]# rpmbuild -ba main.spec
.....(前面省略).....
Wrote: /root/rpmbuild/SRPMS/main-0.1-1.el7.centos.src.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/main-0.1-1.el7.centos.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/main-debuginfo-0.1-1.el7.centos.x86_64.rpm

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

  • 安装/测试/实际查询
[root@study ~]# yum install /root/rpmbuild/RPMS/x86_64/main-0.1-1.el7.centos.x86_64.rpm
[root@study ~]# rpm -ql main
/usr/local/bin/main   <==自己尝试执行 main 看看!

[root@study ~]# rpm -qi main
Name        : main
Version     : 0.1
Release     : 1.el7.centos
Architecture: x86_64
Install Date: Wed 09 Sep 2015 04:29:08 PM CST
Group       : Scientific Support
Size        : 7200
License     : GPLv2
Signature   : (none)
Source RPM  : main-0.1-1.el7.centos.src.rpm
Build Date  : Wed 09 Sep 2015 04:27:29 PM CST
Build Host  : study.centos.vbird
Relocations : (not relocatable)
URL         : http://linux.vbird.org/
Summary     : Shows sin and cos value.
Description :
This package will let you input your name and calculate sin cos value.
# 看到没?属于你自己的软件喔!真是很愉快的啦!

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