RPM打包记录

6 篇文章 0 订阅
一、根据RPM版本定位rpmbuild工作目录

如果 rpm 的版本 <=4.4.x,那么 rpmbuild 工具其默认的工作路径是 /usr/src/redhat ,这就使得普通用户不能制作 rpm 包,因为权限的问题,在制作 rpm 软件包时必须切换到root身份才可以。所以,rpm从4.5.x版本开始,将rpmbuid的默认工作路径移动到用户家目录下的rpmbuild目录里,即$HOME/rpmbuild,并且推荐用户在制作rpm软件包时尽量不要以root身份进行操作。

查看rpm版本:

rpm --version

关于 rpmbuild 默认工作路径的确定,通常由在 /usr/lib/rpm/macros 这个文件里的一个叫做 %_topdir 的宏变量来定义。如果用户想更改这个目录名,rpm官方并不推荐直接更改这个目录,而是在用户家目录下建立一个名为.rpmmacros的隐藏文件,然后在里面重新定义%_topdir,指向一个新的目录名。这样就可以满足某些“高级”用户的差异化需求了,比如:

vi .rpmmacros

%_topdir       /home/ambari/rpm
%_tmppath      /home/ambari/rpm/tmp
二、rpmbuild工作目录规范

%_topdir目录下一般需要建立6个目录:

目录名         说明                                  macros中的宏名
BUILD       编译rpm包的临时目录                 %_builddir
BUILDROOT   编译后生成的软件临时安装目录          %_buildrootdir
RPMS        最终生成的可安装rpm包的所在目录       %_rpmdir
SOURCES     所有源代码和补丁文件的存放目录         %_sourcedir
SPECS       存放SPEC文件的目录(重要)             %_specdir
SRPMS       软件最终的rpm源码格式存放路径(暂时忽略掉,别挂在心上)       %_srcrpmdir

当上述目录建立好之后,将所有用于生成rpm包的源代码、shell脚本、配置文件都拷贝到SOURCES目录里,注意通常情况下源码的压缩格式都为*.tar.gz格式(当然还可以为其他格式,但那就是另外一种方式,这里先不介绍)。然后,将最最最重要的SPEC文件,命名格式一般是“软件名-版本.spec”的形式,将其拷贝到SPECS目录下,切换到该目录下执行:

rpmbuild -bb 软件名-版本.spec

最终我们想要的rpm软件包就安安稳稳地躺在RPMS目录下了。对,就这么简单。

三、SPEC文件写法

这里的关键就是上面的SPEC文件的写法,我们可以用rpmdev-newspec -o Name-version.spec命令来生成SPEC文件的模板,然后在上面修改就可。例如:

rpmdev-newspec -o Name-version.spec
vi Name-version.spec

模版内容如下:

Name:           Name-version
Version:
Release:        1%{?dist}
Summary:

Group:
License:
URL:
Source0:
BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)

BuildRequires:
Requires:

%description


%prep
%setup -q


%build
%configure
make %{?_smp_mflags}


%install
rm -rf $RPM_BUILD_ROOT
make install DESTDIR=$RPM_BUILD_ROOT


%clean
rm -rf $RPM_BUILD_ROOT


%files
%defattr(-,root,root,-)
%doc



%changelog

其实SPEC文件的核心是它定义了一些“阶段”(%prep、%build、%install和%clean),当rpmbuild执行时它首先会去解析SPEC文件,然后依次执行每个“阶段”里的指令。

四、系统打包过程

系统打包的动作过程

    1)读取并解析 filename.spec 文件 
    2)运行 %prep 部分来将源代码解包到一个临时目录,并应用所有的补丁程序。 
    3)运行 %build 部分来编译代码。 
    4)运行 %install 部分将代码安装到构建机器的目录中。 
    5)读取 %files 部分的文件列表,收集文件并创建二进制和源 RPM 文件。 
    6)运行 %clean 部分来除去临时构建目录。 

打rpm包的基本思路

    1) 取回软件的源代码和相关的补丁 
    2) 测试所需的补丁,以便于顺利的构建整个程序 
    3) 把文件放到正确的位置 
    4) 编辑spec文件 
    5) 使用rpmbuild构建rpm包 

rpmbuild命令:rpmbuild命令会根据spec文件来生成rpm包,主要用到以下几个参数:

rpmbuild  --help 
-bp 执行到%prep阶段结束
-bc 执行到%build阶段结束
-bi 执行到%install阶段结束 
-bl 检测%files文件是否有丢失
-ba 创建src.rpm和二进制包 
-bs 只创建src.rpm源码包 
-bb 只创建二进制rpm包 

一般常用到的参数:

# 同时产生rpm和srpm包
rpmbuild -ba spec

#只产生rpm包
rpmbuild -bb spec

# 用srpm包生成rpm包
rpmbuild --rebuild src.rpm

rpmdev-setuptreerpmdevtools中带的初始化环境脚本,执行后会在用户主目录下创建rpmbuild目录和.rpmmacros文件,同时生成所需的子目录和默认的控制参数,执行:

rpmdev-setuptree

结果:

ls -al ~/
drwxrwxr-x  7 urey urey     4096 Feb 26 19:49 rpmbuild
-rw-rw-r--  1 urey urey      161 Feb 26 19:49 .rpmmacros

如果没有rpmdev-setuptree,先安装 rpmdevtools:

yum install rpmdevtools

生成的目录结构:

rpmbuild/
    ├── BUILD   #打包过程中的工作目录
    ├── RPMS    #RPM包存放目录
    ├── SOURCES #源码和补丁目录
    ├── SPECS   #SPEC文件目录
    └── SRPMS   #src rpm包存放目录

默认的全局控制宏文件.rpmmacros内容:

cat ~/.rpmmacros 
%_topdir      %(echo $HOME)/rpmbuild
%_smp_mflags  -j3
%__arch_install_post   /usr/lib/rpm/check-rpaths   /usr/lib/rpm/check-buildroot

遇到spec文件的格式问题,先转换:

dos2unix xxx.spec

安装刚刚生成的rpm:

rpm -ivh xxx.rpm
# 不检查依赖进行安装
rpm -ivh xxx.rpm --nodeps

最后,查看rpm安装到了哪个目录下:

rpm -ql 包名 

注意这里的是不包括.rpm后缀的软件包的名称

五、小结打包流程:
(1)
rpmdev-setuptree    

注明:
如果没有rpmdev-setuptree,先安装 rpmdevtools:
yum install rpmdevtools

(2)
上传编译好的二进制可执行tar包和其他相关文件到rpmbuild/SOURCES/下面

(3)
上传写好的.spec文件

(4)
#只产生rpm包 
rpmbuild -bb spec

OK~!
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值