参考自: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. 都是分号惹的祸 ORA-00911

    使用JMeter连接oracle数据库,访问JDBC 请求,执行结果提示:ORA-00911: ??Ч??? 意思为无效的字符错误 说明了在执行的的SQL语句中出现了无效字符,所以在AQL语句无法通过 ...

  2. hdu 3530 "Subsequence" (单调队列)

    传送门 题意: 给出一个序列,求最长的连续子序列,使得 m ≤ Max-Min ≤ k 我的理解: 定义数组 a[] 存储输入的 n 个数: 定义两个双端队列: deque<int >qM ...

  3. bzoj 4326: NOIP2015 运输计划(二分+树链剖分)

    传送门 题解: 树链剖分快速求解任意两点间的路径的权值和: 然后,二分答案: 此题的难点是如何快速求解重合路径? 差分数组可以否??? 在此之前先介绍一下相关变量: int fa[maxn]; int ...

  4. 原生JS正则实现trim()

    Jquery中封装有trim() 原生需要自己实现,我们可以用原型的方式自己封装trim()方法,实现去掉前后空格.前空格.后空格...所以不必抱怨,简单又灵活,这才是强大的JS的特色 String. ...

  5. JavaBean+Servlet 开发时,JavaBean 编写问题

    在开发 JavaBean 时,遇见一个问题: *****  表单字段为空,提交时出现 nullPointerException 异常:  表单字段不为空,提交正常. 使用 JavaBean ,JSP页 ...

  6. 22. Generate Parentheses(ML)

    22. Generate Parentheses . Generate Parentheses Given n pairs of parentheses, write a function to ge ...

  7. urllib 学习二

    编码解码: python2 用法: urllib.urlencode() 编码 urlparse.parse_qs() 解码 python3 用法: urllib.parse.urlencode() ...

  8. 入侵检测中需要监控的注册表路径研究(Windows Registry Security Check)

    1. Windows注册表简介 注册表(Registry,繁体中文版Windows称之为登录档)是Microsoft Windows中的一个重要的数据库,用于存储系统和应用程序的设置信息.早在Wind ...

  9. 6.适配器模式(Adapter Pattern)

    适配(转换)的概念无处不在......适配,即在不改变原有实现的基础上,将原先不兼容的接口转换为兼容的接口.例如:二转换为三箱插头,将高电压转换为低电压等.    动机(Motivate):    在 ...

  10. js实现table用鼠标改变td的宽度,固定table宽度和高度超过显示点

    <!DOCTYPE HTML> <html> <head> <meta charset="gbk"> <title>ta ...