参考自:https://blog.csdn.net/u010384744/article/details/80929319
https://blog.csdn.net/samxx8/article/details/72050725
系统:centos 6.8 x64
在开始之前,首先我们安装上rpm包制作工具
yum install rpm* rpm-devel rpmdevtools
1,我做的这个只是为了测试,很简单:源程序文件就一个可执行文件,这个可执行文件我命名为a,是有源代码a.c编译而成,a.c源文件为:
#include <stdio.h> main(){ printf("DDDD "); }
2,将这个可执行文件a压缩为tar.gz格式:
tar zcvf aa.tar.gz a
3,在root目录下创建rpmbuild目录以及下属的几个子目录
[userid@hostname ~]$ mkdir -p ~/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}
各个目录的一般用途如下简介:
BUILD 编译rpm包的临时目录
BUILDROOT 编译后生成的软件临时安装目录
RPMS 最终生成的可安装rpm包的所在目录
SOURCES 所有源代码和补丁文件的存放目录
SPECS 存放SPEC文件的目录(重要)
SRPMS 软件最终的rpm源码格式存放路径
4.将aa.tar.gz移动至/root/rpmbuild/SOURCES目录下
5,进入SPECS目录下,编辑.spec配置文件
vi a.spec:
Name:a Version:1.8.1 Release:1%{?dist} Summary:golangBinnary #Group: system License:GPL Distribution:Red Hat Linux #URL:http://golang.org #Source0:aa.tar.gz Requires:glibc,python >= 2.4,/usr/bin/python,libc.so.6(GLIBC_2.11)(64bit),rpm >= 0:4.1.1,python(abi) = 2.6,yum >= 3.2.29 Autoreq:0 %define userpath /usr/bin %description a 1.8.1 #%prep #tar -xzvf ${RPM_SOURCE_DIR}/go1.8.1.linux-amd64.tar.gz %install install -d $RPM_BUILD_ROOT%{userpath} tar -C $RPM_BUILD_ROOT%{userpath} -xzf ${RPM_SOURCE_DIR}/aa.tar.gz #sudo tar -C /usr/local -xzf ${RPM_SOURCE_DIR}/aa.tar.gz #sudo cp -r ${RPM_SOURCE_DIR}/go /usr/local/ #export PATH=$PATH:/usr/local/go/bin %files %defattr(-,root,root,-) %doc %{userpath}/ %changelog
其中要特别注意到,我在里面定义了
Requires:glibc,python >= 2.4,/usr/bin/python,libc.so.6(GLIBC_2.11)(64bit),rpm >= 0:4.1.1,python(abi) = 2.6,yum >= 3.2.29
这个是我随便定义的,目的是为了说明,为甚拿到一个rpm以后,linux系统就能知道这个rpm包依赖哪些CAPABILITY?(我这里没说依赖哪些包,而说是依赖哪些capability,是因为确实包依赖的单位是capability,而不是包,只不过每个capability背后都对应的一个包,依赖某capability相当于依赖提供这个capability的包)是因为在制作rpm包的时候,就已经把依赖关系写景这个.spec文件中了
6,万事具备,只差最后生成
rpmbuild -bb a.spec
最终我们看到生成的rpm包在RPMS目录下。
[root@localhost x86_64]# pwd /root/rpmbuild/RPMS/x86_64 [root@localhost x86_64]# ls a-1.8.1-1.el6.x86_64.rpm repodata
我们来验证一下,这个rpm包的依赖关系是不是正如我们定义的那样
[root@localhost x86_64]# rpm -qpR a-1.8.1-1.el6.x86_64.rpm
glibc
python >= 2.4
/usr/bin/python
libc.so.6(GLIBC_2.11)(64bit)
rpm >= 0:4.1.1
python(abi) = 2.6
yum >= 3.2.29
rpmlib(FileDigests) <= 4.6.0-1
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
rpmlib(CompressedFileNames) <= 3.0.4-1
rpmlib(PayloadIsXz) <= 5.2-1
我们注意到,在依赖关系列表中,除了我们定义的那几个capability,怎么还有以下四个?(这个问题可以参考我另一篇文章https://www.cnblogs.com/saolv/p/9727309.html)
rpmlib(FileDigests) <= 4.6.0-1
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
rpmlib(CompressedFileNames) <= 3.0.4-1
rpmlib(PayloadIsXz) <= 5.2-1
因为这个rpm包是在我这个系统是制作的,我这个系统是centos6.8 x64,我们知道rpm包管理工具是在不断迭代的,比如相对于centos5的rpm包管理工具来说,新版的rpm使用了新的file digest algorithms 和 compression algorithms(压缩算法),比如这个压缩算法应该是rpmlib(PayloadIsLzma) ,而centos5的rpm包管理工具是不支持此算法的,所以,在centos6上制作的rpm包,用centos5的rpm进行安装,是无法安装上的,除非,centos5的rpm是新版的,
我们看到,在centos5安装那个在centos6上制作的rpm包时,无法安装,除了缺少新版的yum,python,libc以为,还缺少
rpmlib(FileDigests)
rpmlib(PayloadIsXz)
这两个,这就是centos6的rpm启用了新的digest algorithm以及新的payloadlsxz不知道什么东西,而我们注意到,centos5并不缺
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
rpmlib(CompressedFileNames) <= 3.0.4-1
这两个,说明,centos5系统的rpm是有这两个的。
所以,当我们用制作rpm包的时候,相关命令会自动将当前rpm管理工具所支持的特性添加进依赖关系中,这样,我们在旧的系统上安装此rpm包时,安装不上了就能知道是由于当前系统的rpm管理工具版本太低,我们要么直接升级rpm管理工具,要么换个老版本的安装