# SRPM 的使用:rpmbuild

注意:默认为安装该软件,可通过 yum install rpm-build 安装

假如你有一个 SRPM 的文件,如何安装?如何修改 SPRM 里面的源码?如何重新编译?

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

假如你有一个 SRPM 文件,不想修改里面的源码文件,可以直接编译安装

rpmbuild --rebuild xx.src.rpm
rpmbuild --recompile xx.src.rpm

主要选项有:
	--rebuild:仅执行「编译」与「打包」动作
	--recompile:执行「编译」「打包」「安装」动作
1
2
3
4
5
6

以上两个选项都没有修改过 SRPM 内的设置,仅通过再次编译来产生 RPM 可安装软件文件。一般来说,如果编译顺利的话,那么编译过程所产生的中间暂存盘会被自动删除,如果发生任何错误,则中间文件会被保留在系统上,以供我们除错使用

这里用 ntp 软件的 SRPM 来练习。在 vault.centos.org 中选择你正确的 CentOS 版本,然后在 updates 软件看中选择 ntp 软件 SRPM,我这里选择了 http://vault.centos.org/7.0.1406/updates/Source/SPackages/ntp-4.2.6p5-19.el7.centos.src.rpm 的软件下载

# 下载软件
wget http://vault.centos.org/7.0.1406/updates/Source/SPackages/ntp-4.2.6p5-19.el7.centos.src.rpm

# 尝试直接编译
[root@study ~]# rpmbuild --rebuild /root/ntp-4.2.6p5-19.el7.centos.src.rpm 
warning: user mockbuild does not exist - using root
warning: group mockbuild does not exist - using root
...
error: Failed build dependencies:
        libcap-devel is needed by ntp-4.2.6p5-19.el7.x86_64
        openssl-devel is needed by ntp-4.2.6p5-19.el7.x86_64
        libedit-devel is needed by ntp-4.2.6p5-19.el7.x86_64
        pps-tools-devel is needed by ntp-4.2.6p5-19.el7.x86_64
        autogen is needed by ntp-4.2.6p5-19.el7.x86_64
        autogen-libopts-devel is needed by ntp-4.2.6p5-19.el7.x86_64
# 会告诉你有相依赖的软件未安装,
[root@study ~]# yum install libcap-devel openssl-devel libedit-devel pps-tools-devel autogen autogen-libopts-devel

# 再次尝试编译
[root@study ~]# rpmbuild --rebuild /root/ntp-4.2.6p5-19.el7.centos.src.rpm 
# 会经过一段漫长的时间进行编译
...
Checking for unpackaged file(s): /usr/lib/rpm/check-files /root/rpmbuild/BUILDROOT/ntp-4.2.6p5-19.el7.centos.x86_64
Wrote: /root/rpmbuild/RPMS/x86_64/ntp-4.2.6p5-19.el7.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/noarch/ntp-perl-4.2.6p5-19.el7.noarch.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/ntpdate-4.2.6p5-19.el7.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/sntp-4.2.6p5-19.el7.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/noarch/ntp-doc-4.2.6p5-19.el7.noarch.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/ntp-debuginfo-4.2.6p5-19.el7.x86_64.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.8JAsU0
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd ntp-4.2.6p5
+ /usr/bin/rm -rf /root/rpmbuild/BUILDROOT/ntp-4.2.6p5-19.el7.centos.x86_64
+ exit 0
Executing(--clean): /bin/sh -e /var/tmp/rpm-tmp.Zz7sN6
+ umask 022
+ cd /root/rpmbuild/BUILD
+ rm -rf ntp-4.2.6p5
+ exit 0
# 可以看到上面输出了很多执行脚本和日志,包括输出到的目录
# 编译好的软件就会放置到
[root@study rpmbuild]# ll /root/rpmbuild/RPMS/x86_64/
total 2420
-rw-r--r--. 1 root root  552196 Apr 11 22:27 ntp-4.2.6p5-19.el7.x86_64.rpm
-rw-r--r--. 1 root root 1757652 Apr 11 22:27 ntp-debuginfo-4.2.6p5-19.el7.x86_64.rpm
-rw-r--r--. 1 root root   83060 Apr 11 22:27 ntpdate-4.2.6p5-19.el7.x86_64.rpm
-rw-r--r--. 1 root root   75392 Apr 11 22:27 sntp-4.2.6p5-19.el7.x86_64.rpm

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49

这种方式,一般来说,因为该编译可能会根据你的系统硬件而优化,所以可能效果会好一点点,但是,人类可能感受不到这种优化带来的效果,所以一般不建议使用 SRPM 安装。那么当你找不到你这个 distribution 版本的软件时间,去别的 distribution 下载 SRPM 来安装,这样也算个方向。

一般来说,如果你有需要用到 SRPM 的文件,大部分的原因就是,你需要重新修改里面的某些设置,比如加入某些特殊的功能等。此时就需要将 SRPM 拆开,编辑里面的配置文件,再重新编译。下面来练习这种方式

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

SRPM 含有 source code,那么其中必定有配置文件,所以需要知道 SRPM 在进行编译的时候会用到哪些目录?由于每个用户应该都有能力安装自己的软件,因此 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 封装的文件

TIP

以前只有 root 身份才能使用编译行为,同时源码都会放到 /usr/src/redhat/,如今放置在 /~username/rpmbuild/ 目录下

如果在编译过程中发生不明错误,会再 /tmp 下产生一个相对应的错误文件,可以根据该错误文件进行除错工作。如果编译成功,那么刚刚解压在上述几个目录中的文件都会被清理掉,只剩下/root/rpmbuild/SRPMS/ 中编译好的文件了

由于 SRPM 需要重新编译,所以我们需要 第 21 章中源码所需基础软件 ,不要忘记安装

实践练习:将上个练习下载的 ntp 的 SRPM 软件直接安装到系统中(不要先编译),然后查阅下所有用到的目录有哪些

# 1. 这里使用 root 身份进行安装
[root@study ~]# rpm -ivh ntp-4.2.6p5-19.el7.centos.src.rpm 
Updating / installing...
   1:ntp-4.2.6p5-19.el7.centos        ################################# [100%]
warning: user mockbuild does not exist - using root
warning: group mockbuild does not exist - using root
# 这里的操作,之后,就直接被安装了,可以找到如下的说明,但是和上面的对不上
# 所以笔者这里有点疑惑,到底安装没有?
[root@study SPECS]# rpm -qa | grep ntp
ntpdate-4.2.6p5-29.el7.centos.x86_64


# 2. 查询 /root/rpmbuild 目录
[root@study ~]# ll -l /root/rpmbuild/
total 4
drwxr-xr-x. 2 root root    6 Apr 11 22:27 BUILD
drwxr-xr-x. 2 root root    6 Apr 11 22:27 BUILDROOT
drwxr-xr-x. 4 root root   34 Apr 11 22:27 RPMS
drwxr-xr-x. 2 root root 4096 Apr 11 22:32 SOURCES
drwxr-xr-x. 2 root root   22 Apr 11 22:32 SPECS    # 它最重要
drwxr-xr-x. 2 root root    6 Apr 11 22:24 SRPMS

[root@study ~]# ll -l /root/rpmbuild/{SOURCES,SPECS}
/root/rpmbuild/SOURCES:
total 4324
-rw-rw-r--. 1 root root     559 Dec 20  2014 ntp-4.2.4p7-getprecision.patch
-rw-rw-r--. 1 root root     661 Dec 20  2014 ntp-4.2.6p1-cmsgalign.patch
...

/root/rpmbuild/SPECS:
total 44
-rw-rw-r--. 1 root root 41210 Dec 20  2014 ntp.spec		# 该文件是重点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

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

前一个小节的练习,我们知道在 /root.rembuild/SOURCES 会放置原始文件 (tarball)以及相关的补丁文件(patch file),我们也知道编译需要的步骤大致是 ./configure,make,make check,make install 等,那这些动作就写在 SPECS 目录中的

[root@study ~]# cd /root/rpmbuild/SPECS/
# 1. 这个部分在介绍整个软件的基本相关信息,版本,释出次数等

Summary: The NTP daemon and utilities		# 建议说明这个软件的功能
Name: ntp																# 软件名称
Version: 4.2.6p5												# 软件版本
Release: 19%{?dist}											# 软件的释出次数
# 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												# 源码与多个
....
# ntpbz #802														# 下面是不定文件,就是 PatchN
Patch1: ntp-4.2.6p1-sleep.patch
# add support for dropping root to ntpdate
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
%patch3 -p1 -b .bcast
%patch4 -p1 -b .cmsgalign
......

%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
* Fri Dec 19 2014 CentOS Sources <bugs@centos.org> - 4.2.6p5-19.el7.centos
- rebrand vendorzone

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93

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

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

# 系统整体信息方面

刚刚在 ntp.sepc 中看到的就有以下的重要信息:

  • Summary:软件的主要说明,例如上表中说明了本软件是针对 NTP 的软件功能与工具等
  • Name:软件的名称(最终会是 RPM 文件的名称构成之一)
  • Version:软件的版本(也是 RPM 文件名构成之一)
  • Release:该版本打包的次数说明(也是 RPM 文件名构成之一)。由于我们想要修改下东西,所以将这里的 19%{?dist} 修改为 20.mrcode
  • License:软件的授权模式,看起来涵盖了所有知名的 Open source 授权
  • Group:该软件在安装的时候,主要放置到哪一个软件群组中(yum grouplist 的特点)
  • URL:源码的主要官网
  • SourceN:软件的来源,如果是网络上下载的软件,通常这里一定会有这个信息来告诉大家这个原始文件的来源,此外,如果有多个软件来源,则会以 Source0、Source1... 开处理源码
  • PatchN:作为不定的 patch file,也是可以有多个
  • BuildRoot:作为编译时,该使用哪个目录来暂存中间文件(如果编译过程的目标文件、链接文件等)

上述信息为必须存在的项目,下面的则为可使用的额外设置

  • Requires:如果这个软件还需要其他的软件支持,就必须配置,则当你制作成 RPM 后,系统就会自动去检查,这就是相依属性的主要来源
  • BuildRequires:编译过程中所需要的软件。Requires 指的是安装时需要检查,因为与实际运行有关,而 BuildRequires 则是 编译时 所需要的软件,只有在 SRPM 编译为 RPM 时才会检查的项目

根据上面的设置,最终的文件名会是 {Name}-{Version}-{Release}.{Arch}.rpm 的样式,以我们上面的设置来说,文件名应该会是 ntp-4.2.6p5-20.mrcode.x86_64.rpm

  • %description

    将你的软件做一个简短的说明,这个也是必须的,在使用 rpm -qi 软件名称 出现的一些基础说明就包括这里的设置信息

  • %prep

    pre 这个关键词本就有「在...之前」的含义,因此该项目指「尚未进行设置或安装之前,你要编译完成的 RPM 帮你实现做的事情」,就是 prepare 的简写,它的主要事项有:

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

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

  • %build

    该段落在配置 make 编译称为可执行的程序。会发现在此部分的程序代码,就是 ./configure,make 等项目。一般来说,如果你会使用 SRPM 来进行重新编译的行为,通常就是要重新 ./configure 并给予新的参数设置,于是这部分就可能会修改

  • %install

    编译完成后,就要安装了,也就是类似 Tarball 里面的 make install

  • %files

    这个软件安装的文件都需要写到这里来,也包括目录,以备查验用。此外也可以指定每个文件的类型,包括帮助文件(%doc 后面接的文件) 与配置文件 %config 后面接的文件

  • %changelog

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

    %changelog
    # * 2020-04-11 mrcode <mrcode@mail.mrcode.cn> - 4.2.6p5-20.mrcode
    # 刚开始我如上写的,并没有按他们的规范写,在编译时间就报如下错误了
    [root@study SPECS]# rpmbuild -ba ntp.spec 
    error: bad date in %changelog: 2020-04-11 mrcode <mrcode@mail.mrcode.cn> - 4.2.6p5-20.mrcode
    
    # 所以正确的写入如下
    * Sat Apr 11 2020 Mrcode mrcode<mrcode@mail.mrcode.cn> - 4.2.6p5-20.mrcode
    - only rbuild this SRPM to RPM
    
    1
    2
    3
    4
    5
    6
    7
    8
    9

修改到这里也差不多了,你也应该需要了解这个 ntp.spec 文件有多重要,当我们使用 rpm -q 查询一堆信息时,其实都是这里写入的。下面来了解如果将 SRPM 编译出来

# SRPM 的编译指令(-ba、-bb

要将在 /root/rpmbuild 下的数据编译或则是单纯的打包为 RPM 或 SRPM 时,就需要 rpmbuild 指令与相关选项了,这里介绍两个常用选项

rpmbuild -ba ntp.spec  # 仅编译并同时产生 RPM 与 SRPM 文件
rpmbuild -bb ntp.spec  # 仅编译成 RPM 文件
1
2

这个时候,系统会这样做:

  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 的话,那么最后编译成功的 rpm 文件则会被放置在 ``/root/rpmbuild/RPMS/x86_64` 里面

大概过程如上,最后的结果数据会放置在 RPMS 目录下,我们这个案例中,要同时打包 RPM 与 SRPM,则可以如下操作

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

[root@study SPECS]# find /root/rpmbuild/ -name 'ntp*rpm'
/root/rpmbuild/RPMS/x86_64/ntp-4.2.6p5-19.el7.x86_64.rpm
/root/rpmbuild/RPMS/x86_64/ntpdate-4.2.6p5-19.el7.x86_64.rpm
/root/rpmbuild/RPMS/x86_64/ntp-debuginfo-4.2.6p5-19.el7.x86_64.rpm
/root/rpmbuild/RPMS/x86_64/ntp-4.2.6p5-20.x86_64.rpm
/root/rpmbuild/RPMS/x86_64/ntpdate-4.2.6p5-20.x86_64.rpm
/root/rpmbuild/RPMS/x86_64/ntp-debuginfo-4.2.6p5-20.x86_64.rpm
/root/rpmbuild/RPMS/x86_64/ntp-4.2.6p5-20.mrcode.x86_64.rpm
/root/rpmbuild/RPMS/x86_64/ntpdate-4.2.6p5-20.mrcode.x86_64.rpm
/root/rpmbuild/RPMS/x86_64/ntp-debuginfo-4.2.6p5-20.mrcode.x86_64.rpm
/root/rpmbuild/RPMS/noarch/ntp-perl-4.2.6p5-19.el7.noarch.rpm
/root/rpmbuild/RPMS/noarch/ntp-doc-4.2.6p5-19.el7.noarch.rpm
/root/rpmbuild/RPMS/noarch/ntp-perl-4.2.6p5-20.noarch.rpm
/root/rpmbuild/RPMS/noarch/ntp-doc-4.2.6p5-20.noarch.rpm
/root/rpmbuild/RPMS/noarch/ntp-perl-4.2.6p5-20.mrcode.noarch.rpm
/root/rpmbuild/RPMS/noarch/ntp-doc-4.2.6p5-20.mrcode.noarch.rpm
/root/rpmbuild/SRPMS/ntp-4.2.6p5-20.src.rpm
/root/rpmbuild/SRPMS/ntp-4.2.6p5-20.mrcode.src.rpm

# 就看到一件出现了我们的 20.mrcode 版本的软件了
# 有些文件软件是与硬件等级无关的,所以出现了 ntp-perl-4.2.6p5-20.mrcode.noarch.rpm 的 noarch 软件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38

# 制作一个我们自己的 SRPM 软件

在之前的小节中,我们 编写了软件 main-0.1,把它制作成 main-0.1-1.x86_64.rpm

# 制作源码文件 tarball 产生

我们提供了 main-0.1 版本的软件,并提供了一个 main-0.2 的补丁文件,那么需要这样做:

  • 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/ 目录以及存在了
# 注意,如果 patch 部分报错,建议直接在之前章节中的下载链接下载
[root@study ~]# cd /root/
[root@study main-0.1]# tar -zcf main-0.1.tgz main-0.1
# 记得需要将目录打包
[root@study ~]# tar -ztv -f main-0.1.tgz 
drwxr-xr-x root/root         0 2020-04-12 11:28 main-0.1/
-r-------- root/root      4482 2020-04-12 11:06 main-0.1/cos_value.c
-r-------- root/root       101 2009-06-09 22:23 main-0.1/haha.c
-r-------- root/root       318 2020-04-12 10:58 main-0.1/main.c
-r-------- root/root       188 2020-04-12 10:58 main-0.1/Makefile
-r-------- root/root       186 2020-04-12 10:58 main-0.1/sin_value.c

[root@study ~]# cp main-0.1.tgz /root/rpmbuild/SOURCES/
[root@study ~]# cp main-0.1-to-0.2.patch /root/rpmbuild/SOURCES/
[root@study ~]# cd /root/rpmbuild/SOURCES/
[root@study SOURCES]# ll main-*
-rw-r--r--. 1 root root 9273 412 11:07 main-0.1.tgz
-r--------. 1 root root 1538 412 11:07 main-0.1-to-0.2.patch
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

# 建立 *.spec 的配置文件

这个文件的建立是所有 RPM 制作里面最重要的,需要认真编写。为了方便我们的制作,在 CentOS7 下,vim *.spec 的时候,如果该文件不存在,则会直接给我们一个模板

[root@study SOURCES]# cd /root/rpmbuild/SPECS/
# 下面的内容就是给我们的模板信息
[root@study SPECS]# vim main.spec
Name:
Version:
Release:        1%{?dist}
Summary:

Group:
License:
URL:
Source0:

BuildRequires:
Requires:

%description


%prep
%setup -q


%build
%configure
make %{?_smp_mflags}


%install
make install DESTDIR=%{buildroot}
%files
%doc



%changelog

# 下面开始编写信息
[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:/mrcode.cn/
Source0: main-0.1.tgz							# 文件名一定要正确
Patch0: main-0.1-to-0.2.patch

# BuildRequires:		没有用到的一定要删掉,否则可能还是会识别到,并报错

%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
* Sat Apr 11 2020 Mrcode mrcode<mrcode@mail.mrcode.cn> - 4.2.6p5-20.mrcode
- build the program

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74

# 编译成为 RPM 与 SRPM

前面的 spec 文件建立后,后续的动作就简单了

[root@study ~]# cd /root/rpmbuild/SPECS/

# 上面的 spec 文件太重要了,我是搞了 2 个小时,差不多才搞好
# 有写错命令的,有没有删除空配置项目的

[root@study SPECS]# rpmbuild -ba main.spec 
执行(%prep): /bin/sh -e /var/tmp/rpm-tmp.pZIZNq
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd /root/rpmbuild/BUILD
+ rm -rf main-0.1
+ /usr/bin/gzip -dc /root/rpmbuild/SOURCES/main-0.1.tgz
+ /usr/bin/tar -xf -
+ STATUS=0
+ '[' 0 -ne 0 ']'
+ cd main-0.1
+ /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w .
+ echo 'Patch #0 (main-0.1-to-0.2.patch):'
Patch #0 (main-0.1-to-0.2.patch):
+ /usr/bin/patch -p1 --fuzz=0
+ /usr/bin/cat /root/rpmbuild/SOURCES/main-0.1-to-0.2.patch
patching file cos_value.c
patching file main.c
patching file Makefile
patching file sin_value.c
+ exit 0
执行(%build): /bin/sh -e /var/tmp/rpm-tmp.TXvVHo
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd main-0.1
+ make clean main
rm -f main main.o haha.o sin_value.o cos_value.o
cc    -c -o main.o main.c
cc    -c -o haha.o haha.c
cc    -c -o sin_value.o sin_value.c
cc    -c -o cos_value.o cos_value.c
gcc -o main main.o haha.o sin_value.o cos_value.o -lm
+ exit 0
执行(%install): /bin/sh -e /var/tmp/rpm-tmp.S8b0Xm
+ umask 022
+ cd /root/rpmbuild/BUILD
+ '[' /root/rpmbuild/BUILDROOT/main-0.1-1.el7.x86_64 '!=' / ']'
+ rm -rf /root/rpmbuild/BUILDROOT/main-0.1-1.el7.x86_64
++ dirname /root/rpmbuild/BUILDROOT/main-0.1-1.el7.x86_64
+ mkdir -p /root/rpmbuild/BUILDROOT
+ mkdir /root/rpmbuild/BUILDROOT/main-0.1-1.el7.x86_64
+ cd main-0.1
+ mkdir -p /root/rpmbuild/BUILDROOT/main-0.1-1.el7.x86_64/usr/local/bin
+ install -m 755 main /root/rpmbuild/BUILDROOT/main-0.1-1.el7.x86_64/usr/local/bin
+ /usr/lib/rpm/find-debuginfo.sh --strict-build-id -m --run-dwz --dwz-low-mem-die-limit 10000000 --dwz-max-die-limit 110000000 /root/rpmbuild/BUILD/main-0.1
extracting debug info from /root/rpmbuild/BUILDROOT/main-0.1-1.el7.x86_64/usr/local/bin/main
dwz: Too few files for multifile optimization
/usr/lib/rpm/sepdebugcrcfix: Updated 0 CRC32s, 1 CRC32s did match.
+ /usr/lib/rpm/check-buildroot
+ /usr/lib/rpm/redhat/brp-compress
+ /usr/lib/rpm/redhat/brp-strip-static-archive /usr/bin/strip
+ /usr/lib/rpm/brp-python-bytecompile /usr/bin/python 1
+ /usr/lib/rpm/redhat/brp-python-hardlink
+ /usr/lib/rpm/redhat/brp-java-repack-jars
处理文件:main-0.1-1.el7.x86_64
Provides: main = 0.1-1.el7 main(x86-64) = 0.1-1.el7
Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1
Requires: libc.so.6()(64bit) libc.so.6(GLIBC_2.2.5)(64bit) libc.so.6(GLIBC_2.7)(64bit) libm.so.6()(64bit) libm.so.6(GLIBC_2.2.5)(64bit) rtld(GNU_HASH)
处理文件:main-debuginfo-0.1-1.el7.x86_64
Provides: main-debuginfo = 0.1-1.el7 main-debuginfo(x86-64) = 0.1-1.el7
Requires(rpmlib): rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1 rpmlib(CompressedFileNames) <= 3.0.4-1
检查未打包文件:/usr/lib/rpm/check-files /root/rpmbuild/BUILDROOT/main-0.1-1.el7.x86_64
写道:/root/rpmbuild/SRPMS/main-0.1-1.el7.src.rpm
写道:/root/rpmbuild/RPMS/x86_64/main-0.1-1.el7.x86_64.rpm
写道:/root/rpmbuild/RPMS/x86_64/main-debuginfo-0.1-1.el7.x86_64.rpm
执行(%clean): /bin/sh -e /var/tmp/rpm-tmp.oIpzDR
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd main-0.1
+ /usr/bin/rm -rf /root/rpmbuild/BUILDROOT/main-0.1-1.el7.x86_64
+ exit 0
[root@study SPECS]# 

# 这就编译好了
[root@study SPECS]# ll /root/rpmbuild/RPMS/x86_64/main-*
-rw-r--r--. 1 root root 5428 412 12:25 /root/rpmbuild/RPMS/x86_64/main-0.1-1.el7.x86_64.rpm
-rw-r--r--. 1 root root 4460 412 12:25 /root/rpmbuild/RPMS/x86_64/main-debuginfo-0.1-1.el7.x86_64.rpm

[root@study SPECS]# ll /root/rpmbuild/SRPMS/main-*
-rw-r--r--. 1 root root 3724 412 12:25 /root/rpmbuild/SRPMS/main-0.1-1.el7.src.rpm

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86

# 安装、测试、实际查询

[root@study ~]# yum install /root/rpmbuild/RPMS/x86_64/main-0.1-1.el7.x86_64.rpm 
[root@study ~]# rpm -ql main 
/usr/local/bin/main

[root@study ~]# rpm -qi main 
Name        : main
Version     : 0.1
Release     : 1.el7
Architecture: x86_64
Install Date: Sun Apr 12 12:30:24 2020
Group       : Scientific Support
Size        : 7200
License     : GPLv2
Signature   : (none)
Source RPM  : main-0.1-1.el7.src.rpm
Build Date  : Sun Apr 12 12:25:11 2020
Build Host  : study.centos.mrcode
Relocations : (not relocatable)
URL         : http:/mrcode.cn/
Summary     : Shows sin and cos value.
Description :
This package will let you input your name and calculate sin cos value

# 这就从打包、制作、出来一个自己的软件了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24