自制rpm包
参考自: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包的更多相关文章
- 其他综合-搭建本地yum仓库及自制rpm包
搭建本地yum仓库及自制rpm包 实验目的 为方便本地 yum 的管理,建本地 yum 仓库,实现局域网内部快速安装常用软件 实验环境 VMware:12版本 系统版本:CentOS Linux re ...
- 根据某个文件或文件夹自制rpm包
首先安装打包软件# yum install rpmbuild rpmdevtools -y 生成打包路径1.使用rpmdev-setuptree ,会自动在用户家目录生成一个rpmbuild的文件夹 ...
- 自制mysql的rpm包
MySQL安装一般使用RPM或者源码安装的方式.RPM安装的优点是快速,方便.缺点是不能自定义安装目录.如果需要调整数据文件和日志文件的存放位置,还需要进行一些手动调整.源码安装的优点是可以自定义安装 ...
- 解决安装rpm包依赖关系的烦恼 - yum工具介绍及本地源配置方法
版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...
- php-7.1.0 rpm包制作
nginx-1.8.0 rpm包制作见上篇文章:http://www.cnblogs.com/xiaoming279/p/6251149.html spec文件 Name: php Version: ...
- nginx-1.8.0 rpm包制作
1.安装rpm-build # yum install rpm-build 2.创建制作RPM包目录 # cat /root/.rpmmacros %_topdir /root/rpmbuild %_ ...
- 【CentOS】安装RPM包或者源码包
一.rpm (是Redheat Package Manager的简称) 如果光驱中还有系统安装盘的话, 1.先挂载光驱, mount /dev/cdrom /mnt/ 2.cd /mnt/ 3.cd ...
- RPM包制作教程
一.RPM介绍 RPM 前是Red Hat Package Manager 的缩写,本意是Red Hat 软件包管理,顾名思义是Red Hat 贡献出来的软件包管理:现在应为RPM Package M ...
- CentOS使用yum源中自带的rpm包安装LAMP环境
CentOS使用yum源中自带的rpm包安装LAMP环境.这是Linux下安装LAMP的环境一种最基本最简便的方式.新手可以从容安装使用. 1. 安装基础包(可选安装)yum install -y w ...
随机推荐
- anaconda的安装教程和使用方法
一.anaconda安装方法: 1.下载: anaconda官方下载地址:https://www.anaconda.com/download/ 2.安装: 可以自己指定路劲,也可以选择默认安装,最后记 ...
- error:crosses initialization of ...
switch(c) { case 0x01: int temp = a + b; .... break; case 0x02: break; default:break; } 此时会报如题所示错误 原 ...
- phpstudy vhosts.conf 文件配置 记录下!
<VirtualHost _default_:80>DocumentRoot "D:\phpStudy\WWW" <Directory "D:\phpS ...
- Jquery Mobile表单
三个前提: 1.每个form必须设置method和action属性 2.每个form必须有页面范围内唯一的id标识 3.每个form必须有一个label标签,通过设置它的for属性来匹配元素的id & ...
- Traffic Management Gym - 101875G
题意: 有n辆车,在一条直线上运动,给定位置和速度.如果后车追上前车,则后车不会超车,而已变成前车的速度前进,问最后一次上述车速变化发生在何时. 思路: 假设有一下车辆,数字代表移动速度,具体位置未知 ...
- WPF界面+halcon生成的C#文件
1.新建WPF应用程序完成后,解决方案资源管理器——引用处右键,添加引用如下两个dll 工具箱,空白处右键,选择项(只添加halcondotnet.dll,位置同上).这样halcon平台的控件就添加 ...
- Luogu P4015 运输问题
题目链接 \(Click\) \(Here\) 继续颓网络流\(hhhhh\),虽然这次写的是个大水题,但是早上水一个网络流果然还是让人心情舒畅啊- 最大费用最大流不用非得反着费用建边.只要没有正环, ...
- (栈)leetcode 946. Validate Stack Sequences
Given two sequences pushed and popped with distinct values, return true if and only if this could ha ...
- 基于RBAC模型的权限系统设计(Github开源项目)
RBAC(基于角色的访问控制):英文名称Rose base Access Controller.本博客介绍这种模型的权限系统设计.取消了用户和权限的直接关联,改为通过用户关联角色.角色关联权限的方法来 ...
- Linux truncate的使用方法介绍
Linux truncate的使用方法介绍 参考资料:https://www.fengbohello.top/archives/linux-truncate 本命令缩减或扩充指定文件的大小为指定值.参 ...