rpmbuild 命令详解

本文详细介绍了rpmbuild命令的使用方法,包括不同选项的作用及如何从spec文件、tar包或源码包构建RPM软件包。此外,还阐述了RPM软件包管理器的工作原理及其常用操作。

rpmbuild命令详解
 

引用地址:http://hi.baidu.com/litaosmile/blog/item /38af15fa08c995d7b58f3138.html
#rpmbuild
-bp 只作准备 (解压与打补丁)
-bc 准备并编译
-bi 编译并安装
-bl 检验文件是否齐全
-ba 编译后做成*.rpm和src.rpm
-bb 编译后做成*.rpm
-bs 只做成*.src.rpm

-tc -ti -ta -tb -ts 的功能类似,只是所需参数由spec文件变成tar包。

如:cd /usr/src/redhat/SPECS
rpmbuild -bp kernel-2.6.spec
更具体的用法说明:

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
                                   *显示使用方法的信息

附录:RPM的工作方法

        软件包管理器,其实按照我自己的理解,他就是个类似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)

                                                                                .

                                                                                .

                                                                                .

                                                                                .

          看来h#的要求没有办法被满足,那么输出错误的依赖关系

        error: Failed dependencies:

          libid3tag.so.0 is needed by alsaplayer-0.99.76-2.2.fc4.i386

          libmad.so.0 is needed by alsaplayer-0.99.76-2.2.fc4.i386

          libsndfile.so.1 is needed by alsaplayer-0.99.76-2.2.fc4.i386

          libsndfile.so.1(libsndfile.so.1.0) is needed by alsaplayer-0.99.76-2.2.f c4.i386

          libxosd.so.2 is needed by alsaplayer-0.99.76-2.2.fc4.i386

        下面是关闭数据库

        D: closed   db index        /var/lib/rpm/Pubkeys

        D: closed   db index        /var/lib/rpm/Conflictname

        D: closed   db index        /var/lib/rpm/Providename

        D: closed   db index        /var/lib/rpm/Basenames

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

        D: closed   db environment /var/lib/rpm/Packages

        D: May free Score board((nil))

        由此我可以粗略的知道RPM的工作方式:

        1,打开rpm数据库

        2,从.软件包中提取h#,并且检查h#的需要是否被满足?(这里的依赖关系,有的是软件
              包自己给出的,有的是你系统自带,当然还可能有你没有的。)

                是:转第4步   不是:转第3步

        3,显示失败的依赖关系

        4,安装软件,解压缩软件包,并且放到合适的位置,这里应该是有一定的规则。

        5,关闭rpm数据库

        显然,我这个软件包不满足依赖关系,如果强制用-force安装的话可能出错误。

        如果你失败了,那就少什么补什么...这个么 ?具体的东西么 T^T 以后研究吧

G:使用RPM安装和管理软件包软件包

          介绍一下参数.

          -U 升级,也包括安装

          -F 刷新,就是全体升级,不包括安装

          -v 显示详细信息, -vv显示更加详细的信息

          -h 显示文件释放的进度

          --force 嘿嘿 强制安装,这里强制安装不是忽略依赖关系,而是强制安装老版本或者是旧
                  的软件包

          --nodeps 忽略依赖关系,这个不可靠的

          --ignorearch 这个连主机构架都可以忽略.真的有用么?

          -e 删除软件包

          -q 查询软件包

          -qa 列出所有已经安装的软件包

        -qf file 列出该文件属于那个软件包

        -qi 列出软件包的详细信息

        -qR 列出所有软件包的倚赖关系

        -ql 列出软件包的所有文件

        -qd 列出软件包所有的文档

        -qc列出软件包所有的配置文件

        -qd列出未安装软件包的信息

再附上:
软件编译make过程,软件包编译必备工具和软件包复杂后缀解释方法



关于make运作方式

        我们通常用make来安装软件,那么make都作了什么呢?进入一个源代码目录名为rar

        make > info.txt

        看看我们的make都干了些什么?

        cat info.txt

        mkdir -p /usr/local/bin       -p表示需要时创建上级目录,目录存在的时候不做错误处理。

        mkdir -p /usr/local/lib

        cp rar unrar /usr/local/bin

        cp rarfiles.lst /etc

        cp default.sfx /usr/local/lib

        再看看,rar文件夹中makfile文件中都有些什么?

        cat Makefile

          PREFIX=/usr/local                                        这是shell变量.



          install:

          mkdir -p $(PREFIX)/bin

          mkdir -p $(PREFIX)/lib

          cp rar unrar $(PREFIX)/bin

          cp rarfiles.lst /etc

          cp default.sfx $(PREFIX)/lib  

        很像吧,没错,因为make是按照一定的规则去完成配置文件中的内容。这个配置文件默认的
名字是makefile,当然也可以变。这个配置文件对于我来说不需要会写,但是总要读的懂。

          了解下make命令的基本参数:偶不是编程的,捡有用的说。

           -c dir 这个是make工作的路径,默认是当然路径。

           -f filename 这个用指定的文件作为配置文件,默认是makefile。

           -d 打印debug信息

           在这个例子中我们可以知道make的工作方式,这对于从源代码运行程序是很有用的。



介绍一下可以用来搞定安装的全部工具。

        gcc-这个是编译器

        make-包含从makefiles产生二进制文件的make命令,当然还有其他的一些功能。

        glibc-重要的共享库,c库和基本的数学库。没有这个连系统都没有办法运行。

        glibc-devel-包含了创建可执行文件所需要的标准头文件。

        binutils-包含编译程序需要的使用工具,主要是汇编和链接程序。

        kernel-source-包含内核源代码

        libc-包含libc5,而上面我们提到的glibc是linc6

.

关于软件包。

        linux下你可以发现的软件包,会有不同的格式,这很讨厌,但是他可以让你知道,这些开源
          项目是在什么环境开发和编译出来的,支持什么。

        搜集一下

        filename-4.2.3.i386.rpm           这个表示可以用rpm来安装,我们最喜欢的方式。

        filename-4.2.3.tar.gz      这个表示用gz压缩,用tar归档,至于是什么,那就不知道了

        filename-4.2.3.src.tar.gz            这个表示用gz压缩,用tar归档,内容是源代码  

        filename-4.2.3.bin.SPARC.tar.gz   这个是表示用gz压缩,用tar归档,可以在SPARC工作站
                                           上运行,的2进制代码。

        filename-4.2.3.bin.ELF.static.tar.gz   这个表示用gz压缩,用tar归档,由静态连接的
                                                 FLF的可执行文件组成的2进制文件。

        4.2.3 表示第4版,第2个补丁,第3次修改。

        全面的说一下。

        rpm.有这个后缀表示是fedora使用的2进制文件,这个不是说里面的内容2进制的,而是说他可
                           以被fedora的软件管理器使用。可以用归档文件管理器把他打开。

        tar.这个是用tar归档,使用tar 命令打开

        gz.和z.这个是说用gzip压缩的,用gzip命令打开

        tgz.这个扩展名和以上的结合,容易搞定

        bz2.用bzip2压缩的,可以用bip2命令打开

        taz.和tz.这个表示用tar压缩,也用tar命令打开

        lsm.这个通常是介绍归档内容的文本,可以和软件包一起下载。

        deb.这个同rpm但是用于Debian

        如果你不能肯定格式的话,可以用file命令来确定.

        好了,现在你可以把源文件从任何软包中掏出来

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值