您的位置:首页 > 产品设计 > 产品经理

制作rpm包

2016-03-21 12:46 405 查看
注意:由于root用户的权限没有任何限制,RPM包制作过程的不当命令有可能会给系统带去破坏。
1,准备自己的打包环境
# yum -y install rpm-build rpmdevtools
2,创建rpm包制作车间(默认的制作车间在/usr/src/redhat/)

# su - tom
# rpmdev-setuptree
PS:执行rpmdev-setuptree命令默认将再当前用户主目录下创建一个 rpmbuild 构建的根目录结构;关于rpmbuild默认工作路径的确定,通常由在 ~/.rpmmacros 这个文件里的一个叫做%_topdir的宏变量来定义。
3,rpmbuild 目录下子目录

BUILD 编译rpm包的临时目录 %_builddir
BUILDROOT 编译后生成的软件临时安装目录 %_buildrootdir
RPMS 最终生成的可安装rpm包的所在目录 %_rpmdir
SOURCES 所有源代码和补丁文件的存放目录 %_sourcedir
SPECS 存放SPEC文件的目录(重要) %_specdir
SRPMS 最终生成 src.rpm 格式rpm包所在目录 %_srcrpmdir
4,下载源码包
# cd ~/rpmbuild/SOURCES/
# wget http://downloads.sourceforge.net/mad/libmad-0.15.1b.tar.gz 5,使用命令来生成SPEC模板文件
# rpmdev-newspec -o libmad-0.15.1b.spec
6,配置libmad-0.15.1b.spec

Name:           libmad
Version:        0.15.1b
Release:        1%{?dist}
Summary:        luochen
Group:          System Environment/Libraries
License:        GPLv2
URL:            http://downloads.sourceforge.net/mad/libmad-0.15.1b.tar.gz Source0:        %{name}-%{version}.tar.gz

BuildRoot:%{_topdir}/BUILDROOT

%package        devel
Summary:        Development files for %{name}
Group:              Development/Libraries
Requires:         %{name} = %{version}-%{release}

%description    devel
The %{name}-devel package contains libraries and header files for
developing applications that use %{name}.

%prep
%setup -q

%build
sed -i '/-fforce-mem/d' configure
%configure --enable-shared
make %{?_smp_mflags}

%install
rm -rf $RPM_BUILD_ROOT
make install DESTDIR=$RPM_BUILD_ROOT
find $RPM_BUILD_ROOT -name '*.la' -exec rm -f {} ';'
find $RPM_BUILD_ROOT -name 'libmad.a' -exec rm -f {} ';'

%clean
rm -rf $RPM_BUILD_ROOT

%post -p /sbin/ldconfig
%postun -p /sbin/ldconfig

%files
%defattr(-,root,root,-)    ###定义包含文件的属主,属组和权限
%doc
%{_libdir}/*.so.*

%files devel
%defattr(-,root,root,-)
%doc
%{_includedir}/*
%{_libdir}/*.so

%changelog
* Wed Apr 21 2016 luochen.com <luolinux.com> - 0.15.1b-1
-横线开头为注释
7,使用rpmbuild命令制作rpm包
# rpmbuild -ba libmad-0.15.1b.spec
8,查看生成的rpm包
# ls -al ~/rpmbuild/RPMS/x86_64/ ###生成二进制格式的rpm包所在目录
# ls -al ~/rpmbuild/SRPMS/ ###生成源码格式的rpm包所在目录
9,查看rpm的信息
# rpm -qpi ~/rpmbuild/RPMS/x86_64/libmad-0.15.1b-1.el6.x86_64.rpm
10,spec文件的格式

Name:软件包名称
Version:软件包版本
Release:发行版本号
Group:软件包所属类别  /usr/share/doc/rpm-4.8.0/GROUPS
License:软件的授权方式
Source[0-n]:指定源代码文件
BuildRequires:编译源码时依赖的软件包
Requires:安装软件包时依赖的软件包
BuildRoot:安装文件时候的根目录
Description:关于RPM包的描述
Pre:安装前的准备
Prep:编译前的准备
Setup:寻找将源码包并解压
Build:编译
Install:安装
File:文件列表
Defattr:文件属性
Post:安装之后的收尾工作
Preun:卸载软件前的准备工作
Postun:卸载软件后的收尾工作

制作rpm包的几个关键阶段:
1,%prep       将%_sourcedir目录下的源代码解压到%_builddir目录下;如果有补丁的需要在这个阶段进行打补丁的操作;
2,%build	在%_builddir目录下执行源码包的编译。一般是执行./configure和make指令;
3,%install	将需要打包到rpm软件包里的文件从%_builddir下拷贝%_buildrootdir目录下。当用户最终用rpm -ivh name-version.rpm安装软件包时,这些文件会安装到用户系统中相应的目录里;
4,%files         要打包到rpm包里的文件清单;分为三类--说明文档(doc),配置文件(config)及执行程序,还可定义文件存取权限,拥有者及组别;
5,制作rpm包	这个阶段是自动完成的,所以在SPEC文件里面是看不到的,这个阶段会将%_buildroot目录的相关文件制作成rpm软件包最终放到%_rpmdir目录里;
6,%clean	编译后的清理工作,这里可以执行make clean以及清空%_buildroot目录等;
7,%changelog改变日志;
11,rpmbuild 命令选项

syntax:
rpmbuild  {-ba|-bb|-bp|-bc|-bi|-bl|-bs} [rpmbuild-options] SPECFILE
-bp 仅执行至spec文件中的%prep阶段即停止进行;
-bc 仅执行到spec文件中的%build阶段即停止进行;
-bi 仅运行至spec文件中的%install阶段即停止运行;
-bl  检查spec文件中%file段所列出的文件是不是与BUILDROOT目录中存在的文件完全匹配;
-ba 同时制作成生二进制格式的rpm包和源码格式的rpm包;
-bb 仅制作二进制格式的rpm包;
-bs 仅制作生成源码格式的rpm包;

12,install 命令选项
syntax:
install [OPTION]... [-T] SOURCE DEST
-d  创建目录
-D 自动创建缺省的目录结构
example:
# install /etc/fstab /tmp     复制文件
# install -d /tmp/test          新建目录
# install -D /etc/fstab /etc/test/fstab  自动创建缺省的目录结构


13,rpm2cpio命令:将RPM包展开为cpio格式的命令,其展开结果通常通过“管道”传送给cpio命令做进一步处理。如:
# rpm2cpio libmad-0.15.1b-1.el6.x86_64.rpm | cpio -t
# rpm2cpio libmad-0.15.1b-1.el6.x86_64.rpm | cpio -id
14,查看rpm宏及其定义方法
# rpmbuild --showrc | grep _topdir
# rpm --eval '%_topdir' ###获取%_topdir宏的定义
PS:所有的宏定义都可以在/usr/lib/rpm/macros里找到;
默认情况下,这些宏是通过rpm宏的相关配置文件来定义的,其配置文件通常有多个,可以使用如下命令得到当前系统的相关文件的路径信息:
# rpmbuild --showrc | grep macrofiles
PS:macrofiles标签后的多个路径就是rpm、rpmbuild等命令运行时所用到的宏定义相关配置文件,在上面命令输出中的列表中的次序也是rpm、rpbuild命令搜索宏定义时依次使用文件的次序,因此,如果在多个文件中定义了相同的宏,最后找到的将最终生效。由于排在最后的是~/.rpmmacros,因此,每个用户都可以在自己的家目录中通过修改此文件来改变系统上某宏的默认定义,比如%_topdir。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  制作 rpm