RPM参考指南 1.rpm编译 2.rpm内容查看与解包 3.打包环境准备 4.打包与spec语法 5.rpmlint 0.说明 RPM许可证为GPL2+ 以及LGPL2+除外 https://rpm.org/ http://ftp.rpm.org/releases/rpm-4.16.x/rpm-4.16.1.2.tar.bz2 1.编译 参考来自https://github.com/rpm-software-management/rpm/raw/master/INSTALL fedora的spec以及openSUSE的spec 编译必须的包: popt https://github.com/rpm-software-management/popt http://ftp.rpm.org/popt/releases/popt-1.x/popt-1.18.tar.gz zlib https://zlib.net/ https://zlib.net/zlib-1.2.11.tar.xz libmagic 系统核心包file提供 加密库二选一 openssl(fedora选择的) https://www.openssl.org/ https://mirrors.cloud.tencent.com/openssl/source/openssl-1.1.1i.tar.gz ##受制于EAR,openssl 1系列许可证与GPL不兼容。EAR 美国出口管制条例。 libgcrypt(openSUSE选择的) https://www.gnupg.org/software/libgcrypt/ https://www.gnupg.org/ftp/gcrypt/libgcrypt/libgcrypt-1.8.7.tar.bz2 ##不受制于EAR 数据库引擎 主推荐ndb (rpm自己写的,rpm内建) 主推荐sqlite https://sqlite.org/index.html https://sqlite.org/2020/sqlite-src-3340000.zip https://sqlite.org/2020/sqlite-autoconf-3340000.tar.gz BDB已经弃用 (BDB新版使用AGPLv3,是开源许可证,但是和GPLv2不兼容) BDB RO版支持方案--enable-bdb-ro (rpm内建) lua支持 (fedora的spec嵌入了大量lua源代码) https://www.lua.org/ https://www.lua.org/ftp/lua-5.4.2.tar.gz SELinux (原文为可选依赖,但fedora和OpenSUSE都有) https://github.com/SELinuxProject https://github.com/SELinuxProject/selinux/releases/download/20200710/libselinux-3.1.tar.gz #Warning: SELinux编译依赖较多 python (原文为可选依赖,但fedora和OpenSUSE都有) https://www.python.org/ https://mirrors.huaweicloud.com/python/3.9.1/Python-3.9.1.tar.xz #Warning: Python编译依赖非常多连Xorg都需要 libcap (原文为可选依赖,但fedora和OpenSUSE都有) https://sites.google.com/site/fullycapable/ https://mirrors.ustc.edu.cn/kernel.org/linux/libs/security/linux-privs/libcap2/libcap-2.46.tar.xz acl (原文为可选依赖,但fedora和OpenSUSE都有) https://savannah.nongnu.org/projects/acl https://download.savannah.nongnu.org/releases/acl/acl-2.2.53.tar.gz autoconf automake libtool makeinfo m4 存疑 gnupg2 ncurses dwz audit-libs dbus libarchive zstd cpio 讨论:数据库默认引擎,python,selinux,存疑库 2.rpm内容查看与解包 查看本地rpm内容 rpm -qlp *.rpm //任何rpm包,包括二进制包与src.rpm 查看已经安装的包的内容 rpm -ql bash 完全解压rpm rpm2cpio ./a.rpm | cpio -idmv //需要rpm2cpio与cpio cpio的参数: -i = extract -d = make directories -m = preserve modification time -v = verbose 图形化软件如ark等也可以查看解压。(windows下用7zip) 3.打包环境准备 sudo zypper in rpm-build rpmconf rpmdevtools rpmlint ##build build在zypper未打包,自成体系前不要使用 spec-clean 对spec文件进行格式化 rpm-build为rpm提供 rpmconf 处理.rpmnew, .rpmsave和.rpmorig文件 https://github.com/xsuchy/rpmconf https://github.com/xsuchy/rpmconf/archive/rpmconf-1.1.3-1.tar.gz rpmdevtools 提供一些帮助打包的脚本 https://pagure.io/rpmdevtools https://releases.pagure.org/rpmdevtools/rpmdevtools-9.2.tar.xz rpmlint 检查rpm包中的错误 https://github.com/rpm-software-management/rpmlint https://github.com/rpm-software-management/rpmlint/archive/rpmlint-1.11.tar.gz build 自动在发行版内以chroot形式打包,自动解决依赖 rpmdev-setuptree 执行后会自动在所在目录下新建rpmbuild文件夹,里面是rpm打包专用的目录。五个文件夹,BUILD文件夹,临时编译目录,宏%buildroot定义的目录,如果编译或打包失败,日志也在这个目录;RPMS文件夹,生成的二进制文件所在目录,.rpm前会有文件所属架构,如noarch,x86_64,aarch64;SOURCES文件夹,patch,源代码,额外的要打包进去的源文件放在这儿;SPEC文件夹,.spec文件就放这里;SRPM文件夹,生成的.src.rpm所在位置。 确定好准备打包的软件后,在SPEC文件夹内创建文件,软件名.spec,并将软件的源代码放到SOURCES文件夹。 4.打包与spec语法 4.1关于编译的根目录 在RPM打包的上下​​文中,"buildroot"是chroot环境。这意味着构建工件将使用与最终用户系统中相同的文件系统层次结构放置在此处,其中"buildroot"充当根目录。构建工件的放置应符合最终用户系统的文件系统层次结构标准。稍后会将"buildroot"中的文件放入cpio归档文件,该文件成为RPM的主要部分。当用户在系统上安装RPM时,这些文件将提取到根目录中,并保留正确的层次结构。 项目使用 https://osdn.net/projects/resuse/scm/git/doc/blobs/master/templete.spec?export=raw 作为默认的spec模板。 4.2rpmbuild的使用 rpmbuild -bs a.spec 生成a的SRPM a.src.rpm rpmbuild --rebuild a.src.rpm即可编译a,生成a.x86_64.rpm或者a.noarch.rpm rpmbuild -bb a.spec也可以编译a。 spec文件和bash一样,#后面为注释。推荐参考GNU nano的打包脚本,简单明了。 4.3spec文件结构 Name: 软件的名字,同时也是这个spec文件的文件名 Version: 软件的版本号 Release: 打包的版次,如果Version更新,则版次清零(从0开始标) Summary: 包的简短描述 License: 许可证 ##详细规定见打包规范文件 URL: 源代码下载地址 ##不提供下载地址的需要报备 Source0: 0号源文件一定是源代码文件,除了补丁,必须要被打包的文件依次从1开始编号。 Patch0:0号补丁文件,patch或者diff文件。如有需要,依次编号。 BuildArch: 不区分架构的软件写noarch,比如python, perl写的软件。x86_64不写。 ##暂不考虑aarch64的 ##Warning: 任何32位库依然作为x86_64的软件! BuildRequires: 编译依赖。可以写在同一行。 ##在项目统一通知前,不要写编译依赖! Requires: 运行依赖。除了glibc之外的所有依赖。 ExcludeArch: 无法打包的架构。 ##暂不使用 %description 软件的详细描述。请注意强制换行。 %prep 编译前的准备工作,比如解包。 %build 编译。 %install 安装。 %check 测试编译情况。 %files 编译出来的文件,SOURCES1开始的文件要放在哪里。 %changelog 打包日志。 4.4marco ##marco相对复杂,如果翻译/解释的不对一定要提出来 把宏注释掉用%%。 4.4.1%global [(opts)] 以及%define [(opts)] 作用是定义一个宏,比如 %global sample temp.spec 即将temp.spec赋值给sample。%global作用域为全文,而%define作用域有限,仅适用于指定部分。请尽量使用%global,原因参见https://docs.fedoraproject.org/en-US/packaging-guidelines/#_global_preferred_over_define 宏的名称(name字段)至少3个字符,可以是字母、数字或者_。定义宏可以没有参数。opts的传递与getopt(bash内建的getopt)的传递完全相同,以便在宏调用开始时进行argc/argv处理。在扩展参数化宏时,可以使用以下类似于Shell的宏: %0 被调用的宏的名称 %* 所有参数 (与shell不同,不包括任何已处理的标志) %** 所有参数 (包括任何已处理的标志) %# 参数数量 %{-f} 标记f本身,如果在调用时出现 ##flag f详见https://rpm.org/user_doc/macros.html Writing a Macro段,实在看不懂 %{-f*} 标记f的参数,如果在调用时出现 %1, %2 参数自己 (在getopt处理之后) 4.4.2%setup 默认的%setup会自动清理工作空间,解压源代码包,以及让工作空间的权限正常。 %setup -q为静默工作。 %setup -n name 强制将解压出来的一级文件夹重命名为name(适用于一级文件夹带版本号) %setup -D 不清理工作空间(比如需要二次解压某个文件) %setup -b 在进入工作空间前解压某个源代码包 %setup -a 在进入工作空间后解压某个源代码包 %setup -c 与 %setup -T见PDF P63,不常用 4.4.3%files %license 许可证文件 %doc 帮助文档,范例之类的