参考自: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\n");
}

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.
Release:%{?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.(GLIBC_2.)(64bit),rpm >= :4.1.,python(abi) = 2.6,yum >= 3.2.
Autoreq: %define userpath /usr/bin %description
a 1.8. #%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.-.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管理工具,要么换个老版本的安装

自制rpm包的更多相关文章

  1. 其他综合-搭建本地yum仓库及自制rpm包

    搭建本地yum仓库及自制rpm包 实验目的 为方便本地 yum 的管理,建本地 yum 仓库,实现局域网内部快速安装常用软件 实验环境 VMware:12版本 系统版本:CentOS Linux re ...

  2. 根据某个文件或文件夹自制rpm包

    首先安装打包软件# yum install rpmbuild  rpmdevtools -y 生成打包路径1.使用rpmdev-setuptree ,会自动在用户家目录生成一个rpmbuild的文件夹 ...

  3. 自制mysql的rpm包

    MySQL安装一般使用RPM或者源码安装的方式.RPM安装的优点是快速,方便.缺点是不能自定义安装目录.如果需要调整数据文件和日志文件的存放位置,还需要进行一些手动调整.源码安装的优点是可以自定义安装 ...

  4. 解决安装rpm包依赖关系的烦恼 - yum工具介绍及本地源配置方法

    版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...

  5. php-7.1.0 rpm包制作

    nginx-1.8.0 rpm包制作见上篇文章:http://www.cnblogs.com/xiaoming279/p/6251149.html spec文件 Name: php Version: ...

  6. nginx-1.8.0 rpm包制作

    1.安装rpm-build # yum install rpm-build 2.创建制作RPM包目录 # cat /root/.rpmmacros %_topdir /root/rpmbuild %_ ...

  7. 【CentOS】安装RPM包或者源码包

    一.rpm  (是Redheat Package Manager的简称) 如果光驱中还有系统安装盘的话, 1.先挂载光驱, mount /dev/cdrom /mnt/ 2.cd /mnt/ 3.cd ...

  8. RPM包制作教程

    一.RPM介绍 RPM 前是Red Hat Package Manager 的缩写,本意是Red Hat 软件包管理,顾名思义是Red Hat 贡献出来的软件包管理:现在应为RPM Package M ...

  9. CentOS使用yum源中自带的rpm包安装LAMP环境

    CentOS使用yum源中自带的rpm包安装LAMP环境.这是Linux下安装LAMP的环境一种最基本最简便的方式.新手可以从容安装使用. 1. 安装基础包(可选安装)yum install -y w ...

随机推荐

  1. [NOIP2018]旅行(数据加强版)(图论+基环树)

    数据范围多了2个0就是不一样,O(n^2)只能68分了.(其中60分是n=m+1和原题一样的做法送的),这题直接从NOIP难度变为NOI Plus难度了不说废话直接写题解:首先dfs一遍找到环,然后和 ...

  2. Tomcat如何发布web项目

    tomcat/webapps目录是用来存放Java项目的.每一个文件夹都是一个项目,默认这个目录下已经有了四个项目,都是tomcat自带的. 其中ROOT就是我们测试Tomcat时访问的Tomcat的 ...

  3. 每天一个Linux命令 (转)

    一. 文件目录操作命令: 1.每天一个linux命令(1):ls命令 2.每天一个linux命令(2):cd命令  3.每天一个linux命令(3):pwd命令 4.每天一个linux命令(4):mk ...

  4. c/c++ 大于等于 大于 时间效率比较

    变成汇编,都是: 大于等于和大于都是电路上的处理,时间上应该差不多.

  5. Nginx上部署HTTPS + HTTP2

    Nginx上部署HTTPS依赖OpenSSL库和包含文件,即须先安装好libssl-dev(或者OpenSSL),且ln -s /usr/lib/x86_64-linux-gnu/libssl.so ...

  6. Python基础语法总结

    1.Python标识符 在 Python 里,标识符有字母.数字.下划线组成. 在 Python 中,所有标识符可以包括英文.数字以及下划线(_),但不能以数字开头. Python 中的标识符是区分大 ...

  7. js或jQuery获取当前屏幕的各种高度

    Javascript: 网页可见区域宽: document.body.clientWidth网页可见区域高: document.body.clientHeight网页可见区域宽: document.b ...

  8. PHP操作cookie

    1.当只有一个参数的时候,默认是删除,响应报文里面设置了一个过去的时间 setcookie('key2'); 2.当有两个参数的时候,是设置cookie setcookie('key','value1 ...

  9. Qt ------ 在 ubuntu 内安装 Qt creator

    官网介绍:https://wiki.qt.io/Install_Qt_5_on_Ubuntu Contents [hide]  1Install Qt 5 on Ubuntu 1.1Introduct ...

  10. 图论分支-Tarjan初步-割点和割边

    所谓割点(顶)割边,我们引进一个概念 割点:删掉它之后(删掉所有跟它相连的边),图必然会分裂成两个或两个以上的子图. 割边(桥):删掉一条边后,图必然会分裂成两个或两个以上的子图,又称桥. 这样大家就 ...