【Linux学习】RPM包制作

1,package环境准备

1)打包命令安装(推荐直接上rpmdevtools)

yum -y install rpm-build

或者直接安装rpmdevtools,这个工具还包含一些其他的工具,同时它依赖rpm-build,所以直接安装的话会同时把rpm-build装上。

yum install rpmdevtools

2)编译工具安装

比如C语言的make、gcc,python的setuptools等,根据需要安装即可。

2,配置工作空间

  1. 执行rpmdev-setuptree命令(rpmdevtools的命令),设置工作空间。
rpmdev-setuptree

运行了这个命令之后,在root目录下多了一个rpmbuild的文件夹,里边内容如下(具体介绍见后文,此处仅做流程演示):

$ tree rpmbuild
rpmbuild
├── BUILD
├── RPMS
├── SOURCES
├── SPECS
└── SRPMS

如果没有安装rpmdevtools的话,其实用mkdir命令创建这些文件夹:

mkdir -p ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
  1. 源代码tar包或者tar.gz放入SOURCES文件夹下。

工作空间介绍:

默认位置宏代码名称用途
~/rpmbuild/SPECS%_specdirSpec 文件目录保存 RPM 包配置(.spec)文件
~/rpmbuild/SOURCES%_sourcedir源代码目录保存源码包(如 .tar 包)和所有 patch 补丁
~/rpmbuild/BUILD%_builddir构建目录源码包被解压至此,并在该目录的子目录完成编译
~/rpmbuild/BUILDROOT%_buildrootdir最终安装目录保存 %install 阶段安装的文件
~/rpmbuild/RPMS%_rpmdir标准 RPM 包目录生成/保存二进制 RPM 包
~/rpmbuild/SRPMS%_srcrpmdir源代码 RPM 包目录生成/保存源码 RPM 包(SRPM)

其中,“宏代码”这一列就可以在SPEC文件中用来代指所对应的目录,类似于编程语言中的宏或全局变量。当然~/rpmbuild这个文件夹也是有宏代码的,叫做%_topdir

3,SPEC文件

SPECS下是RPM包的配置文件.spec文件,是RPM打包的“图纸”,这个文件会告诉rpmbuild命令如何去打包。

Emacs 和 vi 的最新版本有 .spec 文件编辑模式,它会在创建新文件时打开一个类似的模板。所以可使用以下命令来自动使用模板文件:

$ cd ~/rpmbuild/SOURCES
$ wget http://ftp.gnu.org/gnu/hello/hello-2.10.tar.gz

spec文件对应的各个阶段:

阶段读取的目录写入的目录具体动作
%prep%_sourcedir%_builddir读取位于 %_sourcedir 目录的源代码和 patch 。之后,解压源代码至 %_builddir 的子目录并应用所有 patch。
%build%_builddir%_builddir编译位于 %_builddir 构建目录下的文件。通过执行类似 ./configure && make 的命令实现。
%install%_builddir%_buildrootdir读取位于 %_builddir 构建目录下的文件并将其安装至 %_buildrootdir 目录。这些文件就是用户安装 RPM 后,最终得到的文件。注意一个奇怪的地方: 最终安装目录 不是 构建目录。通过执行类似 make install 的命令实现。
%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 包通常用于审核和升级软件包。

在SPEC目录下,vim hello.spec,是系统提供的模板,照着改就行:

##这些东西是rpm -qpi test.rpm 的时候显示的数据 对打包没什么影响
Name:     软件名
Version:     版本号
Release:       发布编号
Summary:    简要说明,英文的话第一个字母应大写,以避免 rpmlint 工具(打包检查工具)警告
Group:  用于按照 /usr/share/doc/rpm-/GROUPS 分类软件包。目前该标记已丢弃,可以直接del
License: 说明软件包的协议版本,审查软件的 License 状态是打包者的职责,这可以通过检查源码或 LICENSE 文件,或与作者沟通来完成。
URL:软件的主页
Source0:
BuildRequires:  编译依赖
#Requires:
Build Arch: 指编译的目标处理器架构,noarch标识不指定,但通常都是以/usr/lib/rpm/marcros中的内容为默认值
%description  多行,由指令下一行开始,空行结束
%define _path /opt/monitor-service   全局变量,最终安装的路径


%prep    
%setup -n %{name}   #把源码包解压并放好

%install
mkdir -p %{buildroot}%{_path}
cp -a %{_builddir}/%{name} %{buildroot}%{_path}


%files
%{_path}/%{name}

%changelog          

1)%prep阶段

描述了解压源码包的方法。

1>%autosetup 命令

%autosetup 命令用于解压源码包。可用选项包括:

-n name : 如果源码包解压后的目录名称与 RPM 名称不同,此选项用于指定正确的目录名称。例如,如果 tarball 解压目录为 FOO,则使用 “%autosetup -n FOO”。
-c name : 如果源码包解压后包含多个目录,而不是单个目录时,此选项可以创建名为 name 的目录,并在其中解压。

2>%setup 命令

如果使用 %setup 命令,通常使用 -q 抑止不必要的输出。
如果需要解压多个文件,有更多 %spec 选项可用,这对于创建子包很有用。常用选项如下:

-a number:在切换目录后,只解压指定序号的 Source 文件(例如 “-a 0” 表示 Source0)。
-b number :在切换目录前, 只解压指定序号的 Source 文件(例如 “-b 0” 表示 Source0)。
-D:解压前,不删除目录。
-T:禁止自动解压归档。

3>%patch 命令

如果使用 %autosetup 命令,则不需要手动进行补丁管理。如果你的需求很复杂,或需要与 EPEL 兼容,需要用到此部分的内容。%patch0 命令用于应用 Patch0(%patch1 应用 Patch1,以此类推)。Patches 是修改源码的最佳方式。常用的 -pNUMBER 选项,向 patch 程序传递参数,表示跳过 NUM 个路径前缀。

2)%build阶段

编译阶段,不需要太多操作。

3)%install阶段

从 ~/rpmbuild/BUILD 复制到 ~/rpmbuild/BUILDROOT/XXX

4)%check 阶段

测试阶段,需要添加。

5)%files 部分

此部分列出了需要被打包的文件和目录。决定了最后源码安装的路径。
%defattr 用于设置默认文件权限,通常可以在 %files 的开头看到它。注意,如果不需要修改权限,则不需要使用它。其格式为:

%defattr(<文件权限>, <用户>, <用户组>, <目录权限>)

4,打包

执行spec文件,进行编译、预安装、清理。
编译过程在BUILD中完成。
预安装:把软件包应该包含的内容(比如二进制文件、配置文件、man文档等)复制到BUILDROOT中,并按照实际安装后的目录结构组装。

5,RMP包

生成的RPM包放置到RPMS,生成文件格式:{Name}-{Version}-{Release}.{Arch}.rpm 除了Arch,其它都在spec文件中配置;由于没有指定arch为noarch,所以默认用本机架构。

system-info-1.0-1.el7.centos.x86_64.rpm

Noarch:代表跟硬件体系结构无关,不管是 x86、PowerPC,Sparc 或 Alpha 系统。

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值