在开发中经常会用到一些rpm包,但是一直没有自己手动制作过。今天在制作的时候意外地还解决了自己以前一直困惑的问题,就是怎么制作rpm debuginfo包,类似CentOS官网那样的debuginfo包。原来在制作rpm时如果没有特殊设置就会在RPMS目录下同时生成rpm包及对应的debuginfo包。
  下面总结一下制作rpm包的流程以及遇到的一些问题的解决。

  1、配置工作路径

  在制作rpm包之前,首先要配置工作路径,也就是制作rpm包所在的目录,当前的工作路径可以通过rpmbuild命令查看,如下所示:

工作路径是由_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}

 目录说明:

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包制作的更多相关文章

  1. php-7.1.0 rpm包制作

    nginx-1.8.0 rpm包制作见上篇文章:http://www.cnblogs.com/xiaoming279/p/6251149.html spec文件 Name: php Version: ...

  2. RPM包制作教程

    一.RPM介绍 RPM 前是Red Hat Package Manager 的缩写,本意是Red Hat 软件包管理,顾名思义是Red Hat 贡献出来的软件包管理:现在应为RPM Package M ...

  3. rpm包制作(待实验)

    作者:firefoxbug 时间:July 18, 2014 rpm包命名规范 对于rpm包的命名符合如下规范. %{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}.rpm N ...

  4. RPM包制作方法

    一.RPM介绍 RPM 前是Red Hat Package Manager 的缩写,本意是Red Hat 软件包管理,顾名思义是Red Hat 贡献出来的软件包管理:现在应为RPM Package M ...

  5. rpm包制作介绍

    RPM(Rpm Package Management)在ReadHat等发行版下被用作软件包管理程序,其将某个软件相关的文件置入一个.rpm包中,用rpm命令,我们可以方便地完成Linux下软件安装. ...

  6. nginx-1.8.0 rpm包制作

    1.安装rpm-build # yum install rpm-build 2.创建制作RPM包目录 # cat /root/.rpmmacros %_topdir /root/rpmbuild %_ ...

  7. RPM包制作过程(一)

    本机环境:centos7,64位 1. 首先安装工具,rpmbuild可能在rpmdevtools里已经包含 #yum install rpm-devel.x86_64 #yum install rp ...

  8. 简单介绍RPM包制作方法

    RPM是RedHat Package Manager(RedHat软件包管理工具)的缩写,是一种用于互联网下载包的打包及安装工具,它包含在某些Linux分发版中.它生成具有.RPM扩展名的文件.使用r ...

  9. gtibase rpm包制作

    gitbase 是一个很不错的代码分析工具,我们可以直接使用sql来分析团队的代码,以下是rpm 包的制作 简单说明 rpm 包的制作使用了fpm 一个简单,方便可以跨平台的软件包制作工具 gitba ...

随机推荐

  1. UVA 10896 Sending Email

    这个题目真是伤透脑筋了,一直RE,连着改了好几个版本,又是spfa,又是单调队列dijkstra+单调队列,总是不过,后来发现M开小了,双向边应该开m的两倍,悲剧啊!!!以后不管怎样,数组一定要尽量开 ...

  2. Android include的使用

    如果在程序中多次用到一部分相同的布局,可以先将这部分布局定义为一个单独的XML,然后在需要的地方通过<include>引入,如下: main.xml <?xml version=&q ...

  3. 令人头疼的clientTop、scrollTop、offsetTop

    1.网络上流传的图片 2.稍微容易理解点的示意图 参考链接:http://blog.csdn.net/lidiansheng/article/details/7950751 3.言简意赅的示意图 4. ...

  4. 【HDOJ】1098 Ignatius's puzzle

    数学归纳法,得证只需求得使18+ka被64整除的a.且a不超过65. #include <stdio.h> int main() { int i, j, k; while (scanf(& ...

  5. Webform——注册验证

    服务器控件和客户端控件的交替使用,主要还是获取到各个控件的值,直接用C#或Js判断是否符合条件就可以. 这里是以服务器控件为例子,至于客户端控件则需要写JS代码 .UserBF public clas ...

  6. bzoj1705

    话说这题很久以前就写过,然后好像一直忘了写题解…… 以前看这道题还觉得挺难的,现在觉得好水 首先朴素的想法肯定是动归 f[i,j]表示到处理到第i根电线,最终高度为j的最小花费 f[i,j]:=min ...

  7. .net 破解的几个常用工具

    在.net 破解中我们经常会提到 Reflector\SimpleAssemblyExplorer和CFF Explore这几个工具. 我们以一个简单的确Windows Form程序为例来说说他们怎么 ...

  8. [HDU 1561] The more, The Better

    The more, The Better Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  9. Senparc.Weixin.MP SDK 微信公众平台开发教程(一):微信公众平台注册

    微信公众平台(下面简称“公众平台”)注册步骤和导航还是比较流畅的,因此这个教程对于上网经验丰富的朋友来说,有点多余.不过为了保持教程系列的完整性,这里还是认认真真把流程梳理一遍. 第一步:进入公众平台 ...

  10. 不要浪费人生的每一天 ——Dropbox创始人在麻省理工的演讲 z

    Dropbox 创始人,CEO 德鲁·休斯顿(Drew Houston)近期在美国麻省理工学院的毕业典礼上发表演讲.他向大学生提出了 3 点人生建议:追逐自己感兴趣的事,找到最合适的圈子,以及不要浪费 ...