2026/1/16 21:02:54
网站建设
项目流程
模版网站和语言网站,wordpress seo插件中文版,网络舆情监测中心,小程序商城首页设计打包说明
原理介绍
RPM打包的时候需要编译源码#xff0c;需要把编译好的配置文件、二进制命令文件等放到合适的位置#xff0c;还要根据需要对RPM的包进行测试#xff0c;这些都需要先有一个“工作空间”。rpmbuild命令使用一套标准化的“工作空间”#xff1a;
$ rpmd…打包说明原理介绍RPM打包的时候需要编译源码需要把编译好的配置文件、二进制命令文件等放到合适的位置还要根据需要对RPM的包进行测试这些都需要先有一个“工作空间”。rpmbuild命令使用一套标准化的“工作空间”$ rpmdev-setuptreerpmdev-setuptree这个命令就是安装 rpmdevtools 带来的。可以看到运行了这个命令之后在/root目录非root用户为/home/用户名目录下多了一个 rpmbuild 的文件夹目录结构如下$ tree rpmbuild rpmbuild ├── BUILD ├── RPMS ├── SOURCES ├── SPECS └── SRPMS内容相关的说明如下目录宏代码名称功能~/rpmbuild/BUILD%_builddir构建目录源码包被解压至此并在该目录的子目录完成编译~/rpmbuild/RPMS%_rpmdir标准 RPM 包目录生成/保存二进制 RPM 包~/rpmbuild/SOURCES%_sourcedir源代码目录保存源码包如 .tar 包和所有 patch 补丁~/rpmbuild/SPECS%_specdirSpec 文件目录保存 RPM 包配置.spec文件~/rpmbuild/SRPMS%_srcrpmdir源代码 RPM 包目录生成/保存源码 RPM 包(SRPM)SPECS 下是RPM包的配置文件是RPM打包的“图纸”这个文件会告诉rpmbuild命令如何去打包。“宏代码”这一列就可以在SPEC文件中用来代指所对应的目录类似于编程语言中的宏或全局变量。打包流程打包的过程主要分为如下步骤把源代码放到%_sourcedir中。进行编译编译的过程是在%_builddir中完成的一般情况下源代码是压缩包格式需要先进行解压。进行“安装”类似于预先组装软件包把软件包应该包含的内容比如二进制文件、配置文件、man文档等复制到%_buildrootdir中并按照实际安装后的目录结构组装比如二进制命令可能会放在/usr/bin下那么就在%_buildrootdir下也按照同样的目录结构放置。做一些必要的配置比如在实际安装前的准备安装后的清理等等。这些都是通过配置在SPEC文件中来告诉rpmbuild命令。检查软件是否正常运行。生成的RPM包放置到%_rpmdir源码包放置到%_srpmdir下。在SPEC文件中的各个阶段说明如下阶段读取的目录写入的目录具体动作%prep%_sourcedir%_builddir读取位于 %_sourcedir 目录的源代码和 patch 。之后解压源代码至 %_builddir 的子目录并应用所有 patch。%build%_builddir%_builddir编译位于 %_builddir 构建目录下的文件。通过执行类似 ./configure make 的命令实现。%install%_builddir%_buildrootdir读取位于 %_builddir 构建目录下的文件并将其安装至 %_buildrootdir 目录。这些文件就是用户安装 RPM 后最终得到的文件。%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命令构建软件包。rpmbuild构建软件包一般可以通过构建SPEC文件、tar文件、source文件实现。rpmbuild命令格式为rpmbuild [option...]常用的rpmbuild打包选项如表1所示。表 1rpmbuild打包选项option取值说明-bpspecfile从specfile文件的%prep段开始构建解开源码包并打补丁。-bcspecfile从specfile文件的%build段开始构建。-bispecfile从specfile文件的%install段开始构建。-blspecfile从specfile文件的%file段开始检查。-baspecfile通过specfile文件构建源码包和二进制包。-bbspecfile通过specfile文件构建二进制包。-bsspecfile通过specfile文件构建源码包。-rpsourcefile从sourcefile文件的%prep段开始构建解开源码包并打补丁。-rcsourcefile从sourcefile文件的%build段开始构建。-risourcefile从sourcefile文件的%install段开始构建。-rlsourcefile从sourcefile文件的%file段开始检查。-rasourcefile通过sourcefile文件构建源码包和二进制包。-rbsourcefile通过sourcefile文件构建二进制包。-rssourcefile通过sourcefile文件构建源码包。-tptarfile从tarfile文件的%prep段开始构建解开源码包并打补丁。-tctarfile从tarfile文件的%build段开始构建。-titarfile从tarfile文件的%install段开始构建。-tatarfile通过tarfile文件构建源码包和二进制包。-tbtarfile通过tarfile文件构建二进制包。-tstarfile通过tarfile文件构建源码包。--buildrootDIRECTORY在构建时使用DIRECTORY目录覆盖默认的/root目录。--clean完成打包后清除BUILD目录下的文件。--nobuild不执行任何实际的构建步骤。可用于测试spec文件。--noclean不执行spec文件的%clean阶段(即使它确实存在)。--nocheck不执行spec文件的%check阶段(即使它确实存在)。--dbpathDIRECTORY使用DIRECTORY中的数据库而不是默认的 /var/lib/rpm。--rootDIRECTORY使DIRECTORY为最高级别的路径默认“/”为最高路径。--rebuildsourcefile将安装指定的源代码包sourcefile然后进行准备、编译、安装。--recompilesourcefile在--recompile 的基础上额外构建一个新的二进制包。在构建结束时构建目录、源代码和 spec 文件都将被删除(就好像用了 --clean)。-?--help打印详细的帮助信息。--version打印详细的版本信息。本地构建本章通过一个简单的示例介绍如何在本地构建RPM软件包的方法。搭建开发环境以openEuler为例前提条件需要root权限已设置openEuler的repo软件源。操作步骤用户可以直接使用DNF工具安装 rpmdevtools其中包含 rpm-build 等命令以及相关依赖例如make、gdb。使用如下命令# dnf install rpmdevtools*创建Hello World RPM包这里以GNU “Hello World” 项目的打包过程作为示例包含了典型的FOSSFree and Open Source Software 软件项目相关的最常用的外围组件其中包括配置/编译/安装环境、文档、国际化等等。下载源码我们直接下载官方例子的源码使用如下命令$ cd ~/rpmbuild/SOURCES $ wget http://ftp.gnu.org/gnu/hello/hello-2.10.tar.gz编辑SPEC文件在**~/rpmbuild/SPECS**目录下新建spec文件参考命令如下$ cd ~/rpmbuild/SPECS $ vi hello.spec在文件中写入对应内容后保存文件。文件内容示例如下请根据实际情况修改相应字段。Name: hello Version: 2.10 Release: 1%{?dist} Summary: The Hello World program from GNU Summary(zh_CN): GNU Hello World 程序 License: GPLv3 URL: http://ftp.gnu.org/gnu/hello Source0: http://ftp.gnu.org/gnu/hello/%{name}-%{version}.tar.gz BuildRequires: gettext Requires(post): info Requires(preun): info %description The Hello World program, done with all bells and whistles of a proper FOSS project, including configuration, build, internationalization, help files, etc. %description -l zh_CN Hello World 程序, 包含 FOSS 项目所需的所有部分, 包括配置, 构建, 国际化, 帮助文件等. %prep %setup -q %build %configure make %{?_smp_mflags} %install make install DESTDIR%{buildroot} %find_lang %{name} rm -f %{buildroot}/%{_infodir}/dir %post /sbin/install-info %{_infodir}/%{name}.info %{_infodir}/dir || : %preun if [ $1 0 ] ; then /sbin/install-info --delete %{_infodir}/%{name}.info %{_infodir}/dir || : fi %files -f %{name}.lang %doc AUTHORS ChangeLog NEWS README THANKS TODO %license COPYING %{_mandir}/man1/hello.1.* %{_infodir}/hello.info.* %{_bindir}/hello %changelog * Thu Dec 26 2019 Your Name youremailxxx.xxx - 2.10-1 - Update to 2.10 * Sat Dec 3 2016 Your Name youremailxxx.xxx - 2.9-1 - Update to 2.9Name 标签是软件名Version 标签是版本号而 Release 标签是发布编号。Summary 标签是简要说明英文的话第一个字母应大写以避免 rpmlint 工具打包检查工具警告。License 标签说明软件包的协议版本审查软件的 License 状态是打包者的职责这可以通过检查源码或 LICENSE 文件或与作者沟通来完成。Group 标签过去用于按照 /usr/share/doc/rpm-/GROUPS 分类软件包。目前该标记已丢弃vim的模板还有这一条删掉即可不过添加该标记也不会有任何影响。%changelog 标签应包含每个 Release 所做的更改日志尤其应包含上游的安全/漏洞补丁的说明。%changelog 条目应包含版本字符串以避免 rpmlint 工具警告。多行的部分如 %changelog 或 %description 由指令下一行开始空行结束。一些不需要的行 (如 BuildRequires 和 Requires) 可在行首使用 ‘#’ 注释。%prep、%build、%install、%file暂时用默认的未做任何修改。构建RPM包构建源码、二进制和包含调试信息的软件包在spec文件所在目录执行如下命令$ rpmbuild -ba hello.spec执行成功后查看结果使用如下命令$ tree ~/rpmbuild/*RPMS /home/testUser/rpmbuild/RPMS └── aarch64 ├── hello-2.10-1.aarch64.rpm ├── hello-debuginfo-2.10-1.aarch64.rpm └── hello-debugsource-2.10-1.aarch64.rpm /home/testUser/rpmbuild/SRPMS └── hello-2.10-1.src.rpm使用OBS构建本章介绍通过网页和osc构建RPM软件包的方法。主要包括如下两类修改已有软件包修改已有软件包源代码然后将修改后的源代码构建成一个RPM软件包。新增软件包从无到有全新开发一个新的软件源文件并将新开发的源文件构建成一个RPM软件包。OBS简介OBS是基于openSUSE发行版的通用编译框架用于将源码包构建为RPM软件包或Linux镜像。OBS采用自动化的分布式编译方式支持多种Linux操作系统发行版openEuler、SUSE、Debian等镜像和安装包的编译且支持在多种架构平台x86、ARM64等上编译。OBS由后端和前端组成后端实现所有核心功能前端提供了网页应用和API用于与后端进行交互。此外OBS还有一个API命令行客户端oscosc是在一个单独的存储库中开发的。OBS使用工程组织软件包。基础的权限控制、相关的存仓库和构建目标操作系统和架构都可以在工程中定义。一个工程可以包含多个子工程各个子工程可以独立配置共同完成任务。在线构建软件包本章介绍通过OBS网页端在线构建RPM软件包的方法。构建已有软件包说明若为首次使用请首先在OBS网页注册个人账号。该方法需要拷贝修改后的代码因此请在执行下述操作前完成代码修改并提交到正确的代码路径。代码路径会在_service文件中指定。使用OBS网页端修改已有软件的源代码并将修改后的源文件构建为RPM软件包的操作方法如下登录OBS界面地址为https://build.openeuler.openatom.cn/。单击“All Projects”进入所有工程页面。单击需要修改的对应工程进入该工程的详情页面例如单击“openEuler:Mainline”。在工程详情页面的搜索框查找需要修改的软件包然后单击该软件包包名进入该软件包详情页面。单击“Branch package”在弹出的确认页面单击“Accept”确认创建子工程如图1所示。图 1Branch Confirmation页面单击“_service”文件进入编辑页面修改_service内容后点击“Save”保存该文件。_service内容示例如下其中userCodeURL、userCommitID分别为用户代码托管路径、用户代码提交版本号或分支。services service nametar_scm_kernel param namescmgit/param param nameurluserCodeURL/param param namerevisionuserCommitID/param /service service namerecompress param namecompressionbz2/param param namefile*.tar/param /service /services说明单击“Save”保存_service文件后OBS服务会根据_service文件描述从指定的url下载源码到OBS对应工程的软件目录下并替换原有文件例如上述例子中 “openEuler:Mainline”工程的kernel目录。文件拷贝并替换完成后OBS会自动开始构建RPM软件包。等待构建完成并查看右侧状态栏的构建状态。succeeded构建成功。用户可以单击“succeeded”查看构建日志如图2所示。图 2succeeded的页面failed构建失败。请单击“failed”查看错误日志进行问题定位后重新构建。unresolvable未进行构建可能由于缺失依赖。disabled构建被手动关闭或正在排队构建。excluded构建被禁止可能由于缺少spec文件或者spec文件中禁止了目标架构的编译。新增软件包使用OBS网页端新增一个全新软件包的操作方法如下登录OBS界面。根据新增软件包的依赖情况选择合适的工程即单击“All Projects”选择对应工程例如“openEuler:Mainline”。单击工程下任一软件包进入该软件包的详情页面。单击“Branch package”在弹出的确认页面单击“Accept”确认创建子工程。单击“Delete package”删除新创建子工程中的软件包如图3所示。图 3删除子工程中软件包说明通过已有软件创建新工程是为了继承环境等依赖而不需要实际的文件所以这里需要把这些文件删除。单击“Create Package”在弹出的页面输入软件包名称、标题和软件包描述然后单击“Create”创建软件包分别如图4、图5所示。图 4Create Package页面图 5创建软件包信息填写页面在页面中单击“Add file”上传spec文件和需要编译的文件在spec文件中指定如图6所示。图 6Add file页面文件上传成功后OBS会自动开始构建RPM软件包。等待构建完成并查看右侧状态栏的构建状态。succeeded构建成功。用户可以单击“succeeded”查看构建日志。failed构建失败。请单击“failed”查看错误日志进行问题定位后重新构建。unresolvable未进行构建可能由于缺失依赖。disabled构建被手动关闭或正在排队构建。excluded构建被禁止可能由于缺少spec文件或者spec文件中禁止了目标架构的编译。获取软件包RPM软件包构建完成后通过网页端获取对应RPM软件包的方法如下登录OBS界面。单击“All Projects”找到所需软件包的对应工程例如“openEuler:Mainline”。在工程下单击所需软件包的包名进入该软件包详情页面。例如上述例子中的kernel页面。选择Repositories页签进入软件包的软件仓库管理页面在Publish Flag中通过单击选择“Enable”开启状态由变为对应的RPM软件包下载功能如图7所示。图 7Repositories页面单击Repository列的构建工程名称进入RPM软件包下载页面单击RPM软件包右侧的“Download”即可下载对应RPM软件包如图8所示。图 8RPM软件包下载页面使用osc构建软件包本章介绍使用OBS的命令行工具osc创建工程并构建RPM软件包的方法。安装并配置osc前提条件需要root权限已设置openEuler的repo软件源。操作步骤使用root用户安装osc命令行工具及依赖。# dnf install osc build说明编译RPM软件包的过程中会依赖build。配置osc。打开~/.oscrc命令如下$ vi ~/.oscrc在~/.oscrc中添加user和pass字段如下所示它们的取值userName和passWord分别是用户在OBS网页https://build.openeuler.openatom.cn/上已经注册的账号和密码。[general] apiurl https://build.openeuler.openatom.cn/ [https://build.openeuler.openatom.cn/] useruserName passpassWord构建已有软件包创建工程通过拷贝已有工程创建属于用户自己的子工程。例如将openEuler:Mainline工程下的zlib软件包到新分支参考命令如下$ osc branch openEuler:Mainline zlib回显如下所示说明在用户testUser下创建了新的分支工程home:testUser:branches:openEuler:Mainline。A working copy of the branched package can be checked out with: osc co home:testUser:branches:openEuler:Mainline/zlib将需要修改软件包的相关配置文件例如_service下载到本地当前路径。其中testUser为~/.oscrc配置文件中配置的账户名称请根据实际情况修改。$ osc co home:testUser:branches:openEuler:Mainline/zlib回显如下所示A home:testUser:branches:openEuler:Mainline A home:testUser:branches:openEuler:Mainline/zlib A home:testUser:branches:openEuler:Mainline/zlib/_service进入本地子工程目录并将软件包远程代码同步到本地。$ cd home:testUser:branches:openEuler:Mainline/zlib $ osc up -S回显如下所示A _service:tar_scm_kernel_repo:0001-Neon-Optimized-hash-chain-rebase.patch A _service:tar_scm_kernel_repo:0002-Porting-optimized-longest_match.patch A _service:tar_scm_kernel_repo:0003-arm64-specific-build-patch.patch A _service:tar_scm_kernel_repo:zlib-1.2.11-optimized-s390.patch A _service:tar_scm_kernel_repo:zlib-1.2.11.tar.xz A _service:tar_scm_kernel_repo:zlib-1.2.5-minizip-fixuncrypt.patch A _service:tar_scm_kernel_repo:zlib.spec构建RPM包重命名源文件然后将重命名后的源文件添加到OBS暂存中。$ rm -f _service;for file in ls | grep -v .osc;do new_file${file##*:};mv $file $new_file;done $ osc addremove *修改源代码和spec文件并执行如下命令更新文件。$ osc up将对应软件包的所有修改同步到OBS服务器。参考命令如下-m参数后的信息为提交记录。$ osc ci -m commit log获取当前工程的仓库名称和架构参考命令如下$ osc repos home:testUser:branches:openEuler:Mainline修改提交成功后OBS会自动开始编译软件包。可以通过如下命令查看对应仓库的编译日志其中standard_aarch64、aarch64分别为查询所得仓库名称和架构。$ osc buildlog standard_aarch64 aarch64说明用户也可以通过网页端打开自己创建的对应工程查看构建日志。新增软件包使用OBS的osc工具新增一个全新软件包的操作方法如下创建工程根据新增软件包的依赖情况基于合适的工程创建属于用户自己的个人工程。例如基于openEuler:Mainline工程的 zlib 创建工程的参考命令如下zlib 为工程下的任一软件包。$ osc branch openEuler:Mainline zlib删除创建工程时新增的无用软件包。例如删除zlib软件包的参考命令如下$ cd home:testUser:branches:openEuler:Mainline $ osc rm zlib $ osc commit -m commit log在个人工程下创建新增的软件包。例如新增软件包 my-first-obs-package命令如下$ mkdir my-first-obs-package $ cd my-first-obs-package构建RPM包添加准备的源文件和spec文件到软件包目录。修改源代码和spec文件并将对应软件包的所有文件上传到OBS服务器。参考命令如下-m 参数后的信息为提交记录。$ cd home:testUser:branches:openEuler:Mainline $ osc add my-first-obs-package $ osc ci -m commit log获取当前工程的仓库名称和架构参考命令如下$ osc repos home:testUser:branches:openEuler:Mainline修改提交成功后OBS会自动开始编译软件包。可以通过如下命令查看对应仓库的编译日志其中standard_aarch64、aarch64分别为查询所得仓库名称和架构。$ cd home:testUser:branches:openEuler:Mainline/my-first-obs-package $ osc buildlog standard_aarch64 aarch64说明用户也可以通过网页端打开自己创建的对应工程查看构建日志。获取软件包RPM软件包构建完成后使用osc获取对应RPM软件包的命令如下$ osc getbinaries home:testUser:branches:openEuler:Mainline my-first-obs-package standard_aarch64 aarch64命令中的各参数含义如下请用户根据实际情况修改home:testUser:branches:openEuler:Mainline软件包所在工程名称my-first-obs-package软件包名称standard_aarch64仓库名称aarch64仓库架构名称