跳转至

软件包打包指导

1. 文档说明

本文档对OpenCloudOS社区软件包打包操作进行说明,指导社区开发者按照社区规范进行软件包打包,提升软件包打包质量。

2. SPEC文件

SPEC文件各tags、sections说明详见:https://rpm-software-management.github.io/rpm/manual/spec.html。

2.1. SPEC文件布局

SPEC文件尽量按照如下格式、布局进行编写:

%global xxx                   #全局变量定义
%undefine xxx                 #全局变量定义
%bcond_with xxx               #条件控制

Summary:                      
Name:                         
Version:                      
Release:                      #即使代码没变,但由于spec调整、依赖变化、编译工具链变化等原因的重编都需要+1
License: 
URL:                          
Source0:                      #虽然写Source也没错,但建议统一写Source0
Source1:
......

Patch0001:                    #补丁编号,详见后面的说明
Patch0002:
......

BuildArch:                   #如果是noarch,需明确指出

BuildRequires:               #建议按软件包归类、分行,比如基础编译工具链相关的gcc、make、autoconf等放一行
BuildRequires:               #直接编译依赖尽量写全,间接编译依赖(即直接编译依赖的运行依赖)不需要写
Requires:                    #建议按软件包归类、分行;每行的多个包建议统一用空格或者逗号分隔,不要空格、逗号混用
Requires:                   #如果软件包有版本号要求,建议一个包一行
Provides:                    #详见https://ftp.osuosl.org/pub/rpm/max-rpm/s1-rpm-depend-manual-dependencies.html
Conflicts:                   #主要用于路径或者功能冲突
Obsoletes:                   #主要用于软件包替代或者重命名

%description                 #主包描述,包的名字为Name,前面的BuildRequires、Requires等都是对主包的说明


%package 子包                #子包
Summary:  
Requires: 
Provides:

%description 子包            #子包描述
......


%prep                        #准备阶段,包括源码包解压、打补丁等动作
.....

%build                       #编译阶段
......

%install                     #安装阶段,将编译出的目标文件安装到虚拟的根目录;
......                       #建议一个目录一个目录处理,或者一类一类文件(配置、bins、动态库等)处理

%check                       #测试阶段
......


%pre                         #按需添加scriptlets,对rpm包安装、卸载、升级动作执行前后的动作进行说明

%post

%preun

%postun


%triggerin                   #按需添加triggers

%triggerun

%triggerpostun


%files                       #打包阶段,打包主包  


%files 子包                  #打包子包


%changelog
* Mon Dec 26 2022 XXXX <XXX@YYY> - version-release
- initial build

2.2. SPEC文件风格

建议在编写SPEC时就像写其他代码一样,形成一定的编写风格、逻辑,包括适当的空行分段、适当的空格对齐、 同一个或者同类型的操作用同一种写法等,形成干净、简洁的SPEC文件

3. N-V-R

软件包的Name、Version跟上游社区保持一致,release号从1开始、并与changelog中的release号保持一致。 如果version变化,release号从1重新开始。

4. URL和Source

URL、Source中的地址确保可以访问,确保来源可靠、合规。

5. License

通过上游社区的主页说明、README文件、License文件、COPYING文件以及文件头等地方确认涉及的License、Copyright等声明, 确保SPEC中的License声明正确、全面。

如果有多个License,则用and 连接。 如果license不友好或者非标准的经OSI认证的开源协议,谨慎引入。

6. 补丁名称和编号

为了方便补丁的管理,例如社区基础平台的自动化升级工具在尝试升级新版本时,如果遇到补丁冲突,会根据补丁编号尝试去掉来之上游社区的补丁,提升开发维护效率,因此将补丁分为三类: - 来之上游社区或者基于上游社区新代码自己做的补丁,从0001开始编号,即Patch0001、Patch0002等。 - 来之其他发行版的补丁,从3000开始编号,即Patch3000、Patch3001等。 - 自定义补丁,没被上游社区接纳,从5000开始编号,即Patch5000、Patch5001等。

补丁名称尽可能描述出修改的问题的关键信息,补丁名称不要求带补丁编号,带的话,维护性更好些。

7. %check

软件包自带测试用例作为保证软件包质量的关键措施,无特殊原因不能disable。

8. %install和%files

%install阶段,建议按照目录一个一个处理,形成一定的逻辑性,避免来回跳转、不利于后期维护。如果要生成目录,建议目录生成之后,就处理该目录下的安装。

8.1. 打包顺序

%files打包阶段,先打主包,然后打子包,子包顺序与前面的%package顺序一致。 同时建议%package和%files按照子包间的依赖关系、重要程度来排序,比如主包、libs子包、utils子包、devel子包、doc子包等。

不成熟的、业界很少使用的能力(如sudo的logserver功能)不建议打包提供。

打包时,建议按照目录或者文件类型一个一个处理,形成一定的逻辑性,避免来回跳转、不利于后期维护。 建议先license、doc、配置文件,然后主程序(命令、动态库等),最后man、info等。

9. %changelog

changelog log 尽量与commit log一致,简洁,说明关键的修改点

10. 其他参考

关于SPEC文件更详细的说明,可以参考: - https://ftp.osuosl.org/pub/rpm/max-rpm/index.html - https://rpm.org/documentation.html