首页 > 其他分享 >rpmbuild-制作rpm包

rpmbuild-制作rpm包

时间:2024-07-29 16:59:26浏览次数:4  
标签:bin 制作 rpmbuild %_ usr rpm 目录

rpmbuild制作rpm文件

环境说明

centos7/8
rpmbuild
rpmdev-setuptree

# 用于安装制作rpm包的文件
yum install rpm-build rpmdevtools

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

 rpmdev-setuptree
 
 # 默认将使用用户家目录创建对应的文件
  tree rpmbuild/
rpmbuild/
├── BUILD
├── RPMS
├── SOURCES
│   └── a.sh
├── SPECS
└── SRPMS


# 若要修改默认创建位置,修改如下即可
cat .rpmmacros 

%_topdir %(echo $HOME)/rpmbuild   

%_smp_mflags %( \
    [ -z "$RPM_BUILD_NCPUS" ] \\\
        && RPM_BUILD_NCPUS="`/usr/bin/nproc 2>/dev/null || \\\
                             /usr/bin/getconf _NPROCESSORS_ONLN`"; \\\
    if [ "$RPM_BUILD_NCPUS" -gt 16 ]; then \\\
        echo "-j16"; \\\
    elif [ "$RPM_BUILD_NCPUS" -gt 3 ]; then \\\
        echo "-j$RPM_BUILD_NCPUS"; \\\
    else \\\
        echo "-j3"; \\\
    fi )

%__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目录内容如下,这是非常规目录

# 希望最终安装的时候自己的软件在什么位置,这个就放在什么位置,本例中bin目录我放在/opt/
tree rpmbuild/
rpmbuild/
├── BUILD
├── RPMS
├── SOURCES
│   └── opt
│       └── bin
│           └── a.sh
├── SPECS
└── SRPMS


参数详解:

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

创建spec文件

# 可以查看所有的默认宏定义 
 rpmbuild --showrc 
 
 
 # 配置
 cd SPEC 
 # 但其实放置在任何位置都可以的,只不过为了规范点,但实际上我们这样使用自定义目录打包本身就是不规范,适合内部软件打包使用,不适合发布此类rpm包,如要发布,请遵循Linux本身的目录规则进行打包
cat SPECS/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/bin
%postun
rm -rf /opt/bin



打包流程:

1> 首先,需要把源代码放到%_sourcedir中;
2> 然后,进行编译,编译的过程是在%_builddir中完成的,所以需要先把源代码复制到这个目录下边,一般情况下,源代码是压缩包格式,那么就解压过来即可;
3> 第三步,进行“安装”,这里有点类似于预先组装软件包,把软件包应该包含的内容(比如二进制文件、配置文件、man文档等)复制到%_buildrootdir中,并按照实际安装后的目录结构组装,比如二进制命令可能会放在/usr/bin下,那么就在%_buildrootdir下也按照同样的目录结构放置;
4> 然后,需要配置一些必要的工作,比如在实际安装前的准备啦,安装后的清理啦,以及在卸载前后要做的工作啦等等,这样也都是通过配置在SPEC文件中来告诉rpmbuild命令;
5> 还有一步可选操作,那就是检查软件是否正常运行;
6> 最后,生成的RPM包放置到%_rpmdir,源码包放置到%_srpmdir下。

阶段: 
阶段 读取的目录 写入的目录 具体动作
%prep %_sourcedir %_builddir 读取位于 %_sourcedir 目录的源代码和 patch 。之后,解压源代码至 %_builddir 的子目录并应用所有 patch。
%build %_builddir %_builddir 编译位于 %_builddir 构建目录下的文件。通过执行类似 ./configure && make 的命令实现。
%install %_builddir %_buildrootdir 读取位于 %_builddir 构建目录下的文件并将其安装至 %_buildrootdir 目录。这些文件就是用户安装 RPM 后,最终得到的文件。注意一个奇怪的地方: 最终安装目录 不是 构建目录。通过执行类似 make install 的命令实现。
%check %_builddir %_builddir 检查软件是否正常运行。通过执行类似 make test 的命令实现。很多软件包都不需要此步。
bin %_buildrootdir %_rpmdir 读取位于 %_buildrootdir 最终安装目录下的文件,以便最终在 %_rpmdir 目录下创建 RPM 包。在该目录下,不同架构的 RPM 包会分别保存至不同子目录, noarch 目录保存适用于所有架构的 RPM 包。这些 RPM 文件就是用户最终安装的 RPM 包。
src %_sourcedir %_srcrpmdir 创建源码 RPM 包(简称 SRPM,以.src.rpm 作为后缀名),并保存至 %_srcrpmdir 目录。SRPM 包通常用于审核和升级软件包。

打包

rpmbuild -bb test.spec 
执行(%prep): /bin/sh -e /var/tmp/rpm-tmp.MljExl
+ umask 022
+ cd /root/rpmbuild/BUILD
+ echo 'do not'
do not
+ exit 0
执行(%install): /bin/sh -e /var/tmp/rpm-tmp.P3XwkJ
+ umask 022
+ cd /root/rpmbuild/BUILD
+ '[' /root/rpmbuild/BUILDROOT/test-1.0-0.el7.x86_64 '!=' / ']'
+ rm -rf /root/rpmbuild/BUILDROOT/test-1.0-0.el7.x86_64
++ dirname /root/rpmbuild/BUILDROOT/test-1.0-0.el7.x86_64
+ mkdir -p /root/rpmbuild/BUILDROOT
+ mkdir /root/rpmbuild/BUILDROOT/test-1.0-0.el7.x86_64
+ cd /root/rpmbuild/SOURCES
+ cp -ar opt /root/rpmbuild/BUILDROOT/test-1.0-0.el7.x86_64/
+ '[' '%{buildarch}' = noarch ']'
+ QA_CHECK_RPATHS=1
+ case "${QA_CHECK_RPATHS:-}" in
+ /usr/lib/rpm/check-rpaths
+ /usr/lib/rpm/check-buildroot
+ /usr/lib/rpm/redhat/brp-compress
+ /usr/lib/rpm/redhat/brp-strip /usr/bin/strip
+ /usr/lib/rpm/redhat/brp-strip-comment-note /usr/bin/strip /usr/bin/objdump
+ /usr/lib/rpm/redhat/brp-strip-static-archive /usr/bin/strip
+ /usr/lib/rpm/brp-python-bytecompile /usr/bin/python 1
+ /usr/lib/rpm/redhat/brp-python-hardlink
+ /usr/lib/rpm/redhat/brp-java-repack-jars
处理文件:test-1.0-0.el7.x86_64
Provides: test = 1.0-0.el7 test(x86-64) = 1.0-0.el7
Requires(interp): /bin/sh
Requires(rpmlib): rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1 rpmlib(CompressedFileNames) <= 3.0.4-1
Requires(postun): /bin/sh
检查未打包文件:/usr/lib/rpm/check-files /root/rpmbuild/BUILDROOT/test-1.0-0.el7.x86_64
写道:/root/rpmbuild/RPMS/x86_64/test-1.0-0.el7.x86_64.rpm
执行(%clean): /bin/sh -e /var/tmp/rpm-tmp.TosgLv
+ umask 022
+ cd /root/rpmbuild/BUILD
+ /usr/bin/rm -rf /root/rpmbuild/BUILDROOT/test-1.0-0.el7.x86_64
+ exit 0





#  再次查看目录结构
tree /root/rpmbuild/
/root/rpmbuild/
├── BUILD
├── BUILDROOT
├── RPMS
│   └── x86_64
│       └── test-1.0-0.el7.x86_64.rpm
├── SOURCES
│   └── opt
│       └── bin
│           └── a.sh
├── SPECS
│   └── test.spec
└── SRPMS



# 查看rpm包的内容
 rpm -qpl RPMS/x86_64/test-1.0-0.el7.x86_64.rpm 
/opt/bin
/opt/bin/a.sh


# 测试安装
rpm -ivh RPMS/x86_64/test-1.0-0.el7.x86_64.rpm 
准备中...                          ################################# [100%]
正在升级/安装...
   1:test-1.0-0.el7                   ################################# [100%]

ll /opt/
drwxr-xr-x  2 root root 18 7月  29 16:17 bin


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

标签:bin,制作,rpmbuild,%_,usr,rpm,目录
From: https://www.cnblogs.com/kkit/p/18330471

相关文章

  • 彩盒印刷制作为你品牌的锦上添花
      彩盒印刷制作,为你品牌的锦上添花。我们采用优质卡纸,巧手打造出精致的包装盒,让你的产品尽显尊贵大气。无论是酒水包装还是食品包装,无论是药品包装还是其他专业包装,我们都将用心为您呈现最理想的彩盒。   每一张卡纸,都源自严格挑选的原材料,经过精心印刷、折叠、粘......
  • 【从0制作自己的ros导航小车:上、下位机通信篇】上、下位机串口DMA通信
    从0制作自己的ros导航小车前言一、准备工作二、下位机端(STM32)三、上位机端(旭日x3派)四、测试前言下位机的电机驱动、轮速读取、偏航角读取都已经完成,接下来就是上下位机的桥梁:串口通信。使用USB转TTL模块连接上位机(旭日x3派)和下位机(stm32),只需要连接RX、TX、GND即可......
  • 如何用Python制作Android服务?
    我想构建一个简单的Android应用程序,例如PushOver应用程序,它具有TCP服务器并接收其记录的文本消息,然后将其作为推送通知发送。这部分已经完成并且工作正常。但即使GUI应用程序关闭,我也想接收消息。我知道这是可能的,因为PushOver应用程序做到了!我想,我可能需要一......
  • 烧录算法制作
    前言在使用Keil的时候,我们一般会通过一个下载器与目标芯片连接,这样就可以实现的代码下载或调试。那么下载器是如何将我们的应用程序烧写在我们芯片内部Flash当中的呢,是否可以同样的方式烧录在外部Flash上呢?这是此片文章所要说明的。MDK下载算法原理通过MDK创建一批与地址信息无......
  • 简单网页制作
    网页效果预览这个网页包含图片,链接,字体设置,表格等初学者最好手敲代码,更快熟悉元素和结构完整的代码放在最后了一:代码怎么变成网页之前我们安装了xampp,启动xampp里的apache及sql在xampp下找到htdocs目录新建文件夹改名后缀为.php即可将新建文件用记事本打开在里面输......
  • web期末作业设计网页/web前端开发期末大作业/html css网页制作成品(第51-60套/总计100
     博主介绍:黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育和辅导。所有项目都配有从入门到精通的基础知识视频课程,学习后应对毕业设计答辩。项目配有对应开发文档、开题报告、任务书、P......
  • linux centos7环境下通过rpm部署MySQL
    一、环境准备环境:centos7,确保虚拟机内存足够,不然无法上传数据包和解压mysql包:mysql-8.0.25-1.el7.x86_64.rpm-bundle.tar这个包去MySQL官网可以下载,此链接可以直达:https://downloads.mysql.com/archives/community/二、打开远程连接,连上自己的虚拟机1.连上自己的虚拟机后......
  • 402.高端大气的网络科技公司网页 大学生期末大作业 Web前端网页制作 html+css+js
    目录一、网页概述二、网页文件 三、网页效果四、代码展示1.html2.CSS3.JS五、总结1.简洁实用2.使用方便3.整体性好4.形象突出5.交互式强六、更多推荐欢迎光临仙女的网页世界!这里有Web前端网页制作的各行各业的案例,样式齐全新颖,并持续更新!感谢CSDN,提供了这......
  • 使用特定的Python版本(MacOS)制作virtualenv
    我安装了brew,python3(默认和最新版本)和pip3,pyenv。TensorFlow现在不支持python3.7,所以我听说我应该制作一个独立运行3.6或更低版本的virtualenv。我安装了python3.6.7bypyenvinstall3.6.7但无法制作virtualenv-p3.6.7(mydir)因为3.6.7不在P......
  • 虚幻五 学习制作多人在线游戏 (二)
    在新建项目里面可以看到运行按钮旁边有三个点点击后可以看到玩家数量可以按照自己的需求更改 并且将网络模式改为以客户端运行 打开角色蓝图在角色蓝图中添加以下信息其中Open后面是自己的IP地址  在菜单栏单机文件选择新建关卡新建一个默认关卡就可以了......