- 浏览: 465906 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
alvin198761:
renzhengzhi 写道我参与过12306余票查询系统的开 ...
别给12306 辩解了 -
renzhengzhi:
我参与过12306余票查询系统的开发,用户请求被前面3层缓存拦 ...
别给12306 辩解了 -
renzhengzhi:
写的很好。
JAVA线程dump的分析 -
liyonghui160com:
说好的附件呢
分布式服务框架 Zookeeper -- 管理分布式环境中的数据 -
ghpaas:
orbeon作为xforms标准的实现,不论其设计器还是运行时 ...
XForms 1.1 中文翻译—第1章 关于XForms标准
RPM(Red Hat Package Manager)是用于 Linux 分发版(distribution)的最常见的软件包管理器。因为它允许分发已编译的软件,所以用户只用一个命令就可以安装软件。
RPM 是 Linux“标准基本库”版本 1.0.0 指定的安装工具。在 Linux 分发版前 10 名中,有 8 个是基于 RPM(请参阅“Comparison of Linux Distributions”,它位于本文后面的 参考资料中列出的 distrowatch.com 上)。即使某些通常不使用 RPM 的分发版,如 Debian,也有可用工具将 RPM 转换成它们自己的格式。在 Linux 上,对于除开发人员以外的任何人,RPM 也是用来打包软件的最佳选择。
不论您是自己开发软件,还是通过提供代码以从中创建 RPM 软件包向开放源码项目提供帮助,本文都会帮助您入门。顺便要说的是,本系列的后续文章会涉及下列主题:构建 RPM 软件包而未必是 root 用户,在构建软件之前为其打补丁,安装和卸载时运行脚本以及在安装或卸载 其它软件包时运行脚本。
我将从简单的实例开始,主要使用 RPM 缺省值。然后,我会添加上几个可选特性。
RPM 软件包从源文件形式的程序开始,作好了编译准备。我不想创建一个没有实际意义的示例,而是选择使用 GNU Indent 程序(请参阅 参考资料)。
在 Linux 下创建 Indent 非常容易。 indent-2.2.6.tar.gz 文件位于当前目录之中,所有您要做的就是:
$ tar xzf indent.2.2.6.tar.gz
$ cd indent-2.2.6
$ ./configure
$ make
$ make install
|
如果您已经构建过很多开放源码项目,那么这可能看起来很熟悉。 unpack;./configure;make;make install
序列是典型的使用 GNU 自动配置(autoconf)工具的软件。因为这太普通了,所以我在这里描述的关于 indent 的大部分东西,几乎不加改变就可以用于其它开放源码项目。
现在假设您正在使用 Red Hat 7.1。在本文的后面,我将给出一些 在其它 Linux 分发版上使用 RPM 的建议。
在 Red Hat 7.1 上, 在继续以前,请确保您已安装了 rpm-build 软件包。为检查是否安装,请运行 rpm -q rpm-build
。您应该看到一些类似于 rpm-build-4.0.2-8
的信息(版本可能会不同)。如果您看到的是 package rpm-build is not installed
,则将需要从 Red Hat 安装 CD 上安装它。
为了构建 RPM 软件包,您需要写一个名为 spec 文件的 RPM 输入文件,该文件告诉 RPM 如何构建和打包您的软件。编写 spec 文件您需要:
- 创建文件 indent-1.spec,如下所示。您可以任意地给它命名并把它放到任何地方;RPM 对这些没有要求。
- 以 root 用户登录。
- 将 indent-2.2.6.tar.gz 文件复制到 /usr/src/redhat/SOURCES。
- 运行
rpm -ba indent-1.spec
,将 indent-1.spec 改为您使用的名字。
Summary: GNU indent
Name: indent
Version: 2.2.6
Release: 1
Source0: %{name}-%{version}.tar.gz
License: GPL
Group: Development/Tools
%description
The GNU indent program reformats C code to any of a variety of
formatting standards, or you can define your own.
%prep
%setup -q
%build
./configure
make
%install
make install
%files
%defattr(-,root,root)
/usr/local/bin/indent
%doc /usr/local/info/indent.info
%doc %attr(0444,root,root) /usr/local/man/man1/indent.1
%doc COPYING AUTHORS README NEWS
|
您应该看到 RPM 解包这个 tar 文件,编译并安装它。 在 Red Hat 7.1 上,工作目录将是 /usr/src/redhat/BUILD。
最后,RPM 将创建两个 RPM 文件。将在 /usr/src/redhat/SRPMS/indent-2.2.6-1.src.rpm 中创建一个源 RPM 文件,而在 /usr/src/redhat/RPMS/i386/indent-2.2.6-1.i386.rpm 中创建一个二进制 RPM 文件。
源 RPM 文件简单地捆绑了 spec 文件和构建软件包用到的所有源文件和补丁文件。如果您选择分发它,则其他人可以很容易地用它重建您的软件。二进制 RPM 文件仅包含已编译的软件和如何安装的信息。
下面总结了在您运行 rpm -ba filename.spec
时,RPM 都做些什么:
- 读取并解析 filename.spec 文件
- 运行
%prep
部分来将源代码解包到一个临时目录,并应用所有的补丁程序。 - 运行
%build
部分来编译代码。 - 运行
%install
部分将代码安装到构建机器的目录中。 - 读取
%files
部分的文件列表,收集文件并创建二进制和源 RPM 文件。 - 运行
%clean
部分来除去临时构建目录。
spec 文件有几个部分。第一部分是未标记的;其它部分以 %prep
和 %build
这样的行开始。
头
第一部分(未标记)定义了多种信息,其格式类似电子邮件消息头。
Summary
是一行关于该软件包的描述。
Name
是该软件包的基名, Version
是该软件的版本号。 Release
是 RPM 本身的版本号 ― 如果修复了 spec 文件中的一个错误并发布了该软件同一版本的新 RPM,就应该增加发行版号。
License
应该给出一些许可术语(如:“GPL”、“Commercial”、“Shareware”)。
Group
标识软件类型;那些试图帮助人们管理 RPM 的程序通常按照组列出 RPM。您可以在 /usr/share/doc/rpm-4.0.2/GROUPS 文件看到一个 Red Hat 使用的组列表(假设您安装的 RPM 版本是 4.0.2)。但是您还可以使用那些组名以外的名称。
Source0
、 Source1
等等给这些源文件命名(通常为 tar.gz 文件)。 %{name}
和 %{version}
是 RPM 宏,它们扩展成为头中定义的 rpm 名称和版本。因此,在这个实例中, Source0
被设置为 indent-2.2.6.tar.gz
。
不要在 Source
语句中包含任何路径。缺省情况下,RPM 会在 /usr/src/redhat/SOURCES 中寻找文件。请将您的源文件复制或链接到那里。(要使 spec 文件尽量可移植的话,应当尽量避免嵌入自己开发机器上的假想路径。其他开发人员就可以指示 RPM 在别的目录下查找源文件,而不用修改您的 spec 文件。)
描述
接下来的部分从 %description
行开始。您应该在这里提供该软件更多的描述,这样任何人使用 rpm -qi
查询您的软件包时都可以看到它。您可以解释这个软件包做什么,描述任何警告或附加的配置指令,等等。
Shell 脚本
下面几部分是嵌入 spec 文件中的 shell 脚本。
%prep
负责对软件包解包。在最常见情况下,您只要用 %setup
宏即可,它会做适当的事情,在构建目录下解包源 tar 文件。加上 -q
项只是为了减少输出。
%build
应该编译软件包。该 shell 脚本从软件包的子目录下运行,在我们这个例子里是 indent-2.2.6 目录,因而这常常与运行 make
一样简单。
%install
在构建系统上安装软件包。这似乎和 make install
一样简单,但通常要复杂些。我将在下面解释这点。
文件列表 %files
列出应该捆绑到 RPM 中的文件,并能够可选地设置许可权和其它信息。
在 %files
中,您可以使用 一次 %defattr
来定义缺省的许可权、所有者和组;在这个示例中, %defattr(-,root,root)
会安装 root 用户拥有的所有文件,使用当 RPM 从构建系统捆绑它们时它们所具有的任何许可权。
可以用 %attr(permissions,user,group)
覆盖个别文件的所有者和许可权。
可以在 %files 中用一行包括多个文件。
可以通过在行中添加 %doc
或 %config
来标记文件。 %doc
告诉 RPM 这是一个文档文件,因此如果用户安装软件包时使用 --excludedocs
,将不安装该文件。您也可以在 %doc
下不带路径列出文件名,RPM 会在构建目录下查找这些文件并在 RPM 文件中包括它们,并把它们安装到 /usr/share/doc/%{name}-%{version}
。以 %doc 的形式包括 README 和 ChangeLog 这样的文件是个好主意。
%config
告诉 RPM 这是一个配置文件。在升级时,RPM 将会试图避免用 RPM 打包的缺省配置文件覆盖用户仔细修改过的配置。
警告:如果在 %files 下列出一个目录名,RPM 会包括该目录下的所有文件。通常这不是您想要的,特别对于 /bin
这样的目录。
这个最基本的 spec 文件有几个问题。最大的问题之一就是您最后在构建系统上实际安装了该产品。而这可能只是一个软件测试版本,您也许并不想在构建系统中安装它。
RPM 用一个名为 构建根(build root)的特性来处理这个问题。它的想法是设置您的 spec 文件,以将所有安装的文件复制到一个虚拟目录树(从构建根开始);然后 RPM 从那里得到文件。
但是,这需要一些软件包的支持。在包括 indent 在内的很多 GNU 软件包中,在 make install
的时候定义 DESTDIR
将会在所有安装路径之前添加 DESTDIR 值。
请注意 不要使用 ./configure --prefix=$RPM_BUILD_ROOT
。这会在假设整个软件包文件的最终位置是构建根的情况下安装整个软件包。这对于 indent 可能没有关系,但任何需要在运行时找到其安装文件的程序都将失败,因为当 RPM 最终安装到用户系统后,这些文件就不再位于构建根之下 ― 那只是您构建系统上的一个临时目录。
请参阅更新的文件 indent-2.spec,如下所示。
Summary: GNU indent
Name: indent
Version: 2.2.6
Release: 2
Source0: %{name}-%{version}.tar.gz
License: GPL
Group: Development/Tools
BuildRoot: %{_builddir}/%{name}-root
%description
The GNU indent program reformats C code to any of a variety of
formatting standards, or you can define your own.
%prep
%setup -q
%build
./configure
make
%install
rm -rf $RPM_BUILD_ROOT
make DESTDIR=$RPM_BUILD_ROOT install
%clean
rm -rf $RPM_BUILD_ROOT
%files
%defattr(-,root,root)
/usr/local/bin/indent
%doc /usr/local/info/indent.info
%doc %attr(0444,root,root) /usr/local/man/man1/indent.1
%doc COPYING AUTHORS README NEWS
|
首先,我们增加了版本的发行号。无论何时,当您编辑 spec 文件时,都不要忘了这么做。
我们在头中添加了 BuildRoot,以便告诉 RPM 这是在构建期间临时安装文件的地方。对于临时文件,我们这里使用了两个 RPM 宏,而不是假设某个特定位置。在 Red Hat 7.1 上, %{_builddir}
以类似于 /usr/src/redhat/BUILD
结束。
我们还需要告诉系统将 indent 安装在那里。RPM 帮助我们用构建根的值定义一个 shell 变量 RPM_BUILD_ROOT
,因此在 make install
时,我们只需将它作为 DESTDIR 值传入即可。
我们还在 %install 和 %clean 中添加了几行,以便在开始安装以前(为保险起见)和完成以后清除构建根。%clean 是一切都正常的情况下在 RPM 构建结束时运行的脚本,这样临时文件就不会一直保留。
最后,在 %files 中,请注意我们没有在此处的路径前包括 BuildRoot。我们使用了“真正”的路径;RPM 将在构建根下寻找这些文件,因为您已经包括了 BuildRoot
定义。
如果仔细观察您会发现,在 RPM 进行安装部分以前,一切工作照旧。然后,文件将不直接安装到 /usr/local/bin,而是安装在(比如说)/usr/src/redhat/BUILD/indent-root/usr/local/bin 中。
如果您检查最终的二进制 RPM 文件(用 rpm -qlp indent-2.2.6-2.i386.rpm
),您会看到构建根已被 RPM 除去。如果您安装 RPM,这些文件最终将安装在正确的目录,如 /usr/local/bin/indent 中。
如果您在使用不同的 Linux 分发版,RPM 可能会有不同的内置路径。例如,它几乎肯定不会在 /usr/src/redhat 查找源文件!要确定希望的 RPM 安装路径,请运行 rpm --showrc
并查看下列部分如何被定义:
其中一些根据其它变量定义;例如,当您看到 %{_topdir}
,查找 _topdir
的定义,等等。
我希望这篇用 RPM 打包软件的介绍会对您有所帮助。有关相关的阅读材料,请参阅下面的 参考资料。在本系列的后续文章中,我们将讨论这些主题:
- 构建 RPM 软件包而不必是 root 用户
- 在创建软件之前为软件打补丁
- 在安装和卸载时运行脚本
- 在安装或卸载 其它软件包时运行脚本
评论
RPM打包还是推荐Maximum RPM(http://www.jsxubar.info/maximum-rpm-introduction.html )这本书,可以系统的学习一下RPM使用和打包。
发表评论
-
使用 RPM 打包软件,第 1 部分: 构建和分发包
2012-03-26 10:31 1195顾名思义,开源软件 ... -
用 RPM 打包软件,第 3 部分
2012-03-26 10:30 1085安装和卸载脚本的工作原理 安装和卸载脚本看起来很简单, ... -
用 RPM 打包软件,第 2 部分
2012-03-26 10:28 1111不作为 root 用户来构建 RPM 包 正如您在第 1 ... -
Memory usage analysis
2010-09-03 23:33 1183Memory usage analysis Syste ... -
Linux: How to measure actual memory usage of an application or process?
2010-09-03 23:31 1242http://stackoverflow.com/questi ... -
HowTo: Profile Memory in a Linux System
2010-09-03 22:56 1148HOWTO: Profile Memory in a Li ... -
Linux内存管理机制
2010-09-03 22:48 2033内存是Linux内核所管理的最重要的资源之一,内存管理 ... -
linux内存管理概述
2010-09-03 22:44 2383Linux中的地址空间(一)有这么一系列的问题,是否在困扰 ... -
linux上buffer和cache的区别
2010-09-03 15:14 1489free free 命令相对于top 提供了更简洁的查看系统 ... -
linux下top命令参数解释
2010-09-03 14:56 836top命令是Linux下常用的性能分析工具,能够实时显示系统中 ... -
smem memory reporting tool
2010-08-25 15:41 928smem is a tool that can give ... -
Linux进程虚拟内存和物理内存
2010-08-25 15:39 4993先介绍几个基本概念: SIZE: 进程使用的 ... -
Memory: VSS/RSS/PSS/USS
2010-08-25 13:54 1473Terms VSS - Virtual Set ... -
Linux 内核的文件 Cache 管理机制介绍
2010-08-18 18:21 9761 前言 自从诞生以来,Linux 就被不断完善和普及 ... -
运行时: 块内存复制,第 2 部分
2010-08-06 12:33 1184我的 前一专栏专注于 ... -
RunTime: 块内存复制
2010-08-06 12:32 1149内存复制 在计算机中,内存复制经常而普遍。它们出现在联网 ... -
内存详解
2010-08-06 11:34 890文档选项 ... -
Linux slab 分配器剖析
2010-08-06 11:32 1226良好的操作系统性能部分依赖于操作系统有效管理资源的能力。在 ... -
降低 Linux 内存开销
2010-08-06 11:30 1067Linux 广受追捧的一个优点是它比 Microsoft® ... -
在 Linux 平台中调试 C/C++ 内存泄漏方法
2010-08-06 11:29 1780由于 C 和 C++ 程序中完全由程序员自主申请和释放内存 ...
相关推荐
当然,也有用rpm格式打包的源代码,用gzip压缩过的可执行程序包。只要您理解了以下的思路,这两种形式的安装包也不在话下了。 下面,我们就分成两个部分来说明软件安装思路: 第一部分:搞定.tar.gz 1.首先,使用t
第四部分 Linux使用者管理 第14章 Linux账号管理与ACL权限设置 第15章 磁盘配额(Quota)与高级文件系统管理 第16章 例行性工作(crontab) 第17章 程序管理与SELinux初探 第18章 认识系统服务(daemons) 第19章 ...
概述 一些常见包的二进制发行版的 RPM 规范。 RPM 通常是从源代码构建的... 我们没有将整个Java程序重新打包,而是将noarch部分(大部分包)打包成一个-common包,将原生组件放在自己的架构依赖包中,然后让架构依赖包
在RHEL8中把软件源分成了两部分,一个是BaseOS,另一个是AppStream。在Red Hat Enterprise?Linux?8.0中,统一的ISO自动加载BaseOS和AppStream安装源存储库。已经存在于光盘链接中,只不过要分别去配置.repo文件。...
rpm -q -a --qf '{SIZE}t%{NAME}n' | sort -k1,1n 以大小为依据依次显示已安装的rpm包所使用的空间 (fedora, redhat类系统) dpkg-query -W -f='${Installed-Size;10}t${Package}n' | sort -k1,1n 以大小为依据显示...
第一部分:常用命令 常用命令/文件处理 0:基础功能 1:ls 显示文件目录 语法:ls 选项[-ald][文件或目录] 2:cat 显示文件内容(内容少适合) 语法:cat[文件名] 3:tac 显示文件内容 语法:tac[文件名] 4:more 分页...
第1部分 基础篇 第1章 Linux与开源软件 1.1 自由软件和开源运动 1.1.1 自由软件简介 1.1.2 FSF、GNU和GNU Project 1.1.3 自由软件协议 1.1.4 自由软件及其商业价值 1.1.5 开源软件及其相关组织 1.1.6 自由软件v.s...
如果你能把第一和第二部分学好。那么你已经具有RHCT(红帽认证技师的能力了) 第三部分、RH253 高级部分分为服务器架设和安全模块 1、DNS服务器的配置(挺麻烦的一个服务) RHCE课程-RH253Linux服务器架设笔记五-...
最初只有.tar.gz 的打包文件,用户必须编译每个他想在GNU/Linux 上运行的软件。用户们普遍认为系统很 有必要提供一种方法来管理这些安装在机器上的软件包,当Debian诞生时,这样一个管理工具也就应运而生, 它被命名...
第六章:软件安装及RPM的使用 在Windows下安装软件时,只需运行软件的安装程序(Setup, Install等)或者用解压缩软件解开即可安装,运行反安装程序(Uninstall, Unware, 卸载等)就能将软件清除干净。这些...
pkgBackup是一个Perl程序,用于使用基于* .rpm或* .deb的发行版来备份家用Linux系统。 它仅归档(A)是软件包一部分的那些文件; 和(B)自安装软件包以来已更改。 您可以存储非打包文件。