全部博文(150)
分类:
2010-03-24 17:46:35
|
RPM打包对于应用程序是十分有用的,可以下载,可以卸载,可以升级,可打补丁,可用于软件的发布和管理,以及以后可能的软件store。如果我们使用MIC2,更换kenrel,如果需要制作的usbimg通过安装方式能够成功启动,我们必须对我们自己新的kernel进行打包。
我们通过一个简单的hello world例子来打一个名字为hello的rpm包。 我收集了网上的资料,结合自己的实验给出下面的内容。有很多的信息来自共产主义的网络。RPM全称是 Red Hat Package Manager(Red Hat包管理器)。几乎所有的 Linux 发行版本都使用这种形式的软件包管理安装、更新和卸载软件。RPM有五种基本的操作功能(不包括创建软件包):安装、卸载、升级、查询、和验证。
/** hello.c */
#include
int main(){
printf("Hello, world! version 1.0.0\n");
}
这个是最简单的例子,放置在目录hello-1.0.0/的下面,在这个目录下面,有一个可执行的configure文件和Makefile文件。注意,configure的权限必须是可执行的,否则在打包的过程中会报错。这么简单的程序,我们也没有什么特别需要配置的。如下:
echo "hello, This is configure file, do noting."
Makefile程序如下,属于常规写法 ,唯一需要注意的是我们增加了一个DESTDIR的参数,这个与后面打包的相关:
CC = gcc
CFLAGS =
INCLUDE =OBJECTS = hello.o
TARGET = hello
DESTDIR =all: $(TARGET)
hello.o:
$(CC) -c hello.c$(TARGET): $(OBJECTS)
$(CC) -o hello $(OBJECTS)install:
cp $(TARGET) $(DESTDIR)/usr/local/bin/$(TARGET)rm: clean
clean:
rm -f *.o
rm $(TARGET) /usr/local/bin/$(TARGET)
接着我们将目录进行tar,得到hello-1.0.0.tar.gz。如果我们得到一个tar.gz的源代码,通常处理就是一、解压;二、configure;三、make,四、make install。我们的例子中具备了这些步骤,虽然configure我们并没有任何实际的动作,只是走了形式。
在当前用户目录~下面建立rpmbuild,例如/home/wei/rpmbuild,rpmbuild有五个子目录,我们可以先建立SOURCES和SPECS,其他的三个目录在打包的过程中可以自动生成。将hello-1.0.0.tar.gz放置在SOURCES目录下面,在SPECS目录下面写我们的spec文件,这是打包的关键,这个文件是构造我们rpm包的脚本文件。
#################### 文件头 #####################
Summary : GNU hello test for rpm building //这是对软件包的描述
Name : hello //这是软件包的名称, 最终RPM软件包是用该名字与版本号,释出号及体系号来命名软件包的
Version : 1.0.0 //这是软件包的版本
Release : 1 //这是RPM的版本号,如果修复了spec文件中内容重新发布该rpm,应该增加发行版号
Source0 : %{name}-%{version}.tar.gz //源程序软件包的名字,这里是源文件的压缩包,即hello-1.0.0.tar.gz,如果有多个,可以有Source0,Source1
License : GPL //软件包所采用的版权规则。具体有:GPL(自由软件),BSD,MIT,Public Domain(公共域),Distributable(贡献),commercial(商业),Share(共享)等
Group : Development/Tools //表示软件类型, 帮助其他人在管理RPM程序中按照组来列出RPM
Vendor : WEI //软件开发者的名字%description //这是对软件包的描述,这个以及上面的信息,在安装rpm后,可以通过rpm –qi hello中获得
The GNU hello little program is used to test how to building a simple
rpm, just for study.#################### %prep段 #####################
#从这里开始就是嵌入spec的shell文本。这个段是预处理段,通常用来执行一些解开源程序包的命令,为下一步的编译安装作准备。%prep负责对软件包解包。在最常见情况下,您只要用 %setup 宏即可,它会做适当的事情,在构建目录下解包源 tar 文件。加上 -q 项只是为了减少输出。将会在~/rpmbuild/BUILD目录下面解开压缩包
#对于打补丁的部分也放置在这里
%prep
%setup -q#################### %build段 #####################
#本段是建立段,所要执行的命令为生成软件包服务,如make 命令。编译该软件包。该 shell 脚本从软件包的子目录下运行,在我们的例子中,将会在~/rpmbuild/BUILD/hello-1.0.0/下面执行。和通常的编译一样,我们执行./configure文件,以及进行make。这里给出编译过程中执行的步骤。如果编译kernel,我们可能会写上make bzImage等等。
%build
./configure
make#################### %install段 #####################
#在构建系统上安装软件包。为了最后能封装成rpm,我们需要将所需封装的文件及其安装的目录放置在$RPM_BUILD_ROOT(即~/rpmbuild/BUILDROOT/hello-1.0.0-1.i386)下面。例如我们需要将编译后的可执行文件hello最终方式在/usr/local/bin下面,那么我们需要将hello拷贝到~rpmbuild/BUILDROOT/hello-1.0.0-1.i386/usr/local/bin/hello。
%install
install -d $RPM_BUILD_ROOT/usr/local/bin
make install DESTDIR=$RPM_BUILD_ROOT#################### %clean段 #####################
#删除临时文件,在最后执行
%clean
rm –rf $RPM_BUILD_ROOT#################### %file段 #####################
# 文件段,用于定义软件包所包含的文件,分为三类--说明文档(doc),配置文件(config)及执行程序,还可定义文件存取权限,拥有者及组别。
#列出应该捆绑到 RPM 中的文件,并能够可选地设置许可权和其它信息。可以使用 一次%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
%defattr(-,root,root)
/usr/local/bin/hello
#%doc /usr/local/info/hello.info
#%doc %attr(0444,root,root) /usr/local/man/man1/hello.1
#%doc COPYING AUTHORS README NEWS#################### %changelog段 #####################
#修改日志段。你可以将软件的每次修改记录到这里,保存到发布的软件包中,以便查询之用。每一个修改日志都有这样一种格式:第一行是:* 星期 月 日 年 修改人电子信箱。其中:星期、月份均用英文形式的前3个字母,用中文会报错。接下来的行写的是修改了什么地方,可写多行。一般以减号开始,便于后续的查阅。这个例子中我们不需要这个部分。 如果是发布下一个版本可以加上如下的内容。
* Mon Jul 6 2009 Name–1.0.1-1
- modified …… 可以多行,表面增加或者修改的地方
此外,在开始部分,通过BuildRequires:列出软件编译必须依赖的软件包,如果有人用你的src.rpm自己编译,会提示他需要安装这些包才能编译。通过Requires:是软件运行时依赖的软件包,这个非常重要,因为仓库安装要依赖它来同时安装其他依赖的软件包(虽然rpm有自动依赖关系判定,但不能100%保险)。
除了上面这些部分外,还有%pre(在安装包之前运行), %post(在安装包之后运行), %preun(在卸载包之前运行), %postun(在卸载包之后运行)。例如我们可以在%post中加上某些链接的文件。
在这个例子中,我们在make install中增加了辅助参数DESTDIR,我曾考虑过在configure的配置来进行,但是IBM工程师的文档建议:请注意不 要使用./configure --prefix=$RPM_BUILD_ROOT 。这会在假设整个软件包文件的最终位置是构建根的情况下安装整个软件包。这可能没有关系,但任何需要在运行时找到其安装文件的程序都将失败,因为当 RPM 最终安装到用户系统后,这些文件就不再位于构建根之下 ― 那只是您构建系统上的一个临时目录。
之后我们执行:rpmbuild –ba hello.spec,我们将在~/rpmbuild/RPMS得到:hello-1.0.0-1.i386.rpm和hello-debuginfo-1.0.0-1.i386.rpm, 在~rpmbuild/SPRMS中得到hello-1.0.0-1.src.rpm。
如果我们只想得到二进制的rpm包,使用rpmbuild -bb,我们在RPMS中得到hello-1.0.0-1.i386.rpm,如果只想得到源代码包,使用rpmbuild –bs,我们在SRPMS中得到hello-1.0.0-1.src.rpm。如果只需要生成源文件,使用rpmbuild -bp,我们将在BUILD目录下面得到打好补丁的source code。
我们运行rpmbuild –ivh hello-1.0.0-1.i386就可以安装hello rpm包。
源码下载
有一篇很好的参考文档: