rpmbuild 基本知识

来源:互联网 发布:华为公司bcg矩阵分析 编辑:程序博客网 时间:2024/06/05 06:44

编译目录组成介绍

rpm-build 包和  /usr/src/redhat ,这些 rpm build 的程序是要靠 spec 文件的控制。它是配置指定安装到另外的机器上的,用来指示转换的源码补丁编译成二进制文件的包。默认编译操作是在下面的目录中,它是编译源码的相关动作操作的位置。
如果不指定其它的地方,那么 rpm building 的地方是主要在 /usr/src/redhat 的目录,目录的架构如下,这就是为 rpm-build 提供的目录结构.

/usr/src/redhat/|-- BUILD|-- RPMS|   |-- i386|   `-- ...|-- SOURCES|   |-- foo-1.2.tar.gz|   |-- foo-1.2-add_feature.patch|   `-- foo-1.2-change_default.patch|-- SPECS|   `-- foo.spec`-- SRPMS

文件的提取,编译都将在 BUILD 的目录,运行后结果的包会在 RPMS 和 RPMS 目录.

 

 

RPM 的宏命令

宏(Macros)是使用变量和功能来控制rpm和 rpmbuild 的自定义的行为,宏指令一般地定义在 spec 文件中。语法象 %define macro value .宏指定也可以事先在配置文件中调整。
就是下面的文件。

  • 默认设置为 /usr/lib/rpm/macros or /etc/rpm/macros
  • 用户设置 ~/.rpmmacros

在打包的过程中,spec files 和 rpmbuild 能使用RPM 的宏命令中的变量.
此外,在 rpmbuild 时要不顾当前设置,可以在后面加上 –define=’macro value’ 选项,要显示当前的宏指令可以使用 rpm –eval %{macro} ,也可以rpm –showrc 来 dump 全部当前的宏指令和设置。

你没有必要使用所有的宏指令,也能容易的管理 rpm 的 spec 文件。一个好的建议是,不要编译包使用 root 用户.你能创建一个 ${HOME}/.rpmmacro 文件,然后设置 %_topdir ,非 root 用户能就能不使用 /usr/src/redhat 架构的目录在系统上。另外还有一个好处,就是安装  SRPMs 时,会安装到 %_topdir 目录.宏指令象 %_rpmdir, %_specdir 可以更加细的控制 rpm 在编译过程中的目录.

宏指令有时指定在使用命令时,%configure 宏运行源码在 .configure 脚本在运行源码给合适的你的机器架构信息。 %makeinstall 宏指令通过使用 GNU Automake 传送合适的选项。

宏指令的目录是参考本地的相关信息, %_tmppath 是编译时的临时的目录,默认设置的是 /var/tmp. 其它的宏指令如 %_perfix 是设置目录象 %configure 宠中和 –prefix 的选项.默认是 /usr.这个 %_perfix 选项也会影响到其它使用这个目录的变量,如 %_bindir 它是设置的 %{_prefix}/bin 为默认的. 可以通过 /usr/lib/rpm/macros 查看其它更加多的例子.

在运行时可以重新定义宏,用户自己可以设置rpm-build的非特权的目录%{_topdir}. 来指定任意目录.
 

 

Spec 文件

重点注意

  1. 版本: Name,Version,Release
  2. 其它软件有关的信息: Group,License,URL,Summary
  3. 先决条件: PreReq,Requires,BuildPreRep,Provides,Obsoletes,Conflicts
  4. 输入: Source[#],Patch[#]
  5. BuildRoot,BuildArch

 

 

%define name foo  # 名字%define version 1.2  #versionName: %{name}   #name 就是使用的上面的宏指令Version: %{version}   #version 也是使用的上面的宏指令Release: 3License: GPLGroup: Applications/Productivity  # 软件是哪个组的,更多信息查看 /usr/share/doc/rpm-version/GROUPSURL: http://www.foo.orgSource: ftp://www.foo.org/pub/people/elvis/%25%7Bname%7D-%25%7Bversion%7D.tar.gzPatch0: foo-1.2-change_default.patchPatch1: foo-1.2-add_feature.patchPreReq: unzip   # 安装前需要什么Requires: pam  # 安装后需要什么BuildPreReq: gcc >= 2.96 #打包前需要什么BuildRoot: %{_tmppath}/%{name}-root  # 准备源码文件的 chroot 的目录Summary: A fictional open source package for the offering.  #摘要%description              #描述

注意,spec 文件很多信息都是取自宏指令,如果没有明确指定,就会继承 /usr/lib/rpm/macros 和其它相关宏指令的文件.

 

Spec 文件之 %prep 
%prep 这部分其它是由一些参数来组成一个 shell 脚本来从 SOURCES 中解压源码和应用补丁到 BUILD 目录中来准备下面的编译。
和 %prep 相关的宏指令
%setup
%patch
例:

%prep%setup -q   #提取源码到 BUILD 目录; -q 指不显示输出(quietly)%patch0 -p1  # 应用 patch0%patch1 -p1 -b .orig   # 应用 Patch1 但是存下源文件成 .oring 的后缀unzip foo_data.zip   # 接下来解压 zip 文件

 

 

1. Spec 文件之 %build 
%build 是编译和准备软件,运行象一个 shell 脚本,它运行在上下文目录指定的源码目录。在编译过程中,调用脚本 .config 在本地的目录(%configure 中配置的).
和 %build 相关的宏
%configure  # 可以通过运行 rpm -eval %configure 来看它的设置
例:

%build%configure --enable-sharedCFLAGS=-O2 make

 

 

2. Spec 文件之 %install
%install 是用来准备 rpm 的文件。文件是在 chroot 到指定的 BuildRoot 中的目录树,通过 copied 来打包.
$RPM_BUILD_ROOT 来设置 BuildRoot.
主要不能使用 root 来编译的主要原因是,在编译的过程中有可能会有文件替换到你系统中BuildROot中的文件.%{_mandir}, %{_bindir} , %{_sysconfdir}, etc. 是使用的标准的本地目录.
例:

%installrm -rf $RPM_BUILD_ROOT   # 默认的$RPM_BUILD_ROOT 是 /var/tmp/%{name}-rootmake DESTDIR=$RPM_BUILD_ROOT install   # 指定安装文件的路径install -m644 foo.8 ${RPM_BUILD_ROOT}/%{_mandir}/man8/foo.8

 

 

3. Spec 文件之 %clean
%clean 是用来清理 build 后的临时文件,主要是怕这些旧的文件影响以后编译。主要是要删除 $RPM_BUILD_ROOT 和运行 make clean 。
例:

%cleanrm -rf $RPM_BUILD_ROOTmake clean

 

 

4. Spec 文件之 %Scriptlets
这些选项可以让你动态的使用 shell 脚本来控制安装和删除,
%pre,%post  是用脚本运行在包安装后,注意没法交互 
%preun,%postun  用脚本运行在包删除时
rpm -q –scripts packagename # 可以看到脚本的信息

例如:

%pregroupadd -g 201 foouseradd -g foo -s /bin/false -d /var/foo -M foo%post/sbin/ldconfigchkconfig --add food%preunif [ $1 = 0 ]then     service food stop > /dev/null 2>&1     chkconfig --del foodfi%postunif [ $1 = 0 ]then     userdel foo     groupdel fooelse     /sbin/ldconfig     service food condrestart > /dev/null 2>&1fi

注意,在这个当中的 $1 的数字,如果是 1 是指是第一次安装,如果是 2 是指也许是升级。如果是 0 在 %postun , 是指被完全的删除

 

6. Spec 文件之 %files
%files 任何打包的文件,都需要在这个包的详细的文件列表中,如果是目录,包的所有者的全部目录都在中间,%dir 来指定空目录,可以用 %files -f /tmp/dyanmic_filelist 来指定一个文件列表。默认 %config 会替换掉配置,给原来的配置修改名字为 .rpmorig ,如果不想修改的话,就用%config(noreplace) 就会给新的配置文件名字命名为 .rpmnew.
%defattr(mode,user,group)
    %attr(mode,user,group) filename
%config  配置文件
%doc 文档
例:

%files%defattr(-,root,root)%config /etc/foo.conf # 指定了才能在更新和删除时有用/usr/sbin/food/usr/bin/foo%doc README # 目录是在 /usr/share/doc/%{name}-%{version}%doc /usr/share/man/man8/food.8/usr/share/foo/%dir /var/lock/foo/  # 空的目录

 

 

7. Spec 文件之 %changelog
%changelog 是记录包的修改,比如加入一个新的补丁,修改配置,日志使用 data +"%a %b %d %Y",需要显示包的日志改变的信息可以使用 rpm-q –changelog.
例:

%changelog• Mon Aug 5 2002 Elvis Presley

 -------------------------------------------------------------------------------------------------------------------------------

 

一、安装 rpmbuild

// for fedora linux

yum install rpmbuild -y

// for ubuntu

apt-get install rpmbuild

二、rpm specification file

spec文件规范
能熟练掌握以上命令以及部分参数含义,管理日常的rpm软件包就不成问题了。然而随着Linux风靡全球,越来越多的开发者喜欢采用RPM格式来发布自己的软件包。那么RPM软件包是怎样制作的呢?对大多数Linux开发工程师来说是比较陌生的。

其实,制作RPM软件包并不是一件复杂的工作,其中的关键在于编写SPEC软件包描述文件。要想制作一个rpm软件包就必须写一个软件包描述文件 (SPEC)。这个文件中包含了软件包的诸多信息,如软件包的名字、版本、类别、说明摘要、创建时要执行什么指令、安装时要执行什么操作、以及软件包所要 包含的文件列表等等。

描述文件说明如下:

(1) 文件头

一般的spec文件头包含以下几个域:

Summary:
用一句话概括该软件包尽量多的信息。

Name:
软件包的名字,最终RPM软件包是用该名字与版本号,释出号及体系号来命名软件包的。

Version:
软件版本号。仅当软件包比以前有较大改变时才增加版本号。

Release:
软件包释出号。一般我们对该软件包做了一些小的补丁的时候就应该把释出号加1。

Vendor:
软件开发者的名字。

Copyright:
软件包所采用的版权规则。具体有:GPL(自由软件),BSD,MIT,Public Domain(公共域),Distributable(贡献),commercial(商业),Share(共享)等,一般的开发都写GPL。

Group: 
软件包所属类别,具体类别有:
Amusements/Games (娱乐/游戏)
Amusements/Graphics(娱乐/图形)
Applications/Archiving (应用/文档)
Applications/Communications(应用/通讯)
Applications/Databases (应用/数据库)
Applications/Editors (应用/编辑器)
Applications/Emulators (应用/仿真器)
Applications/Engineering (应用/工程)
Applications/File (应用/文件)
Applications/Internet (应用/因特网)
Applications/Multimedia(应用/多媒体)
Applications/Productivity (应用/产品)
Applications/Publishing(应用/印刷)
Applications/System(应用/系统)
Applications/Text (应用/文本)
Development/Debuggers (开发/调试器)
Development/Languages (开发/语言)
Development/Libraries (开发/函数库)
Development/System (开发/系统)
Development/Tools (开发/工具)
Documentation (文档)
System Environment/Base(系统环境/基础)
System Environment/Daemons (系统环境/守护)
System Environment/Kernel (系统环境/内核)
System Environment/Libraries (系统环境/函数库)
System Environment/Shells (系统环境/接口)
User Interface/Desktops(用户界面/桌面)
User Interface/X (用户界面/X窗口)
User Interface/X Hardware Support (用户界面/X硬件支持)

Source:
源程序软件包的名字。如 stardict-2.0.tar.gz。

%description:
软件包详细说明,可写在多个行上。

(2)%prep段

这个段是预处理段,通常用来执行一些解开源程序包的命令,为下一步的编译安装作准备。%prep和下面的%build,%install段一样,除 了可以执行RPM所定义的宏命令(以%开头)以外,还可以执行SHELL命令,命令可以有很多行,如我们常写的tar解包命令。

(3)%build段

本段是建立段,所要执行的命令为生成软件包服务,如make 命令。

(4)%install段

本段是安装段,其中的命令在安装软件包时将执行,如make install命令。

(5)%files段

本段是文件段,用于定义软件包所包含的文件,分为三类--说明文档(doc),配置文件(config)及执行程序,还可定义文件存取权限,拥有者及组别。

(6)%changelog段

本段是修改日志段。你可以将软件的每次修改记录到这里,保存到发布的软件包中,以便查询之用。每一个修改日志都有这样一种格式:第一行是:* 星期 月 日 年 修改人 电子信箱。其中:星期、月份均用英文形式的前3个字母,用中文会报错。接下来的行写的是修改了什么地方,可写多行。一般以减号开始,便于后续的查阅。

三、源代码打包

将源代码打包,如 stardict-2.0.tar.gz,并将文件放到spec文件Source段所描述的路径下,通常为/usr/src/redhat/SOURCES/目录下(不同的Linux发布版本略有不同,如OpenSUSE为 /usr/src/packages/SOURCES/)

四、rpm打包

rpmbuild -ba ‘spec文件路径’

(rpmbuild常用参数: -bb 只编译二进制rpm包 -bs 只编译源码rpm包 -ba 同时编译二进制和源码rpm包)

build完后,可以在/usr/src/redhat/RPMS/下找到二进制rpm包,rpm包按照其对应的cpu体系结构分类,通常在/usr/src/redhat/RPMS/i386目录下

 /usr/src/redhat/SRPMS/下找到源码rpm包,此时由于是源代码,所以无须按体系结构分类。

原创粉丝点击