龙空技术网

如何构建RPM软件包

闪念基因 167

前言:

今天姐妹们对“nginxrpm制作”大体比较注重,咱们都想要分析一些“nginxrpm制作”的相关知识。那么小编在网上收集了一些有关“nginxrpm制作””的相关文章,希望看官们能喜欢,各位老铁们一起来了解一下吧!

RPM是一种用于在Linux系统上安装软件的软件封装格式,正如在Windows系统中使用exe文件安装软件一样,在基于Fedora衍生的Linux系统中,我们一般使用 yum install packageName.rpm 的方式安装软件,例如 yum install nginx.rpm。相比源文件编译、二进制安装等安装方式,RPM软件包具有易于分发、安装方便等优点,仅需执行yum install packageName.rpm即可完成安装,无需额外操作。现存Linux系统,例如CentOS、OpenEuler、OpenAnolis、UOS服务器版本、Kylin服务器版本等均属于RPM系操作系统。

那么我们如何根据源码构建一个RPM软件包呢?主要分为如下四个步骤:

1.准备构建RPM软件包的基本环境2.准备软件源码3.编写spec文件4.构建RPM软件包

下面根据如上四个步骤进行介绍。

1. 准备构建RPM软件包的基本环境

本文介绍在CentOS操作系统上构建一个完整RPM软件包的过程。首先需要做的是搭建构建RPM软件包需要的系统环境,一共需要两个步骤,具体如下:

1.在CentOS操作系统上安装如下几个软件:

yum install gcc rpm-build rpm-devel rpmlint make python bash coreutils diffutils patch rpmdevtools

其中,rpmdevtools软件提供了一系列的工具用于RPM软件包的构建。查看其提供的工具,可以执行如下命令:

rpm -ql rpmdevtools | grep bin

2.创建构建RPM包需要的目录结构:

执行命令:rpmdev-setuptree

结果将在 ~/rpmbuild 目录创建如下目录结构

[root@localhost ~]# tree ~/rpmbuild//root/rpmbuild/├── BUILD├── RPMS├── SOURCES├── SPECS└── SRPMS5 directories, 0 files

3.各个目录介绍

工作目录结构如下,~/rpmbuild~/rpmbuild/BUILD                #打包过程中的工作目录。将 SOURCES目录下的tar.gz包解压到此目录。~/rpmbuild/RPMS                 #存放生成的二进制包~/rpmbuild/SOURCES              #放置打包资源,包括源码打包文件和补丁文件等。主要是一些 tar.gz包。~/rpmbuild/SPECS                #放置SPEC文档~/rpmbuild/SRPMS                #存放生成的源码包
2.准备软件源码

本文以C++程序为例进行介绍,其它语言类似。首先准备源代码,具体如下:

[root@localhost opt]# mkdir /opt/helloworld && cd /opt/helloworld[root@localhost helloworld]# touch helloworld.c[root@localhost helloworld]# touch Makefile[root@localhost helloworld]# touch LICENSE[root@localhost helloworld]# tree ..├── helloworld.c└── Makefile0 directories, 2 files

helloworld.c文件内容如下:

//文件:/opt/helloworld/helloworld.c#include <stdio.h>int main(void) {    printf("Hello World\n");    return 0;}

Makefile文件内容如下:

#文件:/opt/helloworld/Makefilehelloworld:        gcc -g helloworld.c -o helloworldclean:        rm -r -f helloworldinstall:        mkdir -p $(DESTDIR)/usr/bin        install -m 0755 helloworld $(DESTDIR)/usr/bin/helloworlduninstall:        rm -r -f $(DESTDIR)/usr/bin/helloworld

LICENSE 文件内容如下:

木兰公共许可证, 第2版2021年5月 本文作为示例,具体木兰协议的引用,请查看 
3.编写spec文件

RPM软件包的构建需要使用 rpmdevtools软件包提供的 rpmbuild 工具,而 rpmbuild 工具需要按照 spec 文件中的指令来进行RPM软件包的构建。下面我们介绍 spec 文件的编写。

1.生成spec文件

[root@localhost opt]# cd /opt/helloworld/[root@localhost helloworld]# rpmdev-newspec -o helloworld.spec

2.spec文件简介

// /opt/helloworld/helloworld.specName:           helloworld 这里是软件的名称Version:  这里是软件的版本号,这个版本号需要和软件源码的 tar.gz 包命名中的版本号一致Release:        1%{?dist} 这个是发型信息,其中的数字1可以理解为这是进行第一次编译Summary:  对该软件的简要介绍License:  该软件遵循的协议URL:   该软件的项目地址,可以写软件网站或者 git 地址Source0:  这里写软件源码的 tar.gz 包名称BuildRequires: 这里写编译该软件需要依赖哪些其它的软件。例如,编译c程序需要依赖gccRequires:  这里写运行该软件需要依赖哪些其它的软件。例如,运行c程序需要依赖glibc%description 这里写对该软件的详细介绍%prep   这一行就保持%prep不变,用于提示 rpmbuild 到这里就进入预准备阶段了,在预准备阶段,可以执行将 Source0 中指示的软件包进行解压%autosetup  这个宏定义的意思就是自动将 Source0 中指示的软件包进行解压%build   这一行保持%build不变,用于提示 rpmbuild 到这里就进入编译阶段了。在编译阶段,开始根据相应的指令对源码进行编译%configure  调用 configure 命令,对需要编译的源码进行配置。可以执行 `rpm --eval %configure` 查看这个宏定义%make_build  调用 make 命令,对源码进行编译。可以执行 `rpm --eval %make_build` 查看这个宏定义%install  这一行保持%install不变,用于提示 rpmbuild 到这里就进入安装阶段了。rm -rf $RPM_BUILD_ROOT  删除/root/rpmbuild/BUILDROOT/%{NAME}-%{VERSION}-%{RELEASE}.x86_64 目录下的内容%make_install 调用 make install 进行对软件进行安装%files   这一行保持%files不变,用于提示 rpmbuild 到这里就进入打包阶段了。在这个阶段将提示rpmbuild需要将哪些文件%license add-license-file-here%doc add-docs-here%changelog  自动生成的,可以暂时先不理会这里* Thu Sep 28 2023 zhangsan <zhangsan@163.com>-

3.针对helloworld项目编写的spec文件

Name:           helloworldVersion:        1.0.0Release:        1%{?dist}Summary:        hello worldLicense:        mulan-2.0URL:            :        %{name}-%{version}.tar.gzBuildRequires:  gccRequires:       glibc%descriptionthis software's func is print hello world.%prep%autosetup%build%make_build%installrm -rf %{buildroot}%make_install%files%license LICENSE%{_bindir}/helloworld%changelog* Thu Sep 28 2023 zhangsan <zhangsan@163.com>-
4.构建RPM软件包

根据官方指导,构建RPM软件包具体需要如下两个步骤:1. 将源码打包成 tar.gz压缩包,2.执行rpmbuild命令构建软件包。具体如下:

1.打包tar.gz压缩包

[root@localhost opt]# cd /opt/helloworld/[root@localhost helloworld]# mkdir helloworld-1.0.0[root@localhost helloworld]# cp -p helloworld.c LICENSE Makefile helloworld.spec helloworld-1.0.0/[root@localhost helloworld]# tar -cvzf helloworld-1.0.0.tar.gz helloworld-1.0.0/helloworld/helloworld/helloworld.chelloworld/LICENSEhelloworld/helloworld.spechelloworld/Makefile[root@localhost helloworld]# tree ..├── helloworld│   ├── helloworld.c│   ├── LICENSE│   ├── helloworld.spec│   └── Makefile├── helloworld-1.0.0.tar.gz├── helloworld.c├── LICENSE├── helloworld.spec└── Makefile1 directory, 7 files

2.执行rpmbuild命令构建软件包

构建RPM软件包的核心命令是rpmbuild -ba xxx.spec,具体如下:

[root@localhost opt]# cd /opt/helloworld/[root@localhost helloworld]# cp helloworld-1.0.0.tar.gz ~/rpmbuild/SOURCES/[root@localhost helloworld]# cp helloworld.spec ~/rpmbuild/SPECS/[root@localhost helloworld]# tree ~/rpmbuild//root/rpmbuild/├── BUILD├── RPMS├── SOURCES│   └── helloworld-1.0.0.tar.gz├── SPECS│   └── helloworld.spec└── SRPMS5 directories, 2 files[root@localhost helloworld]# rpmbuild -ba ~/rpmbuild/SPECS/helloworld.spec
5.总结

至此完成一个简单 RPM 软件包的构建,可以执行 yum install ~/rpmbuild/RPMS/x86_64/helloworld-1.0.0-1.an8.x86_64.rpm 安装构建的软件包,并且直接输入命令helloworld即可执行该程序。

6.参考

[RPM Packaging Guide (rpm-packaging-guide.github.io)]

()

[RPM打包原理、示例、详解及备查-腾讯云开发者社区-腾讯云 (tencent.com)]()

作者:贾兆款

来源:微信公众号:沃享荟

出处:

标签: #nginxrpm制作