扩展阅读
  • Linux/centos/redhat下各种压缩解压缩方式详解
  • 请问redhat6.2或redhat7.0有没有汉化版本或汉化包。only redhat serial?
  • 红帽redhat下通过脚本和yum安装docker容器引擎的详细步骤
  • 我机器上装了win98SE,win2000 Server,和Mandrake linux,我想再装个RedHat,可是到后来我发现RedHat没有认出ManDrake,我装上RedHat后,Lilo
  • 不是说Liunx是免费发布的嘛,请问哪里可以下载RedHat 7.3或更高版本的redhat的完全安装版,请提供地址,我想装个redhat学学
  • 三个问题,关于RedHat7.2和RedHat7.3的........
  • REDHAT8 比 REDHAT7.x要好多少? 是不是对硬件要求比较高? 另外
  • redhat13.8与redhat9有什么驱别?
  • 求救!!安装redhat后,提示重启,但是没有没有redhat的启动选项
  • REDHAT8.0还是REDHAT9.0?
  • 请问:redhat 的桌面是gnome吗,我的redhat 9是默认安装的。
  • 请问如何做到redhat fedora core2和redhat linux enterprise 3 AS共存,谢谢
  • redhat 12与redhat 5.5有什么区别?不用序列号能不能用?
  • [RedHat9]RedHat9无法进入图形模式,疑是声卡问题,请教如何解决?
  • 菜鸟刚学redhat,redhat eth0 网卡怎么激活,在线等
  • 求Redhat9.0下载地址,Redhat9.0现在仍否允许免费下载?
  • Redhat7.2比较Redhat7.1在那些方面改进了?
  • winxp,redhat9.1双系统,现想删了redhat,请问怎做?
  • 先安装了redhat linux ,后来安装了windows,如何恢复redhat linux ?
  • 安装了虚拟机之后选择了RedHat之后,是不是还要另外安装RedHat系统?
  • redhat8.0下面安装的php跟redhat9.0下面安装的php有哪些不同?
  •  
    当前位置:  操作系统>Linux

    Redhat/Centos下rpmbuild命令从spec文件或者tar包建立rpm

     
        发布时间:2014-5-8  


        本文导语: 一. Redhat/Centos下rpmbuild介绍rpmbuild是用来指示转换的源码不定编译成二进制文件的包。二. Redhat/Centos下rpmbuild命令目录/usr/src/redhat--BUILD #编译之前,如解压包后存放的路径--BUILDROOT #编译后存放的路径--RPMS #打包完成后rpm包存放的路...

    一. Redhat/Centosrpmbuild介绍

    rpmbuild是用来指示转换源码不定编译成二进制文件的包。

    二. Redhat/Centos下rpmbuild命令目录

    /usr/src/redhat

    --BUILD #编译之前,如解压包后存放的路径

    --BUILDROOT #编译后存放的路径

    --RPMS #打包完成后rpm包存放的路径

    --SOURCES #源包所放置的路径

    --SPECS #spec文档放置的路径

    --SPRMS #源码rpm包放置的路径

    注:一般我们都把源码打包成tar.gz格式然后存放于SOURCES路径下,而在SPECS路径下编写spec文档,通过命令打包后,默认会把打包后的rpm包放在RPMS下,而源码包会被放置在SRPMS下。

      举例说明:

    如:cd /usr/src/redhat/SPECS

    rpmbuild -bp kernel-2.6.spec


    三. Redhat/Centos下rpmbuild命令相关选项

    基本格式:rpmbuild [options] [spec文档|tarball包|源码包]

    1.  从spec文档建立有以下选项:

    -bp  #只执行spec的%pre 段(解开源码包并打补丁,即只做准备)

    -bc  #执行spec的%pre和%build 段(准备并编译)

    -bi  #执行spec中%pre,%build与%install(准备,编译并安装)

    -bl  #检查spec中的%file段(查看文件是否齐全)

    -ba  #建立源码与二进制包(常用)

    -bb  #只建立二进制包(常用)

    -bs  #只建立源码包

    2.  从tarball包建立,与spec类似

    -tp #对应-bp

    -tc #对应-bc

    -ti #对应-bi

    -ta #对应-ba

    -tb #对应-bb

    -ts #对应-bs

    3.  从源码包建立

    --rebuild  #建立二进制包,通-bb

    --recompile  #同-bi

    4.  其他的一些选项

    --buildroot=DIRECTORY   #确定以root目录建立包

    --clean  #完成打包后清除BUILD下的文件目录

    --nobuild  #不进行%build的阶段

    --nodeps  #不检查建立包时的关联文件

    --nodirtokens

    --rmsource  #完成打包后清除SOURCES

    --rmspec #完成打包后清除SPEC

    --short-cricuit

    --target=CPU-VENDOR-OS #确定包的最终使用平台

    四. Redhat/Centos下rpmbuild SPEC文档的编写简介

    Name: 软件包的名称,后面可使用%{name}的方式引用,具体命令需跟源包一致

    Summary: 软件包的内容概要

    Version: 软件的实际版本号,具体命令需跟源包一致

    Release: 发布序列号,具体命令需跟源包一致

    Group: 软件分组建议使用标准分组


    License: 软件授权方式,通常就是GPL

    Source: 源代码包,可以带多个用Source1、Source2等源,后面也可以用%{source1}、%{source2}引用

    BuildRoot: 这个是安装或编译时使用的“虚拟目录”,考虑到多用户的环境,一般定义为:

    %{_tmppath}/%{name}-%{version}-%{release}-root

    %{_tmppath}/%{name}-%{version}-%{release}-buildroot-%(%{__id_u} -n}

      该参数非常重要,因为在生成rpm的过程中,执行make install时就会把软件安装到上述的路径中,在打包的时候,同样依赖“虚拟目录”为“根目录”进行操

    作。

    后面可使用$RPM_BUILD_ROOT 方式引用。

    URL: 软件的主页

    Vendor: 发行商或打包组织的信息,例如RedFlag Co,Ltd

    Disstribution: 发行版标识

    Patch: 补丁源码,可使用Patch1、Patch2等标识多个补丁,使用%patch0或%{patch0}引用

    Prefix: %{_prefix} 这个主要是为了解决今后安装rpm包时,并不一定把软件安装到rpm中打包的目录的情况。这样,必须在这里定义该标识,并在编

    写%install脚本的时候引用,才能实现rpm安装时重新指定位置的功能

    Prefix: %{_sysconfdir} 这个原因和上面的一样,但由于%{_prefix}指/usr,而对于其他的文件,例如/etc下的配置文件,则需要用%{_sysconfdir}标识

    Build Arch: 指编译的目标处理器架构,noarch标识不指定,但通常都是以/usr/lib/rpm/marcros中的内容为默认值

    序列号 iis7站长之家: 该rpm包所依赖的软件包名称,可以用>=或<=表示大于或小于某一特定版本,例如:libpng-devel >= 1.0.20 zlib

    “>=”号两边需用空格隔开,而不同软件名称也用空格分开,还有例如PreReq、Requires(pre)、Requires(post)、Requires(preun)、Requires(postun)、BuildRequires等都是针对不同阶段的依赖指定

    Provides: 指明本软件一些特定的功能,以便其他rpm识别

    Packager: 打包者的信息

    scription 软件的详细说明

    #spec脚本主体

    spec脚本的主体中也包括了很多关键字和描述:

    %prep 预处理脚本

    %setup -n %{name}-%{version} 把源码包解压并放好

    注:可根据你的源码的名字格式,来确认解压后名字的格式,否则可能导致install的时候找不到对应的目录

    通常是从/usr/src/redhat/SOURCES里的包解压到/usr/src/redhat/BUILD/%{name}-%{version}中。

    一般用%setup -c就可以了,但有两种情况:一就是同时编译多个源码包,二就是源码的tar包的名称与解压出来的目录不一致,此时,就需要使用-n参数指定

    一下了。

    %patch 打补丁

    通常补丁都会一起在源码tar.gz包中,或放到SOURCES目录下。一般参数为:

    %patch -p1 使用前面定义的Patch补丁进行,-p1是忽略patch的第一层目录

    %Patch2 -p1 -b xxx.patch 打上指定的补丁,-b是指生成备份文件

    %setup 不加任何选项,仅将软件包打开。

    %setup -n newdir 将软件包解压在newdir目录。

    %setup -c 解压缩之前先产生目录。

    %setup -b num 将第num个source文件解压缩。

    %setup -T 不使用default的解压缩操作。

    %setup -T -b 0 将第0个源代码文件解压缩。

    %setup -c -n newdir 指定目录名称newdir,并在此目录产生rpm套件。

    %patch 最简单的补丁方式,自动指定patch level

    %patch 0 使用第0个补丁文件,相当于%patch ?p 0。

    %patch -s 不显示打补丁时的信息。

    %patch -T 将所有打补丁时产生的输出文件删除

    %build 开始构建包

    在/usr/src/redhat/BUILD/%{name}-%{version}目录中进行make的工作 ,常见写法

    make %{?_smp_mflags} OPTIMIZE="%{optflags}"

    都是一些优化参数,定义在/usr/lib/rpm/marcros中

    %install 开始把软件安装到虚拟的根目录中

    在/usr/src/redhat/BUILD/%{name}-%{version}目录中进行make install的操作。这个很重要,因为如果这里的路径不对的话,则下面%file中寻找文件的时候

    就会失败。 常见内容有:

    %makeinstall 这不是关键字,而是rpm定义的标准宏命令。也可以使用非标准写法:

    make DESTDIR=$RPM_BUILD_ROOT install  或  make prefix=$RPM_BUILD_ROOT install

    需要说明的是,这里的%install主要就是为了后面的%file服务的。所以,还可以使用常规的系统命令:

    install -d $RPM_BUILD_ROOT/ #建立目录

    cp -a * $RPM_BUILD_ROOT/

    %clean 清理临时文件

    通常内容为:

    引用

    [ "$RPM_BUILD_ROOT" != "/" ] && rm -rf "$RPM_BUILD_ROOT"

    rm -rf $RPM_BUILD_DIR/%{name}-%{version}

    ※注意区分$RPM_BUILD_ROOT和$RPM_BUILD_DIR:

    $RPM_BUILD_ROOT是指开头定义的BuildRoot,而$RPM_BUILD_DIR通常就是指/usr/src/redhat/BUILD,其中,前面的才是%file需要的。

    %pre rpm安装执行的脚本

    %post rpm安装后执行的脚本

    %preun rpm卸载前执行的脚本

    %postun rpm卸载后执行的脚本

    %preun %postun 的区别是什么呢?

    前者在升级的时候会执行,后者在升级rpm包的时候不会执行

    %files 定义那些文件或目录会放入rpm中

    这里会在虚拟根目录下进行,千万不要写绝对路径,而应用变量表示相对路径。如果描述为目录,表示目录中除%exclude外的所有文件。

    五. Redhat/Centos下rpmbuild spec文档中常用的几个宏(变量)

    1. RPM_BUILD_DIR:    /usr/src/redhat/BUILD

    2. RPM_BUILD_ROOT:   /usr/src/redhat/BUILDROOT


    六 , Redhat/Centos下rpmbuild具体用法参考:

    Build options with [ <specfile> | <tarball> | <source package> ]:

    *建立包的选项有:[ 从文件<specfile>建立 |从 <tarball>包建立 |从 <source package>包建立]

    *从文件<specfile>建立

     -bp      build through %prep (unpack sources and apply patches) from <specfile>

                 * -bp 从<specfile>文件的%prep段开始建立(解开源码包并打补丁)

     -bc      build through %build (%prep, then compile) from <specfile>

                 *-bc 从<specfile>文件的%build

     -bi       build through %install (%prep, %build, then install) from <specfile>

     -bl       verify %files section from <specfile>

                 *检查<specfile>文件的%files段

     -ba      build source and binary packages from <specfile>

                 *建立源码和二进制包

     -bb      build binary package only from <specfile>

                 *只建立二进制包

     -bs      build source package only from <specfile>

                 *只建立源码包


    *从 <tarball>包建立

     -tp      build through %prep (unpack sources and apply patches) from <tarball>

     -tc      build through %build (%prep, then compile) from <tarball>

     -ti       build through %install (%prep, %build, then install) from <tarball>

     -ta      build source and binary packages from <tarball>

                *建立源码和二进制包

     -tb      build binary package only from <tarball>

                *只建立二进制包

     -ts      build source package only from <tarball>

                *只建立源码包


    *从 <source package>包建立

     --rebuild  

               build binary package from <source package>

                *建立二进制包

     --recompile

              build through %install (%prep, %build, then install) from <source package>

    *rpmbuild的其他使用项

     --buildroot=DIRECTORY  override build root

                                             *确定以root目录建立包

     --clean                           remove build tree when done

                                             *完成打包后清除BUILD下的文件目录

     --nobuild                       do not execute any stages of the build

                                             *不进行BUILD的阶段

     --nodeps                       do not verify build dependencies

                                             *不检查建立包时的关联文件

     --nodirtokens  

            generate package header(s) compatible with (legacy) rpm[23] packaging

     --rmsource                   remove sources when done

                                          *完成打包后清除sources

     --rmspec                      remove specfile when done

                                          *完成打包后清除specfile

     --short-circuit              skip straight to specified stage (only for c,i)

                                         *跳过


     --target=CPU-VENDOR-OS

               override target platform

                *确定包的最终使用平台


    Common options for all rpm modes:

    *所有rpm都可使用的选项

     -D, --define='MACRO EXPR'     define MACRO with value EXPR

                                                  *预定义

     -E, --eval='EXPR'          print macro expansion of EXPR

                                            *显示大量EXPR扩展信息

     --macros=<FILE:...>    read <FILE:...> instead of default file(s)

                                            *读<FILE:...>文件代替默认文件

     --nodigest                   don't verify package digest(s)

                                            *不检查包的说明信息

     --nosignature              don't verify package signature(s)

                                           *不检查包的签名信息

     --rcfile=<FILE:...>        read <FILE:...> instead of default file(s)

                                           *读<FILE:...>文件代替默认文件

     -r, --root=ROOT           use ROOT as top level directory (default: "/")

                                           *使ROOT为最高级别的路径

     --querytags                 display known query tags

                                          *显示已知的有疑问的地方

     --showrc                      display final rpmrc and macro configuration

                                           *显示最终的配置信息

     --quiet                         provide less detailed output

                                           *提供少量的信息

     -v, --verbose               provide more detailed output

                                           * 提供大量的详细的信息

     --version                     print the version of rpm being used

                                           *显示rpm包的版本



    Options implemented via popt alias/exec:

    *附加选项

     --dbpath=DIRECTORY   use database in DIRECTORY

     --with=<option>          enable configure <option> for build

                                            *建立时允许配置的选项

     --without=<option>     disable configure <option> for build

                                           *建立时不允许配置的选项


    Help options:

    *帮助选项

     -?, --help                    Show this help message

                                      * 显示帮助信息

     --usage                       Display brief usage message

                                     *显示使用方法的信息


    七. Redhat/Centos下rpmbuild的工作方法

           软件包管理器,其实按照我自己的理解,他就是个类似rarlinux的归档管理器,只不过用有自己特定的释放方式。现在我们找一个例子来实验一下


           rpm -uvv alsaplayer-0.99.76-2.2.fc4.i386.rpm

           这个软件包是我随便找的,不必在乎他是是么 -U表示安装,v表示显示信息,vv就表示显示更详细的信息

           把显示内容当中对我们有用的挑出来

           D: opening   db environment /var/lib/rpm/Packages joinenv

           D: opening   db index        /var/lib/rpm/Packages rdonly mode=0x0

           D: locked   db index        /var/lib/rpm/Packages

           D: opening   db index        /var/lib/rpm/Pubkeys rdonly mode=0x0

           warning: alsaplayer-0.99.76-2.2.fc4.i386.rpm: Header V3 DSA

          signature: NOKEY, ke y ID e42d547b

           D: opening   db index        /var/lib/rpm/Providename rdonly mode=0x0

           以上应该是打开一个rpm数据库

           D:       added binary package [0]    增加一个软件包

           D: found 0 source and 1 binary packages          没有源文件,        有一个2进制的软件包1

           D: opening   db index        /var/lib/rpm/Depends create mode=0x0

           D: opening   db index        /var/lib/rpm/Basenames rdonly mode=0x0                         D:   read h#    1166 Header sanity check: OK                  读取h# ,      貌似是头文件 ,检查h#的需求             D:   read h#      161 Header V3 DSA signature: OK, key ID 4f2a6fd2

           D:   Requires: /bin/sh                                                   YES (db files)

           D:   Requires: /bin/sh                                                   YES (cached)


           D:   read h#       88 Header V3 DSA signature: OK, key ID 4f2a6fd2

           d:   requires: libflac.so.7                                            yes (db provides)

           D:   read h#       95 Header V3 DSA signature: OK, key ID 4f2a6fd2

           D:   Requires: libGL.so.1                                               YES (db provides)

           D:   Requires: libOggFLAC.so.3                                        YES (db provides)

           D:   read h#       48 Header V3 DSA signature: OK, key ID 4f2a6fd2

           D:   Requires: libX11.so.6                                              YES (db provides)

           D:   read h#       49 Header V3 DSA signature: OK, key ID 4f2a6fd2

           D:   Requires: libXext.so.6                                            YES (db provides)

           D:   read h#       54 Header V3 DSA signature: OK, key ID 4f2a6fd2          D:   Requires: libXi.so.6                                               YES (db provides)

           D:   read h#      398 Header V3 DSA signature: OK, key ID 4f2a6fd2

           D:   Requires: libasound.so.2                                          YES (db provides)

    相关文章推荐:
  • vmware中建立了redhat,启动时说没有引导的系统,难道还要启动盘?顶也有分!
  • 请教:我在redhat下用glade建立菜单,可一点菜单编辑glade就死机了是什么原因?
  • redhat下为一程序在应用程序->internet菜单里建立一个快捷方式(菜单项),为何点击后提示权限不够?
  • redhat9.0中用loacte搜出许多实际上已经被删除的文件,却见不到刚建立的文件,这是怎么回事?
  • 请问在redhat7.3如何建立一个和root权限相同的用户?
  • Redhat9下的KDevelop环境,如何建立一个生成动态库的工程?
  • 为什么redhat linux 9上建立的网站,在其他机器上访问,输入网址时必须打一个端口号才可以访问呢?
  • 问个问题,redhat加sendmail建立smtp邮件服务器该如何办,125分我最多能给的了,谢谢 。急!


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3