标签归档:centos,RPM ,sheepdog

CentOs6.4-x86_64上使用源码制作RPM包

本文通过实例将sheepdog源码包成RPM包,描述在linux发行版Centos6.4-x86_64下制作RPM包的全过程。

在Centos下制作RPM包依赖rpm-build这个包,所以需要提前安装好该软件包。

RPM生成要素

生成rpm所用的文件列表或者源代码

根据文件列表或者源代码生成rpm规范,也就是spec文件

根据spec文件加工源码/文件的工具rpmbuild

 

1.依赖软件rpm-build

CentOS6.4上已包含该软件,如果没有则安装,安装命令如下:

yum install rpm-build

2.配置工作路径

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

# rpmbuild –showrc |grep topdir

-14: _builddir  %{_topdir}/BUILD

-14: _buildrootdir      %{_topdir}/BUILDROOT

-14: _desktopdir        %{_datadir}/applications

__mingw32_topdir=.; if ! test -x configure; then __mingw32_topdir=..; fi; \

$__mingw32_topdir/configure –cache-file=%{_mingw32_cache} \

-14: _rpmdir    %{_topdir}/RPMS

-14: _sourcedir %{_topdir}/SOURCES

-14: _specdir   %{_topdir}/SPECS

-14: _srcrpmdir %{_topdir}/SRPMS

-14: _topdir    %{getenv:HOME}/rpmbuild

工作路径是由_topdir变量指定的,默认情况下是当前用户目录下的rpmbuild目录。

该变量存在于/usr/lib/rpm/macros文件中,一般情况下不需要修改,但是如果系统刚找不到工作路径,那么就得去修改%_topdir变量了。

3.建立打包必须目录

cd /root/rpmbuild/

mkdir BUILD BUILDROOT SOURCES SPECS RPMS SRPMS

相关目录介绍:

/root/rpmbuild/SOURCES  — 存放源代码,补丁,图标等文件。

/root/rpmbuild/SPECS     — 存放用于管理rpm制作进程的spec文件。

/root/rpmbuild/BUILD     — 解压后的文件存放在这里。

/root/rpmbuild/RPMS     — 存放由rpmbuild制作好的二进制包。

/root/rpmbuild/SRPMS     —存放由rpmbuild制作好的源码包。

 

4.准备源码

cd SOURCES

准备源码压缩包***.tar.gz  或者 ***.tar.bz2,放置在/root/rpmbuild/SOURCES目录下。

在CentOs6.4中.gz .bz2格式的压缩包都能解压。注意两点:

(1)              这里的源码压缩包要包含configure文件,或者直接已经含有makefile文件。比如通过git获取的源码,初始状态往往没有configure文件需要执行脚本获取该configure文件。

(2)              如果是自己压缩的源码包请注意将依源码目录名称来命名源码包,比如sheepdog-0.7.0.tar.gz,则源码目录名称该为sheepdog-0.7.0,保证解压后名称与压缩包名称一致,否则后面打包时会找不到预设目录而出错。

5.创建SPEC文件

进入/root/rpmbuild/SPECS目录,然后创建spec文件,注意后缀名不能写错,如sheepdog.spec。

#cd /root/rpmbuild

#vim sheepdog.spec

注意:

1)该配置文件中凡是行首加上 # 的都被注释掉了,实际运行时不起作用,如要使其生效,请去掉注释符 #。

2)凡是以 %{***} 和 %*** 形式出现的符号都是“宏”,很多宏都是系统预定义的,可以查看这些宏定义,如查看%{_host}则输入命令:

rpmbuild –showrc |grep _host

3)标准配置文件内容介绍见附件4、5、6节

6.执行打包

如果只想生成二进制包,使用下面命令:

rpmbuild -bb xxx.spec

如果只想生成源代码包,使用下面命令:

rpmbuild -bs xxx.spec

6.实例——使用sheepdog源码包创建RPM包

6.1使用root账户创建相关目录

]#mkdir /root/rpmbuild/{BUILD BUILDROOT SOURCES SPECS RPMS SRPMS}

6.2准备源码压缩包

将sheepdog.tar.gz放置到/root/rpmbuild/SOURCES目录下

6.3创建并编辑打包配置文件——sheepdog.spec

]cd /root/rpmbuild/SPECS

]vim sheepdog.spec

注意当创建该文件时,该文件会默认有一些基本内容,只需根据自己的实际情况来修改,如红色标注内容:

#

#Example spec file for sheepdog

#

# Name制定了软件的名称

Name:sheepdog

#软件版本

Version:0.7.0

#发布号,第几次制作rpm

Release:1.01.tfsp.sheep

# 软件的介绍,必须设置,最好不要超过50个字符

Summary:high performance distributed storage

# 软件的分组,可以通过/usr/share/doc/rpm-4.8.0/GROUPS文件中选择,也可以

# 在相应的分类下,自己创建一个新的类型。

Group:Applications/System

# 许可证类型

License:GPL

# 软件的源站

URL:http://sheepdog.github.io/sheepdog/

# 制作rpm包的人员信息

Packager:   LiQiyuan <liwangmengqi@gmail.com>

 

Distribution:Centos6.4-6.5

 

# 源码包的名称,在%_topdir/SOURCE下,如果有多个源码包的话,可以通过

# Source1、Source2这样的字段来指定其他的源码包

Source0:sheepdog-0.7.0.tar.gz

# BuildRoot指定了make install的测试安装目录,通过这个目录我们可以观察

# 生成了哪些文件,方便些files区域。如果在files区域中写的一些文件报

# 不存在的错误,可以查看%_topdir/BUILDROOT目录来检查有哪些文件。

 

BuildRoot:%{_tmppath}/%{name}-%{version}-%{release}-root

# 制作过程需要的工具或软件包

BuildRequires:gcc,make

# 安装时依赖的软件包

#Requires:corosync,liburcu

# 指定安装的路径

Prefix:%{_prefix}

Prefix:%{_sysconfdir}

# 软件的描述,这个可以尽情地写

%description

Sheepdog is a distributed object storage system for volume and container

services and manages the disks and nodes intelligently. Sheepdog features

ease of use, simplicity of code and can scale out to thousands of nodes.

 

# %prep指定了在编译软件包之前的准备工作,这里的

# setup可以写成%setup –q替换下面形式,使用静默模式解压并切换到源码目录中,

# 当然你也可以使用tar命令来解压

%prep

%setup -n %{name}-%{version}

# 编译阶段,和直接编译源代码类似,具体的操作或指定的一些参数由configure文件决定。

%build

#./configure –prefix=/opt/sheepdog/

./configure

# make后面的意思是:如果是多处理器,则并行编译

make %{?_smp_mflags} OPTIMIZE=”%{optflags}”

# 安装阶段

%install

# 先删除原来的测试安装的,只有在制作失败了%{buildroot}目录才会有内容,

# 如果成功的话,目录下会被清除。

# %{buildroot}指向的目录不是BuildRoot(%_topdir/BUILDROOT)指定的目录,

# 而是该目录下名称与生成的rpm包名称相同的子目录。例如我的是

# /root/rpmbuild/BUILDROOT/sheepdog-0.7.0-1.01.tfsp.sheep.x86_64

rm -rf %{buildroot}

# 指定安装目录,注意不是真实的安装目录,是在制作rpm包的时候指定的

# 安装目录,如果不指定的话,默认就会安装到configure命令中指定的prefix路径,

# 所以这里一定要指定DESTDIR

make install DESTDIR=%{buildroot}

rm -rf  %{buildroot}/etc/bash_completion.d/dog %{buildroot}/etc/init.d/sheepdog

# 清理阶段,在制作完成后删除安装的内容

# 安装前执行的脚本,语法和shell脚本的语法相同

%pre

# 安装后执行的脚本

%post

 

# 卸载前执行的脚本,我这里的做的事情是在卸载前将sheepdog进程停掉

%preun

MSG=`ps aux | grep sheepdog | grep -v “grep”`

if [ -z “$MSG” ];then

killall sheepdog 1>/dev/null 2>/dev/null

fi

# 卸载完成后执行的脚本

%postun

rm -rf %{prefix}

 

 

%clean

rm -rf %{buildroot}

#指定要包含的文件

%files

%{_prefix}

#设置默认权限,如果没有指定,则继承默认的权限

%defattr(-,root,root,-)

%changelog

6.4创建RPM包

在/root/rpmbuild/SPECS/目录下执行以下命令;

rpmbuild –bb sheepdog.spec

成功后会在/root/rpmbuild/RPMS目录下创建rpm包。

6.5检查rpm包

检查基本信息:

rpm -qpi ../RPMS/x86_64/sheepdog-0.7.0-1.01.tfsp.sheep.x86_64.rpm

基本信息如下:

Name      : sheepdog                     Relocations: /usr /etc

Version     : 0.7.0                             Vendor: (none)

Release     : 1.01.tfsp.sheep               Build Date: 2014年02月27日 星期四 22时05分53秒

Install Date: (not installed)               Build Host: cloud3.localdomain

Group       : Applications/System           Source RPM: sheepdog-0.7.0-1.01.tfsp.sheep.src.rpm

Size        : 10257027                         License: GPL

Signature   : (none)

URL         : http://sheepdog.github.io/sheepdog/

Summary     : high performance distributed storage

Description :

Sheepdog is a distributed object storage system for volume and container

services and manages the disks and nodes intelligently. Sheepdog features

ease of use, simplicity of code and can scale out to thousands of nodes.

检查rpm包内相关文件:

rpm -qpl ../RPMS/x86_64/sheepdog-0.7.0-1.01.tfsp.sheep.x86_64.rpm

执行以上命令后会列出rpm包内所有文件。

结束!

参考资料:

Centos RPM包制作原理: http://my.oschina.net/guol/blog/182310

实战RPM包制作http://blog.csdn.net/justlinux2010/article/details/9905425