参考自: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. 第三十一篇-TextInputLayout(增强文本输入)的使用

    效果图: 密码使用的是增强文本输入类型,当密码长度小于6或者密码长度大于10的时候就会给出提示. main.xml 当添加TextInputLayout时,旁边会有一个下载符号,如果点不动,可以右键点 ...

  2. 第二十九篇-Fragment动态用法

    效果图: 上节学习了静态添加Fragment的方法,这节学习动态添加方法. 主页面 layout.xml Fragment页面 layout2.xml 实现功能,当点击主页面的button时,将Fra ...

  3. tomcat部署-手动启动tomcat部署,添加网页,

    公司的内网什么都不能往外传,于是自己用公司的网络搭了一个网页,在网上抄了一堆upload,用来来回传输数据.... 但是每次用ideaJ启动服务器太费时. 研究了一下怎么手动启动tomcat,部署网页 ...

  4. HTTP之Content-Type

    前言:HTTP/1.1 HTTP/1.1 协议规定的 HTTP 请求方法有OPTIONS.GET.HEAD.POST.PUT.DELETE.TRACE.CONNECT 这几种. 其中 POST 一般用 ...

  5. 关于Tcpdump抓包总结

    一.简介 tcpdump是一个用于截取网络分组,并输出分组内容的工具.凭借强大的功能和灵活的截取策略,使其成为类UNIX系统下用于网络分析和问题排查的首选工具 tcpdump提供了源代码,公开了接口, ...

  6. vue初始化页面dom操纵 $nextTick

    new Vue({ el: '#app', data:{ }, mounted: function () {/*生命周期函数*/ this.$nextTick(function () { $(&quo ...

  7. JDBC工具类

    package com.shundong.uitl; import java.sql.Connection; import java.sql.DriverManager; import java.sq ...

  8. python对象的多重继承

    一个从多个父类继承过来的子类,可以访问所有父类的功能.并不推荐使用. 多重继承最简单有用的形式是mixin.假设在之前Contact类增加一个功能,允许给self.email发送一封邮件. class ...

  9. social-auth-app-django集成第三方登录

    GitHub:https://github.com/python-social-auth/social-app-django 官网文档:http://python-social-auth.readth ...

  10. Linux进程和任务管理

    process 进程 进程-线程等 Job 前台--后台: 后台任务"与"前台任务"的本质区别只有一个:是否继承标准输入 联机--脱机 -以及crontab 脱机管理主要 ...