制作RPM包:rpmbuild
参考:
- http://hlee.iteye.com/blog/343499
- http://www.cnblogs.com/schangech/p/5641108.html
- http://blog.chinaunix.net/uid-23069658-id-3944462.html
- https://www.lvtao.net/tool/linux-rpm.html
- https://yq.aliyun.com/articles/27261
#前期准备: 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