实战RPM包制作

摘要:
以前,如果在进行rpm时没有特殊设置,那么rpm包和相应的debuginfo包将同时在RPMS目录中生成。可以在中创建rpm包。当前用户目录中的rpm宏文件(如果没有,以下规范文件以nginx为例:类似于C语言中的宏#Name,它指定软件的名称,名称:%{Name}-%{version}.tar.gz#BuildRoot,它指定makeinstall的测试安装目录。

  在开发中经常会用到一些rpm包,但是一直没有自己手动制作过。今天在制作的时候意外地还解决了自己以前一直困惑的问题,就是怎么制作rpm debuginfo包,类似CentOS官网那样的debuginfo包。原来在制作rpm时如果没有特殊设置就会在RPMS目录下同时生成rpm包及对应的debuginfo包。
  下面总结一下制作rpm包的流程以及遇到的一些问题的解决。
  1、配置工作路径
  在制作rpm包之前,首先要配置工作路径,也就是制作rpm包所在的目录,当前的工作路径可以通过rpmbuild命令查看,如下所示:

实战RPM包制作第1张


  工作路径是由_topdir变量指定的,默认情况下是当前用户目录下的rpmbuild目录。如果你在制作rpm包之前不知道需要设置工作路径的话,只是单纯地照搬网上的一些文章,在后面制作的时候很有可能会报找不到源码包等类似的错误。如果你不想在用户目录下的rpmbuild目录制作rpm包,可以在当前用户目录下的.rpmmacros文件(如果没有,则创建)中修改,格式为:
% _topdir 你的目录
我这里设置的是/usr/src/redhat,后面的制作过程都是在这个目录下进行。
  默认情况下会生成debuginfo包,如果不需要debuginfo包,在.rpmmacros文件中添加"%debug_package %{nil}"。
2、建立所需要的目录
mkdir -pv /usr/src/redhat/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}
 目录说明:

实战RPM包制作第2张


3、编写spec文件

  spec文件是制作rpm包的关键,定义了rpmbuild命令生成时需要遵循的一些规则。下面的spec文件是以nginx为例来制作rpm包:

# 这个区域定义的Name、Version这些字段对应的值可以在后面
# 通过%{name},%{version}这样的方式来引用,类似于C语言中的宏
 
# Name制定了软件的名称
Name:       nginx
# 软件版本
Version:    1.5.2 
# 释出号,也就是第几次制作rpm
Release:    1%{?dist}
# 软件的介绍,必须设置,最好不要超过50个字符
Summary:    Nginx from WangYing
 
# 软件的分组,可以通过/usr/share/doc/rpm-4.8.0/GROUPS文件中选择,也可以
# 在相应的分类下,自己创建一个新的类型,例如这里的Server
Group:      Application/Server
# 许可证类型
License:    GPL
# 软件的源站
URL:        http://nginx.org
# 制作rpm包的人员信息
Packager:   WangYing <justlinux2010@gmail.com>
# 源码包的名称,在%_topdir/SOURCE下,如果有多个源码包的话,可以通过
# Source1、Source2这样的字段来指定其他的源码包
Source0:    %{name}-%{version}.tar.gz
# BuildRoot指定了make install的测试安装目录,通过这个目录我们可以观察
# 生成了哪些文件,方便些files区域。如果在files区域中写的一些文件报
# 不存在的错误,可以查看%_topdir/BUILDROOT目录来检查有哪些文件。
BuildRoot:  %_topdir/BUILDROOT
# 指定安装的路径
Prefix:     /usr/local/nginx-1.5.2
 
# 制作过程需要的工具或软件包
BuildRequires:  gcc,make
# 安装时依赖的软件包
Requires: pcre,pcre-devel,openssl
 
# 软件的描述,这个可以尽情地写
%description
Nginx is a http server
 
# %prep指定了在编译软件包之前的准备工作,这里的
# setup宏的作用是静默模式解压并切换到源码目录中,
# 当然你也可以使用tar命令来解压
%prep
%setup -q
 
# 编译阶段,和直接编译源代码类似,具体的操作或指定的一些参数由configure文件决定。
%build
CFLAGS="-pipe -O2 -g -W -Wall -Wpointer-arith -Wno-unused-parameter -Werror" ./configure --prefix=%{prefix}
# make后面的意思是:如果是多处理器,则并行编译
make %{?_smp_mflags}
 
# 安装阶段
%install
# 先删除原来的测试安装的,只有在制作失败了%{buildroot}目录才会有内容,
# 如果成功的话,目录下会被清除。
# %{buildroot}指向的目录不是BuildRoot(%_topdir/BUILDROOT)指定的目录,
# 而是该目录下名称与生成的rpm包名称相同的子目录。例如我的是
# /usr/src/redhat/BUILDROOT/nginx-1.5.2-1.el6.x86_64
rm -rf %{buildroot}
# 指定安装目录,注意不是真实的安装目录,是在制作rpm包的时候指定的
# 安装目录,如果不指定的话,默认就会安装到configure命令中指定的prefix路径,
# 所以这里一定要指定DESTDIR
make install DESTDIR=%{buildroot}
 
# 安装前执行的脚本,语法和shell脚本的语法相同
%pre
 
# 安装后执行的脚本
%post
 
# 卸载前执行的脚本,我这里的做的事情是在卸载前将nginx服务器停掉
%preun
    MSG=`ps aux | grep nginx | grep -v "grep"`
    if [ -z "$MSG" ];then
        killall nginx 1>/dev/null 2>/dev/null
    fi
 
# 卸载完成后执行的脚本
%postun
    rm -rf %{prefix}
 
# 清理阶段,在制作完成后删除安装的内容
%clean
rm -rf %{buildroot}
 
#指定要包含的文件
%files
#设置默认权限,如果没有指定,则继承默认的权限
%defattr  (-,root,root,0755)
%{prefix}

如果在制作的过程中报类似下面的错误,检查你的files区域,看要包含的文件是否存在。

+ /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/redhat/brp-strip-comment-note /usr/bin/strip /usr/bin/objdump
+ /usr/lib/rpm/brp-python-bytecompile
+ /usr/lib/rpm/redhat/brp-python-hardlink
+ /usr/lib/rpm/redhat/brp-java-repack-jars
Processing files: nginx-1.5.2-1.el6.x86_64
error: File not found: /usr/src/redhat/BUILDROOT/nginx-1.5.2-1.el6.x86_64/usr/local/nginx
 
 
RPM build errors:
    File not found: /usr/src/redhat/BUILDROOT/nginx-1.5.2-1.el6.x86_64/usr/local/nginx

免责声明:文章转载自《实战RPM包制作》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇删除mysql中user为空用户,mysql空密码Cypress web自动化35-cy.exec()执行python命令操作数据库下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Beyond Compare如何展开所有子文件夹

在平时工作的时候有些人需要比较文件的差异,如果文件内容或者文件夹内容比较多,手动检查差异很费时间,我们可以使用一款叫Beyond Compare比较工具,节省了我们大量的时间。Beyond Compare是一款不可多得的专业级的文件夹和文件对比工具,编程必备软件。当我们用它比较文件时,发现文件夹里有子文件夹,那么该怎么展开所有的子文件夹呢?本节我们来学学B...

请求响应,session,闪现

请求相关 # 请求相关信息 # request.method # request.args # request.form # request.values # request.cookies # request.headers # reques...

使用电脑模拟微信内置浏览器

最近在弄微信开发,需要微信请求,其实很好改 只要把请求头改了就好了。 浏览器呢 就使用 chrome我在这使用360极速浏览器了。 首先进入开发者模式(F12或者右键审查元素) 如图: 然后 点击 更多 选 More tools 打开Network conditions 最后设置请求为微信请求: 最后那个请求是自...

Total Commander如何设置自定义快捷键在当前目录打开ConEmu

Total Commander,简称TC,原名Windows Commander,是Windows平台下功能最强大的全能文件管理器。 自从使用了TC基本上就很少再打开Window的文件夹了,因为TC不仅内置了很多功能,而且还有很多的插件可以扩展,所以大部分功能都可以直接在该软件里实现. TC提供了基本上所有的自定义功能,如自定义快捷键等,在TC的Ctrl...

软件测试方案模板

第一章 概述 ​ 软件的错误是不可避免的,所以必须经过严格的测试。通过对本软件的测试,尽可能的发现软件中的错误,借以减少系统内部各模块的逻辑,功能上的缺陷和错误,保证每个单元能正确地实现其预期的功能。检测和排除子系统(或系统)结构或相应程序结构上的错误,使所有的系统单元配合合适,整体的性能和功能完整。并且使组装好的软件的功能与用户要求(即常说的产品策划案)...

#pragma用法详解

Author :Jeffrey  My Blog:http://blog.csdn.net/gueter/ 目录:(0)   前言(1) #pragma message能够在编译信息输出窗口中输出相应的信息(2) #pragma code_seg能够设置程序中函数代码存放的代码段,开发驱动程序的时会用到(3) #pragma  once若用在头文件的最开...