自制rpm包

  • 前言
要想制作一个rpm软件包就必须写一个软件包描述文件(SPEC)。这个文件中包含了软件包的诸多信息,
如软件包的名字、版本、类别、说明摘要、创建时要执行什么指令、安装时要执行什么操作、以及软件包所要包含的文件列表等等。
  • 安装rpmbuild命令
yum install rpm-build redhat-rpm-config make gcc
  • 创建RPM构建环境
mkdir -p ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
echo '%_topdir %(echo $HOME)/rpmbuild' > ~/.rpmmacros
  •  nginx.sqec示例
%define nginx_home /usr/local/nginx   #userpath /var/www/html/demo
Summary: nginx 1.17.5   #软件包的内容概要
Name: nginx-waf1.17.5 #软件包的名字,最终RPM软件包是用该名字与版本号,释出号及体系号来命名软件包的
Version: 1.17.5  #版本
Release: 2%{?dist}  #布序列号,标明第几次打包,后面可使用%{release}引用
License: GPL #软件授权方式,通常是GPL(自由软件)或GPLv2,BSD
Group: Applications/System  #软件包所属类别  应用/系统
Source0: nginx-1.17.5.tar.gz  #源码包名称(可以使用URL),可以用SourceN指定多个,如配置文件
Source1: nginx-waf.conf
Source2: ingress-healthcheck.conf
Source3: mod 
BuildRoot: %{_tmppath}/nginx-%{version}-%{release}-root  #这个是安装或编译时使用的“虚拟目录”,考虑到多用户的环境,一般定义为:%{_tmppath}/%{name}-%{version}-root
BuildRequires:  gcc,make #定义构建时依赖的软件包,在构建机器编译 rpm 包时需要的辅助工具,以逗号分隔。假如,要求编译 myapp 时,gcc 的版本至少为 4.4.2,则可以写成 gcc >=4.2.2
Requires:       pcre,pcre-devel,openssl  #定义安装时的依赖包,该 rpm 包所依赖的软件包名称,就是指编译好的 rpm 软件在其他机器上安装时,需要依赖的其他软件包
%description  #软件的详细说明

%prep #这个段是预处理段,通常用来执行一些解开源程序包的命令,为下一步的编译安装作准备
%setup -q -n  nginx-1.17.5  #%setup -n %{name}-%{version} 把源码包解压并放好 通常是从/usr/src/asianux/SOURCES里的包解压到/usr/src/asianux/BUILD/%{name}-%{version}中

%build  #开始构建包 在/usr/src/asianux/BUILD/%{name}-%{version}目录中进行make的工作 ,常见写法make %{?_smp_mflags} OPTIMIZE="%{optflags}"
patch -p1 < /root/rpmbuild/SOURCES/nginx_upstream_check_module-master/check_1.12.1+.patch #%patch -p1 使用前面定义的Patch补丁进行,-p1是忽略patch的第一层目录 此时,patch会忽略掉第1个”/”之前的内容,认为原始文件是 ./A,
./configure --prefix=/usr/local/nginx --with-http_sub_module --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module --add-module=/root/rpmbuild/SOURCES/nginx-sticky-module-1.1 --add-module=/root/rpmbuild/SOURCES/nginx_upstream_check_module-master --add-module=/root/rpmbuild/SOURCES/ngx_devel_kit-0.3.0rc1 --add-module=/root/rpmbuild/SOURCES/lua-nginx-module-0.10.13 --add-module=/root/nginx-module-vts-0.1.18 --with-ld-opt="-Wl,-rpath,/usr/local/luajit/lib" --with-stream
make

%install  #开始把软件安装到虚拟的根目录中,本段是安装段,其中的命令在安装软件包时将执行
rm -rf %{buildroot}
make install DESTDIR=%{buildroot} 
mkdir %{buildroot}%{nginx_home}/conf/conf.d
%{__install} -p -D %{SOURCE1} %{buildroot}%{nginx_home}/conf/nginx.conf 
%{__install} -p -D %{SOURCE2} %{buildroot}%{nginx_home}/conf/ingress-healthcheck.conf
cp -r %{SOURCE3} %{buildroot}%{nginx_home}/conf/

%post #脚本区域增加
cat <<EOF > /lib/systemd/system/nginx.service
[Unit]
Description=nginx
After=network.target
  
[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true
LimitNOFILE=65500
  
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable nginx


%preun #卸载前执行的脚本
systemctl stop nginx

%postun # 卸载后执行的脚本 %preun %postun 的区别前者在升级的时候会执行,后者在升级rpm包的时候不会执行
systemctl disable nginx
rename nginx nginx.`date +%Y%m%d` %{nginx_home}

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

%files #定义那些文件或目录会放入rpm中
%defattr(-,root,root,-) #指定包装文件的属性
/usr/local/nginx/
%config(noreplace) /usr/local/nginx/conf/*  #表明这是个配置文件noplace表明不能替换
  • 打包命令
rpmbuild -bb nginx.spec
  • 文档
https://www.cnblogs.com/schangech/p/5641108.html
https://blog.csdn.net/zhangmeimei_pku/article/details/79483692
http://dries.eu/rpms/python-ethtool/python-ethtool
https://www.cnblogs.com/sunshine-long/p/9809042.html
https://blog.csdn.net/it_way/article/details/17559369description
https://www.ibm.com/developerworks/cn/linux/l-rpm/
https://wiki.centos.org/HowTos/SetupRpmBuildEnvironment
原文地址:https://www.cnblogs.com/jiaqili/p/14279793.html