使用rpmbuild制作rpm包

参考: https://blog.51cto.com/laoguang/1103628
https://www.cnblogs.com/schangech/p/5641108.html
使用rpmbuild命令根据spec文件来生成rpm包
目录说明:
BUILD:源代码解压以后放的位置,只需提供BUILD目录,具体里面放什么,不用我们管,所以真正的制作车间是BUILD目录。
BUILDROOT:假根,使用install临时安装到这个目录,把这个目录当作根来用的,所以在这个目录下的目录文件,才是真正的目录文件。当打包完成后,在清理阶段,这个目录将被删除。
RPMS:制作完成后的rpm包存放目录,为特定平台指定子目录(i386,i686,ppc)。
SOURCES:收集的源文件,源材料,补丁文件等存放位置。
SPECS:存放spec文件,作为制作rpm包的领岗文件,文件以.spec结尾。
SRPMS:src格式的rpm包位置 ,既然是src格式的包,就没有平台的概念了。

基本格式:rpmbuild [options] [spec文档|tarball包(或者压缩包—以.gz或.xz或.bz2结尾的)|源码包]
options有下面的几种选择:
1.-bp #只执行spec的%pre段(解开源码包并打补丁,即只做准备)
2.-bc #执行spec的%pre和%build 段(准备并编译)
3.-bi #执行spec中%pre,%build与%install(准备,编译并安装)
4.-bl #检查spec中的%file段(查看文件是否齐全)
5.-ba #建立源码与二进制包(常用):即编译后做成*.rpm和*.src.rpm
6.-bb #只建立二进制包(常用):即编译后做成*.rpm
7.-bs #只建立源码包:即只做成*.src.rpm
-tc -ti -ta -tb -ts 的功能类似,只是所需参数由spec文件变成tar包。

### 0.define section               #自定义宏段,这个不是必须的 
### %define nginx_user nginx       #这是我们自定义了一个宏,名字为nginx_user值为nginx,%{nginx_user}引用 
##介绍整个软件的基本相关信息!不论是版本还是释出次数等。
Name:	redis		
Version:	4.0.11	
Release:	1%{?dist}   #发布序列号,标明第几次打包,后面可使用%{release}引用
Summary:	A persistent key-value database  # #软件包简介,最好不要超过50字符 

Group:	Applications/Databases
License:	BSD	  #软件授权方式许可,GPL还是BSD等  
URL:	http://redis.io   
Source0:	%{name}-%{version}.tar.gz  #源代码包,可以带多个用Source1、Source2等源,后面也可以用%{source1}、%{source2}引用,将源文件添加到rpm包
Source1:    redis-4.0.conf 
BuildRoot:	 %{_tmppath}/%{name}-%{version} 
#这个是安装或编译时使用的“虚拟目录”,考虑到多用户的环境,一般定义为:%{_tmppath}/%{name}-%{version}-%{release}-root或%{_tmppath}/%{name}-%{version}-%{release}-buildroot-%(%{__id_u} -n},该参数非常重要,因为在生成rpm的过程中,执行make install时就会把软件安装到上述的路径中,在打包的时候,同样依赖“虚拟目录”为“根目录”进行操作。后面可使用$RPM_BUILD_ROOT 方式引用。
BuildRequires:	tcl >= 8.5   ## #制作过程中用到的软件包
ExcludeArch:      ppc64

Requires:	gcc>=4.4.7, gcc-c++>=4.4.7, zlib-devel>=1.2.3, pcre-devel>=8.12, openssl-devel>=1.0.1e, autoconf>=2.63, automake>=1.11.1
##该rpm包所依赖的软件包名称,可以用>=或<=表示大于或小于某一特定版本,例如:libpng-devel >= 1.0.20 zlib 
#“>=”号两边需用空格隔开,而不同软件名称也用空格分开,还有例如PreReq、Requires(pre)、Requires(post)、Requires(preun)、Requires(postun)、BuildRequires等都是针对不同阶段的依赖指定

%description  #软件的详细说明
Redis is an advanced key-value store. It is similar to memcached but the data
set is not volatile, and values can be strings, exactly like in memcached, but
also lists, sets, and ordered sets. All this data types can be manipulated with
atomic operations to push/pop elements, add/remove elements, perform server side
union, intersection, difference between sets, and so forth. Redis supports
different kind of sorting abilities.

%prep  #预处理脚本,
%setup -q   ##这个宏的作用静默模式解压并cd 
#%patch 打补丁通常补丁都会一起在源码tar.gz包中,或放到SOURCES目录下。一般参数为:
%patch -p1 #使用前面定义的Patch补丁进行,-p1是忽略patch的第一层目录
%Patch2 -p1 -b xxx.patch  #打上指定的补丁,-b是指生成备份文
#%setup -n %{name}-%{version} 把源码包解压并放好
#通常是从/usr/src/asianux/SOURCES里的包解压到/usr/src/asianux/BUILD/%{name}-%{version}中。一般用%setup -c就可以了,但有两种情况:一就是同时编译多个源码包,二就是源码的tar包的名称与解压出来的目录不一致,此时,就需要使用-n参数指定一下了
#%setup 不加任何选项,仅将软件包打开。
#%setup -n newdir 将软件包解压在newdir目录。
#%setup -c 解压缩之前先产生目录。
#%setup -b num 将第num个source文件解压缩。
#%setup -T 不使用default的解压缩操作。
#%setup -T -b 0 将第0个源代码文件解压缩。
#%setup -c -n newdir 指定目录名称newdir,并在此目录产生rpm套件。
#%patch 最简单的补丁方式,自动指定patch level。
#%patch 0 使用第0个补丁文件,相当于%patch ?p 0。
#%patch -s 不显示打补丁时的信息。
#%patch -T 将所有打补丁时产生的输出文件删除。


%build    #编译制作阶段
make MALLOC=libc

%install
rm -fr %{buildroot}   ##先删除原来的安装的,如果你不是第一次安装的话
make  PREFIX=%{buildroot}/usr/local/redis  install   
##编译安装,也可以make install DESTDIR=%{buildroot} 
mkdir -p %{buildroot}/usr/local/redis/conf   #创建文件目录
mkdir -p %{buildroot}/var/log/redis
install -p -D -m 644 %{SOURCE1} %{buildroot}/usr/local/redis/conf/%{name}.conf
#将源文件安装进rpm包,-D表示创建目录,跟mkdir一样,-p:以<来源>文件的访问/修改时间作为相应的目的地文件的时间属性。
#cp /usr/local/redis/redis-5.0.3/redis.conf /usr/local/redis/conf/redis.conf


%pre   #rpm安装前执行的脚本 

%post  ##安装后执行的脚本 
if [ $1 = 1 ];then            #0代表卸载、1代表安装、2代表升级
	echo "export REDIS_HOME=/usr/local/redis" >> /etc/profile  
	echo 'export PATH=$PATH:$REDIS_HOME/bin' >> /etc/profile
	source /etc/profile
fi

%preun  #卸载前执行的脚本
									#
%postun  ##卸载后执行的脚本 
#%preun %postun 的区别是前者在升级的时候会执行,后者在升级rpm包的时候不会执行

%files  # 定义那些文件或目录会放入rpm中,下面的内容要根据你在%{rootbuild}下生成的来写  
/usr/local/redis
/usr/local/redis/conf/
/var/log/redis
#%attr(0775,root,root) /etc/rc.d/init.d/nginx
#%defattr (-,root,root,0755)   #设定默认权限,如果下面没有指定权限,则继承默认 

%clean   #清理临时文件
rm -fr %{buildroot}

%changelog
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值