制作RPM包:rpmbuild

参考:

 


 
#前期准备:       yum -y install rpmdevtools pcre-devel   
#-------------------------------------------------------
# 查看默认宏:   rpmbuild --showrc  |  grep  "_topdir"
#  _builddir      %{_topdir}/BUILD
#  _buildrootdir %{_topdir}/BUILDROOT
#  _rpmdir       %{_topdir}/RPMS
#  _sourcedir    %{_topdir}/SOURCES    --->  原材料,如源码包,文档所在目录,需事先将打包的源文件或脚本存放在此目录内......
#  _specdir      %{_topdir}/SPECS   --->  管理rpm制作过程的描述文件所在的目录
#  _srcrpmdir    %{_topdir}/SRPMS
#  _topdir        %{getenv:HOME}/rpmbuild   --->  rpmbuild目录的顶层入口
#-------------------------------------------------------
#生成~/rpmbuild及子目录:    rpmdev-setuptree
#生成rpmbuild的spec模板:    rpmdev-newspec -o Name-version.spec  --->   生成的SPEC文件主要用于描述RPM包的制作和生成过程
#eg:
#[root@localhost ~]#  rpmdev-setuptree && cd rpmbuild ; tree
#.
#├── BUILD
#├── RPMS
#├── SOURCES
#├── SPECS
#└── SRPMS
#------------------------------------------------------------------------------------------------------------------------- 以下是spec文件内容:
 
#自定义宏,相当于Linux中"Key-Value"变量形式
%define Name nginx  #--->  名称
%define Version 1.2.2  #--->  版本
%define CONFIGFILE 1.conf   #--->   本rpm包中需更换的配置文件......
%define InstallPath /usr/local/nginx  #--->   本rpm包默认安装的路径
 
#定义软件包信息,即:"rpm -qi name.rpm " 查看到的内容
Name:           %{Name}   #--->   引用宏
Version:        %{Version}   #--->   引用宏
Release:        1%{?dist}   #--->   引用宏(自带宏)
Summary:        ....................................... #--->  一些描述信息
License:        GPLv2  #--->  授权协议
URL:            inmoonlight@.163.com
buildroot:      %{_topdir}/BUILDROOT   #--->  指定生产车间(非常重要,因在生成rpm过程中执行make install时会把软件安装到此路径,打包时同样依此目录为“根目录”进行操作)
Source0:        %{Name}-%{Version}.tar.gz   #---> 指定源码编译的文件,默认路径:%{_topdir}/SOURCES  
SOURCE1:        %{CONFIGFILE}  #---> 指定要替换的配置文件,默认路径:%{_topdir}/SOURCES  
BuildRequires:      gcc,make,automake,binutils  #--->  软件依赖信息
Requires:      bash >= 2.0 #--->  定义软件依赖信息,该rpm包所依赖的软件包名称,可用>=或<=表示大或小于特定版本
%description
This is %{Name} .....Just a test rpm suite.............
 
#安装前的准备工作,此处可写入执行脚本
%pre
useradd %{Name} -s /sbin/nologin
 
#安装前的准备:此段默认将Source目录内的源码包在BUILD目录解压为%{Name}-%{Version}格式的目录
%prep
%setup -q -n %{Name}-%{Version}  #---> 参数:-c 解压缩之前先产生目录,-n newdir 将软件包解压在newdir目录
 
#定义config动作
%build
./configure --prefix=%{InstallPath} --user=%{Name} --group=%{Name} 
make %{?_smp_mflags}
 
#定义执行make install时的动作
%install
rm -rf %{buildroot} #---> 删除生产车间内的残留文件
%{__make} install DESTDIR=%{buildroot} #---> 将软件安装至指定的目录
%{__install} -p -D -m 0755  %{SOURCE1} %{buildroot}/usr/local/nginx/conf/%{CONFIGFILE} #--->  替换指定的配置文件
 
#赋予文件的默认权限及设置需在RPM包中保留的文件
%files
%doc
%defattr(-,root,root,-)  #---> 指定包装文件属性,分别是(mode,owner,group),- 表示默认值,文本文件是0644,可执行文件0755
%attr(0755,root,root) /usr/local/nginx/sbin/nginx  #--->  针对单一文件设置权限
%{_prefix}/*
%{_prefix}/local/nginx/conf/%{CONFIGFILE}
 
#制作完成后的清理工作
%clean
rm -rf %{buildroot}
 
#安装后的执行工作,此处可写入执行脚本
%post
chkconfig --add nginx
chkconfig --level 345 nginx on
 
#变更日志
%changelog
 
#---------------------------------------------------------------------------------------------
#    2.1 介绍区域的SOURCE0下增加如下
#    Source0:        %{name}-%{version}.tar.gz 
#    Source1:        index.html 
#    Source2:        init.nginx 
#    Source3:        fastcgi_params 
#    Source4:        nginx.conf 
 
#    2.2 安装区域增加如下
#    make install DESTDIR=%{buildroot} 
#    %{__install} -p -D %{SOURCE1} %{buildroot}/usr/html/index.html  #%{__install}这个宏代表install命令
#    %{__install} -p -D -m 0755 %{SOURCE2} %{buildroot}/etc/rc.d/init.d/nginx 
#    %{__install} -p -D %{SOURCE3} %{buildroot}/etc/nginx/fastcgi_params 
#    %{__install} -p -D %{SOURCE4} %{buildroot}/etc/nginx/nginx.conf 
 

 
将脚本制作成为RPM包的例子:
 
Name: eee
Version: 1
Release: 1%{?dist}
Summary:1111
 
License:GPLv2
URL:    inmoonlighy.11.cn
Source0: eee
 
%description
.....
 
%install
rm -rf %{buildroot}
mkdir -p %{buildroot}/bin/
cp -rf  %{SOURCE0} %{buildroot}/bin
 
%files
/bin/eee
 
%changelog
 
#注:安装时失败应加“rpm -ivh --force ***.rpm 进行尝试”
#---------------------------------------------------------------------------------------------
#rpmbuild:
#    -bl          检查spec中的%file段来查看文件是否齐全
#    -ba         建立二进制包&源码
#    -bb         建立二进制包
#    -bp        执行到 prep 阶段
#    -bc         执行到 build 阶段
#    -bi         执行到 install 阶段
#制作:    cd /usr/src/redhat/SPECS/ ; rpmbuild -ba nginx.spec   --> 生成:/usr/src/redhat/RPMS/i386/nginx-1.2.1-1.el5.ngx.i386.rpm
#测试:    rpm -ivh /usr/src/redhat/RPMS/i386/nginx-1.2.1-1.el5.ngx.i386.rpm
posted @ 2017-03-07 09:38  bluevitality  阅读(1927)  评论(0编辑  收藏  举报