工具|学习RPM打包

一 前言

本文可能偏运维一些,适合有需求打rpm包的朋友。

不同公司有不同的规范来约束各种linux系统软件安装的路径以及相关配套设施。因此我们可以基于各自的 规范 使用rpm 将各种软件的二进制文件打包来满足各自的定制化需求。本文通过 安装vmtouch软件包,来介绍RPM的相关知识。

二 RPM 基础介绍

首先一图胜千言 ,我们通过下图来了解RPM的文件系统以及核心 spec 文件对其他文件的相关依赖关系。

2.1 初始化rpmbuild

安装 rpmbuild 并准备相关目录文件

sudo yum install make gcc rpmbuild mkdir -p ~/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}

各个目录的用途如下:

BUILD          编译rpm包的临时目录 
BUILDROOT   编译后生成的软件临时安装目录
RPMS          最终生成的可安装rpm包的所在目录
SOURCES    所有源代码和补丁文件的存放目录
SPECS         存放SPEC文件的目录(重要)
SRPMS         软件最终的rpm源码格式存放路径

在*NIX系统中建议为了防止系统函数库或其他文件损坏,不要使用root身份去制作rpm软件包。可以使用一个通用的用户 比如 app。

打包之前需要将源代码以及相关脚本放到 SOURCES 目录中。spec 文件的 Source0 会使用源码文件 vmtouch-1.3.1.tar.gz (注意解压缩之后的文件一定要是 vmtouch-1.3.1,否则会编译报错 )

git clone https://github.com/hoytech/vmtouch.git
mv  vmtouch vmtouch-1.3.1
tar -zcvf vmtouch-1.3.1.tar.gz vmtouch

然后 将 vmtouch-1.3.1.tar.gz 放到 SOURCES。(注意解压缩之后的文件一定要是 vmtouch-1.3.1,否则会编译报错 )

三 spec 文件语法

spec file是rpm打包最核心组件,其内容包含软件包的相关信息,如软件包的名字、版本、类别、说明摘要、创建时要执行什么指令、安装时要执行什么操作、以及软件包所要包含的文件列表等等。本文以 vmtouch.spec 文件为例,介绍 spec的基础语法结构

%define  oname   vmtouch
%define  _target_os Linux
%define  _prefix /usr/local
Name:        vmtouch
Version: 1.3.1
Release: 1%{?dist}
Summary:    vmtouch is a tool for learning about and controlling the file system cache of unix and unix-like systems.
Group: Development/Tools
License:    BSD
URL:        https://github.com/hoytech/vmtouch
Source0:    vmtouch-%{version}.tar.gz
BuildRoot: %(mktemp -ud %{_tmppath}/%{oname}-%{version}-%{release}-XXXXXX)
%description
vmtouch is a tool for learning about and controlling the file system cache of unix and unix-like systems. It is BSD licensed so you can basically do whatever you want with it.
%prep
%setup -q -n %{oname}-%{version}
%build
make
%install
rm -rf %{buildroot}
make PREFIX=%{buildroot}%{_prefix} install
#cp %{buildroot}%{_prefix}/bin/vmtouch /usr/bin/
%clean
rm -rf %{buildroot}
%files
%defattr(-,root,root,-)
%{_prefix}
%attr(0755,root,root)
%{_prefix}/bin/*
%doc
%changelog
*  Mon Nov 04 2019 <yangyidba> 1.3.1-1
   vmtouch 1.3.1

其中 spec file 由 %开头的宏定义的 域段落 组成。我们可以在不同的段落写执行shell命令来完成编译,安装等功能,本文重点讲核心部分。

文件头 定义了软件的相关名字,版本,介绍,软件包所采用的版权规则,源代码路径。

需要注意的是安装软件依赖的其他基础组件 ,比如安装redis 要使用

BuildRequires: zlib-devel #制作rpm包时,所依赖的基本库 Requires: zlib gcc tcl jemalloc #安装rpm包时,所依赖的软件包

%prep

预处理段,顾名思义,该段内容通常用来执行一些解压缩开源程序包的命令,为下一步的编译安装作准备。%prep和下面的%build,%install段一样,除了可以执行RPM所定义的宏命令(以%开头)以外,还可以执行SHELL命令,比如mkdir,cp。

%build

主要执行 make 命令。

%install

执行 make install 安装程序 ,可以指定PREFIX。也可以做其他shell 命令满足安装软件的需求。

%clean

安装完,清理临时文件或者编译的文件

%files

用于定义程序所包含的文件,可执行程序,配置文件,说明文档(doc),还可定义文件访问权限,owner 属组。

%changelog

操作日志,记录rpm变更的记录 谁,什么时间,做了什么内容。

%prerpm安装前执行的脚本

%postrpm安装后执行的脚本

%preun rpm卸载前执行的脚本

%postunrpm卸载后执行的脚本

四 打包

spec文件编写完成,我们就可以使用 rpmbuild 打包. 包分为两种一种是标准的 RPM包,直接生成二进制文件的。另外一种是SRPM 包,带有源代码的。

rpmbuild -ba program.spec

-ba 参数 会创建两个包:RPM 会保存至 ~/rpmbuild/RPMS,SRPM 会保存至 ~/rpmbuild/SRPMS。

如果只想创建 RPM, 可以执行:

rpmbuild -bb vmtouch.spec

如果只想创建 SRPM(不需要执行 %prep 或 %build 或其他阶段),请执行:

rpmbuild -bs vmtouch.spec

本文分享自微信公众号 - yangyidba(yangyidba)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-11-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏CU技术社区

Linux 之父如何定义 Linux?

LINUX是一个免费类unix内核,适用于386-AT计算机,附带完整源代码。主要让黑客、计算机科学学生使用,学习和享受。它大部分用C编写,但是一小部分是用gn...

7810
来自专栏Java知己

为什么不允许使用 Java 静态构造函数?

不允许使用 Java 静态构造函数,但是为什么呢?在深入探讨不允许使用静态构造函数的原因之前,让我们看看如果要使 构造函数静态化 会发生什么。

11070
来自专栏cwl_Java

3分钟速读原著《深入理解Java虚拟机》(一)

7110
来自专栏cwl_Java

C++-入门语法(一)

5400
来自专栏CU技术社区

微软更新Linux子系统,编译WSL 2内核只需3步

今年,微软在Build大会上向开发者放了两个“大招”:Windows Terminal和WSL 2。两个工具都是为了向开发者提供类似于Linux的体验。

6610
来自专栏Sorrower的专栏

记一次macOS Mojave升级GCC

9420
来自专栏FECoding

探究 source map 在编译过程中的生成原理

source map 是开发时调试代码的利器之一。现代的构建工具如 webpack 早已对 source map 有了完备的支持,对照文档就能很容易在打包时顺手...

10230
来自专栏杨建荣的学习笔记

MySQL数据流转集成,从快速测试Maxwell开始

在Binlog解析方向和数据流转方向上,经常会提到比较有名的几类工具,阿里的Canal,Zendesk的Maxwell和Yelp的mysql_streame...

8210
来自专栏移动直播SDK License

移动直播 SDK License 使用指南

您可以免费申请测试 License(基础版,有效期14天,可申请两次)体验测试,具体步骤如下:

10500
来自专栏lhyt前端之路

内功修炼之lodash——chunk、zip、groupBy、invokeMap方法

本文实现方法都是看效果倒推实现方法,并进行一些拓展和思考,和源码无关。lodash这个库在这里更像一个题库,给我们刷题的

9320

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励