RPM打包记录
2016-02-27 21:12
519 查看
一、根据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-setuptree是
rpmdevtools中带的初始化环境脚本,执行后会在用户主目录下创建
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~!
相关文章推荐
- EasyPM 功能发布:「自定义看板」上线
- tpcc-mysql 压力测试 tpmc基准测试
- 如何获取 yum 安装的 rpm 包位置---详解
- 产品经理要读什么书?怎么读?
- npm 淘宝镜像配置一直无效的可能原因
- 产品经理的灵魂所在
- Chrome development tools学习笔记(3)
- 3439: Kpm的MC密码 trie+主席树
- 产品经理成长之路
- 淘宝网提供的国内NPM镜像简介和使用方法
- ubuntu下安装rpm文件
- 一个在ActionBar上显示图标和菜单PopupMenu的小示例(19)
- 深圳运维、PM交流群 492384244
- 第51课:HadoopMapReduce多维排序解析与实战
- muShtaPmumixaMeerTyraniB.124
- 如何向外行解释产品经理频繁更改需求为什么会令程序员烦恼?
- Head First PMP – 7 – 成本管理(Cost Management)
- 产品经理面试常见问题
- 【Some】【搞逗】如何向外行解释产品经理频繁更改需求为什么会令程序员烦恼?
- 【Some】【搞逗】如何向外行解释产品经理频繁更改需求为什么会令程序员烦恼?