rpm 打包

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

Creating RPM packages :: Fedora Docs (fedoraproject.org)

How RPM packages are made: the spec file - Fedora Magazine

需要了解的概念

什么是RPM?
RPM包简单来说也是一个文件,该文件包含系统所需的其他文件和有关这些文件的信息的文件。具体来说,RPM包由包含文件的cpio归档和包含包的元数据的RPM头组成。rpm包管理器使用此元数据确定依赖项、文件安装位置和其他信息。

有两种类型的RPM包:

  • source RPM (SRPM)
  • binary RPM

SRPMbinary RPM 拥有相同的文件格式和工具,但是内容不同、目的不同。
SRPM 包含了源码,可选的补丁包,以及SPEC文件。SPEC文件指导如何将源码编译为binary RPM。
Binary RPM 包含了从源码和补丁编译的二进制文件。

一、准备工作

  1. 安装依赖
yum install gcc rpm-build rpm-devel rpmlint make python bash coreutils diffutils patch rpmdevtools
  1. 执行命令rpmdev-setuptree生成目录框架,默认目录~/rpmbuild/
[root@VM-99-33-centos ~]# tree ~/rpmbuild/
/root/rpmbuild/
|-- BUILD
|-- RPMS
|-- SOURCES
|-- SPECS
`-- SRPMS

5 directories, 0 files
目录 用途 备注
BUILD 生成包时,将在此处创建各种%buildroot目录。可用于编译失败,而日志又没有提供足够的信息的检查。
RPMS Binary RPMs will land here in subdirectories of Architecture. For example: noarch and x86_64
SOURCES Compressed source archives and any patches should go here, this is where the rpmbuild command will look for them.
SPECS SPEC files live here.
SRPMS When the correct arguments are passed to rpmbuild to build a Source RPM instead of a Binary RPM, the Source RPMs (SRPMS) will land in this directory.

二、创建spec文件

SPECS目录下执行rpmdev-newspec $specfilename创建spec文件。可以创建多个spce文件。

[root@VM-99-33-centos rpmbuild]# cd SPECS/

[root@VM-99-33-centos SPECS]# rpmdev-newspec bello
bello.spec created; type minimal, rpm version >= 4.11.

[root@VM-99-33-centos SPECS]# ls
bello.spec

[root@VM-99-33-centos SPECS]# cat bello.spec 
Name:           bello
Version:        
Release:        1%{?dist}
Summary:        

License:        
URL:            
Source0:        

BuildRequires:  
Requires:       

%description


%prep
%setup -q


%build
%configure
make %{?_smp_mflags}


%install
rm -rf $RPM_BUILD_ROOT
%make_install


%files
%doc



%changelog

说明1、preamble-items

SPEC Directive Definition
Name 包名,与SPEC文件名匹配。
Version 软件的上游版本号。
Release 初始值通常是 1%{?dist},随着包的release增长。如果是新版本,则重置为1。
Summary 概况,一条述。
License 授权。
URL 项目网址。
Source0 源码网址。可以多个,比如:Source1, Source2, Source3。
Patch0 所必要的第一个补丁名称。可以多个,比如:Patch1, Patch2, Patch3。
BuildArch 如果不依赖处理器架构,比如以解释型语言编写,则为BuildArch: noarch
否则会继承运行编译主机的处理器架构。
BuildRequires 编译程序所需的包的列表,以逗号或空格分隔。可以有多个条目,每条一行。
Requires 安装软件后运行所需的包的列表,以逗号或空格分隔。可以有多个条目,每条一行。
ExcludeArch 如果某个软件无法在特定的处理器体系结构上运行,可以在此排除它。

2、body-items

SPEC Directive Definition
%description RPM打包软件的完整描述,可能会占用多行代码,并分成多个段落。
%prep 编译软件所需的一条或一组命令。范例是解压缩Source0中的归档文件。可以是shell脚本。
%build 编译软件所执行的一条或一组命令。
%install 实际安装各种制品到FHS中目标位置的一条或一组命令。注意,这是在%buildroot的相对上下文中完成的。
%check “测试”软件的命令或一系列命令。通常是单元测试之类。
%files 列表中的文件将安装于目标系统上下文的将resting place ^^。
%changelog 不同Version或Release的变更记录。

三、修改spec文件

修改spec文件如下:

Name:           bello
Version:        0.1
Release:        1%{?dist}
Summary:        Hello World example implemented in bash script

License:        GPLv3+
URL:            https://example.com/%{name}
Source0:        https://example.com/%{name}/release/%{name}-%{version}.tar.gz

BuildRequires:
Requires:       bash

BuildArch:      noarch

%description
The long-tail description for our Hello World Example implemented in
bash script

%prep
%setup -q

%build

%install
mkdir -p %{buildroot}/%{_bindir}
install -m 0755 %{name} %{buildroot}/%{_bindir}/%{name}

%files
%license LICENSE
%{_bindir}/%{name}


%changelog
* Tue May 31 2016 Adam Miller <maxamillion@fedoraproject.org> - 0.1-1
- First bello package
- Example second item in the changelog for version-release 0.1-1
  • %description,比Summary更长、更全面的关于包的描述。可以多段。

  • %build,指示系统如何编译包。范例不需要编译,所以留白。

  • %install,指示 rpmbuild 如何安装编译号的软件到 BUILDROOT ,并且我们需要构建目录层次结构,以便我们在指定位置安装软件。RPM Macros 帮助我们解决该问题,无需我们对路径硬编码。范例中,为了将bello安装到该环境,我们唯一要做的事就是为bash script创建目标目录,然后将文件安装到该目录。我们通过install命令实现,但是略有更改,因为在SPEC文件中我们使用%{name}宏变量来保持一致性。

  • %files, RPM安装文件的列表,以及文件安装的位置。注意,这与%{buildroot}无关,而是与文件的完整路径有关,因为安装后文件将存在于最终系统中。 因此,bellow file的安装列表是%{_bindir}/%{name},如果不使用宏那就配置成/usr/bin/bello
    有时还需要一个内置宏来提供文件的上下文。可用于系统管理员和最终用户通过rpm查询包信息。我们在这里使用的内置宏是%license,它将告诉rpmbuild这是包文件清单元数据中的软件许可证文件。

  • %changelog, 与包的特定版本相关的带日期戳的列表。这并非记录软件的变化,而是打包的变化。例如,如果软件包中的软件需要修补,或者%build部分中列出的构建过程中需要更改,则信息将显示在此处。每个更改条目可以包含多个项目,并且每个项目应以新行开始,并以-字符开头。
    注意格式,时间戳以 * 符号开头,然后是周、月、日、年,RPM Packager联系人信息。然后,在Version-Release之前,我们有一个-字符,约定俗成,不是规定。最后是Version-Release

四、编译RPM包

  1. 源码准备
    上传bello-0.1.tar.gz~/rpmbuild/SOURCES/目录,不用解压

  2. 编译
    rpmbuild -bs 编译成SRPM
    rpmbuild -bb 编译成 BINARY RPM

[root@VM-99-33-centos rpmbuild]# rpmbuild -bb SPECS/bello.spec 
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.1wvHwU
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd /root/rpmbuild/BUILD
+ rm -rf bello-0.1
+ /usr/bin/tar -xf -
+ /usr/bin/gzip -dc /root/rpmbuild/SOURCES/bello-0.1.tar.gz
+ STATUS=0
+ '[' 0 -ne 0 ']'
+ cd bello-0.1
+ /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w .
+ exit 0
Executing(%build): /bin/sh -e /var/tmp/rpm-tmp.Crik0Z
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd bello-0.1
+ exit 0
Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.pYTCv5
+ umask 022
+ cd /root/rpmbuild/BUILD
+ '[' /root/rpmbuild/BUILDROOT/bello-0.1-1.el7.x86_64 '!=' / ']'
+ rm -rf /root/rpmbuild/BUILDROOT/bello-0.1-1.el7.x86_64
++ dirname /root/rpmbuild/BUILDROOT/bello-0.1-1.el7.x86_64
+ mkdir -p /root/rpmbuild/BUILDROOT
+ mkdir /root/rpmbuild/BUILDROOT/bello-0.1-1.el7.x86_64
+ cd bello-0.1
+ mkdir -p /root/rpmbuild/BUILDROOT/bello-0.1-1.el7.x86_64//usr/bin
+ install -m 0755 bello /root/rpmbuild/BUILDROOT/bello-0.1-1.el7.x86_64//usr/bin/bello
+ /usr/lib/rpm/find-debuginfo.sh --strict-build-id -m --run-dwz --dwz-low-mem-die-limit 10000000 --dwz-max-die-limit 110000000 /root/rpmbuild/BUILD/bello-0.1
/usr/lib/rpm/sepdebugcrcfix: Updated 0 CRC32s, 0 CRC32s did match.
+ '[' noarch = noarch ']'
+ case "${QA_CHECK_RPATHS:-}" in
+ /usr/lib/rpm/check-buildroot
+ /usr/lib/rpm/redhat/brp-compress
+ /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
Processing files: bello-0.1-1.el7.noarch
Executing(%license): /bin/sh -e /var/tmp/rpm-tmp.Q1LfDb
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd bello-0.1
+ LICENSEDIR=/root/rpmbuild/BUILDROOT/bello-0.1-1.el7.x86_64/usr/share/licenses/bello-0.1
+ export LICENSEDIR
+ /usr/bin/mkdir -p /root/rpmbuild/BUILDROOT/bello-0.1-1.el7.x86_64/usr/share/licenses/bello-0.1
+ cp -pr LICENSE /root/rpmbuild/BUILDROOT/bello-0.1-1.el7.x86_64/usr/share/licenses/bello-0.1
+ exit 0
Provides: bello = 0.1-1.el7
Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1
Requires: /bin/bash
Checking for unpackaged file(s): /usr/lib/rpm/check-files /root/rpmbuild/BUILDROOT/bello-0.1-1.el7.x86_64
Wrote: /root/rpmbuild/RPMS/noarch/bello-0.1-1.el7.noarch.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.sUCUko
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd bello-0.1
+ /usr/bin/rm -rf /root/rpmbuild/BUILDROOT/bello-0.1-1.el7.x86_64
+ exit 0
  1. 测试安装
[root@VM-99-33-centos noarch]# rpm -ivh bello-0.1-1.el7.noarch.rpm 
Preparing...                          ################################# [100%]
Updating / installing...
   1:bello-0.1-1.el7                  ################################# [100%]
[root@VM-99-33-centos noarch]# 
[root@VM-99-33-centos noarch]# 
[root@VM-99-33-centos noarch]# rpm -qa |grep bello
bello-0.1-1.el7.noarch
[root@VM-99-33-centos noarch]# rpm -ql bello-0.1-1.el7.noarch
/usr/bin/bello
/usr/share/licenses/bello-0.1
/usr/share/licenses/bello-0.1/LICENSE

附件一、BuildRoots

术语 buildroot 有多个定义。但是,在RPM软件包的生态中,是一个chroot环境,这样可以在一个新的虚拟根目录中创建文件系统,然后可以将这些内容放在实际的文件系统上,而不会破坏其完整性。
就类似于将tarball解压,在现有系统的根(/)目录中展开,这就是RPM在安装事务中的某个部分所做的事情。最终,从二进制RPM包解压,并放入 cpio 归档。

cpio 是什么?
一个非常古老的归档工具。

附件二、RPM Macros

RPM 宏是一种纯文本替换,在使用某些内置功能时,可以根据可选值有条件地赋值。这意味着RPM可以执行文本替换,无需我们干涉。

这对于RPM打包非常有用,如果我们想在SPEC文件中多次引用正在打包的软件版本,但只想定义一次。我们可以使用%{version}宏,它将被在SPEC的version字段中定义的实际版本号替换。

rpm --eval 快速解析宏

[root@VM-99-33-centos ~]# rpm --eval %{_bindir}
/usr/bin
[root@VM-99-33-centos ~]# rpm --eval %{_libexecdir}
/usr/libexec
[root@VM-99-33-centos ~]# rpm --eval %{?dist}
.el7
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354

推荐阅读更多精彩内容

  • 本文是以 RPM Packaging Guide[https://rpm-packaging-guide.gith...
    marsCatXDU_李经纬阅读 879评论 0 0
  • 1.安装 rpm-build 包 yum install rpm-build可以先查看下rpmbuild版本,如果...
    Phelans阅读 6,781评论 0 0
  • RPM(Redhat Package Manager)是用于Redhat、CentOS、Fedora等Linux ...
    IARNO阅读 2,424评论 0 2
  • 1.RPM目录结构 2.spec文件综述 spec文件有什么用? spec文件有两个用途:构建和打包。构建即将源码...
    weiee阅读 4,310评论 0 1
  • 最近工作中需要针对freescale的iMX5和iMX6平台做一些arm平台下的系统核心软件包的集成,比如将gli...
    雪域迷影阅读 841评论 0 0