momo zone

调核人的blog

rpm 打包小结

  通过一个简单的hello
world例子来打一个名字为hello的rpm包。

/** hello.c */

#include <stdio.h>

int main(){

        printf("Hello, world! version 1.0.0n");

}

  这个是最简单的例子,放置在目录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<Email-address> –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包。

Advertisements

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s

%d 博主赞过: