环境说明

  • centos7/8
  • rpmbuild
  • rpmdev-setuptree
# 用于安装制作rpm包的文件
yum install rpm-build rpmdevtools

制作拥有自定义目录的rpm包

生成对应的目录结构

rpmdev-setuptree
# 默认将使用用户家目录创建对应文件
rpmbuild/
|-- BUILD
|-- RPMS
|-- SOURCES
|-- SPECS
|-- SRPMS
# 若要修改默认创建位置,修改如下即可
[root@centos8 ~]# cat ~/.rpmmacros

%_topdir %(echo $HOME)/rpmbuild

%__arch_install_post \
    [ "%{buildarch}" = "noarch" ] || QA_CHECK_RPATHS=1 ; \
    case "${QA_CHECK_RPATHS:-}" in [1yY]*) /usr/lib/rpm/check-rpaths ;; esac \
    /usr/lib/rpm/check-buildroot

将自己需要打包为RPM包的文件放置在SOURCE目录下面

其实放置在任何可以访问的目录都可以,只不过我们为了方便,而且不需要编译

  • 放置文件后的rpmbuild目录内容如下,这是非常规目录:

你希望最终安装的时候希望自己的软件在什么位置,这个就放在什么位置,本例子中,希望python368目录放置在/opt下面

rpmbuild
|-- BUILD
|-- RPMS
|-- SOURCES
|   `-- opt
|       `-- python368
|           |-- bin
|           |   `-- python368.sh
|           `-- lib
|               `-- libs.info
|-- SPECS
|-- SRPMS
  • tips
  • BUILD:源代码解压以后放的位置,只需提供BUILD目录,具体里面放什么,不用我们管,所以真正的制作车间是BUILD目录。
  • BUILDROOT:假根,使用install临时安装到这个目录,把这个目录当作根来用的,所以在这个目录下的目录文件,才是真正的目录文件。当打包完成后,在清理阶段,这个目录将被删除。
  • RPMS:制作完成后的rpm包存放目录,为特定平台指定子目录(i386,i686,ppc)。
    SOURCES:收集的源文件,源材料,补丁文件等存放位置。
  • SPECS:存放spec文件,作为制作rpm包的领岗文件,文件以.spec结尾。
  • SRPMS:src格式的rpm包位置 ,既然是src格式的包,就没有平台的概念了

对我们来说最重要的就是那个BUILDROOT目录了

创建对应的spec文件

**使用rpmbuild --showrc**可以查看所有的默认宏定义哦

cd SPEC # 但其实放置在任何位置都可以的,只不过为了规范点,但实际上我们这样使用自定义目录打包本身就是不规范,适合内部软件打包使用,不适合发布此类rpm包,如要发布,请遵循Linux本身的目录规则进行打包
vim test.spec
Name:test
Version:1.0
Release:0%{?dist}
Summary: test
Group:test
License:GPL
AutoReqProv: no
BuildRoot:%(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)
%description -l zh_CN
"the tools for test"
%prep
echo "do not"
%install
cd %{_sourcedir} # ~/rpmbuild/SOURCE
cp -ar * %{buildroot}/  # 这个就是假根了 ~、rpmbuild/BUILDROOT
%files
/opt/python368 # 要打包的内容,此处理解为将假根下面的所有文件打包,因为我们的目录本身不太符合规范,不然检查的时候过不去的
%postun
rm -rf /opt/python368

可能你会有一问为什么没有configure和build的过程,因为我们不需要呀!!!

rpmbuild 进行打包

rpmbuild -bb test.spec
...
Wrote: /root/rpmbuild/RPMS/x86_64/test-1.0-0.el8.x86_64.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.JmRmdt
+ umask 022
+ cd /root/rpmbuild/BUILD
+ /usr/bin/rm -rf /root/rpmbuild/BUILDROOT/test-1.0-0.el8.x86_64
+ exit 0
# 一般这样打包成功了

让我们再看看此时的目录结构

[root@centos8 ~]# tree rpmbuild
rpmbuild
|-- BUILD
|   `-- opt
|       `-- python368
|           |-- bin
|           |   `-- python368.sh
|           `-- lib
|               `-- libs.info
|-- BUILDROOT
|-- RPMS
|   `-- x86_64
|       `-- test-1.0-0.el8.x86_64.rpm
|-- SOURCES
|   `-- opt
|       `-- python368
|           |-- bin
|           |   `-- python368.sh
|           `-- lib
|               `-- libs.info
|-- SPECS
|   `-- test.spec
`-- SRPMS

15 directories, 6 files

让我们查看下rpm包的内容

[root@centos8 ~]# rpm -qpl rpmbuild/RPMS/x86_64/test-1.0-0.el8.x86_64.rpm
/opt
/opt/python368
/opt/python368/bin
/opt/python368/bin/python368.sh
/opt/python368/lib
/opt/python368/lib/libs.info

现在赶快打包使用吧,下面附录一份常用的spec参数介绍,也可自行百度

spec常用参数介绍

xxx.spec
#自定义宏,相当于Linux中"Key-Value"变量形式
%define Name TEST  #--->  名称
%define Version 1.2.2  #--->  版本
#定义软件包信息,即:"rpm -qi name.rpm " 查看到的内容
Name:           %{Name}   #--->   引用宏
Version:        %{Version}   #--->   引用宏
Release:        1%{?dist}   #--->   引用宏(自带宏)
Summary:        ....................................... #--->  一些描述信息
License:        GPLv2  #--->  授权协议
URL:            web地址
buildroot:      %{_topdir}/BUILDROOT   #--->  指定生产车间(非常重要,因在生成rpm过程中执行make install时会把软件安装到此路径,打包时同样依此目录为“根目录”进行操作)
Source0:        %{Name}-%{Version}.tar.gz   #---> 指定源码编译的文件,默认路径:%{_topdir}/SOURCES  
SOURCE1:        支持多个
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
bash script
#定义执行make install时的动作
%install
bash script
#赋予文件的默认权限及设置需在RPM包中保留的文件
%files
%doc
%defattr(-,root,root,-)  #---> 指定包装文件属性,分别是(mode,owner,group),- 表示默认值,文本文件是0644,可执行文件0755
%attr(0755,root,root)  #--->  针对单一文件设置权限
 
#制作完成后的清理工作
%clean
rm -rf %{buildroot}
 
#安装后的执行工作,此处可写入执行脚本
%post
bash script

# 卸载前执行的脚本
%preun
# 卸载完成后执行的脚本
%postun
#变更日志
%changelog