动手制作SRPM

发表于:2007-07-04来源:作者:点击数: 标签:
SRPM 需要的套件: 在上一节当中,我们介绍了 RPM 这个既可爱又可恨的家伙,RPM 的可爱在于他的资料库管理方式,很容易去查询与升级,而他的可恨呢?呵呵!就是在于他的 binary 的档案不能再改变他的原始设定内容 ( 就是 *.rpm 的档案不能再重新编译的意思 )

  SRPM 需要的套件:
  在上一节当中,我们介绍了 RPM 这个既可爱又可恨的家伙,RPM 的可爱在于他的资料库管理方式,很容易去查询与升级,而他的可恨呢?呵呵!就是在于他的 binary 的档案不能再改变他的原始设定内容 ( 就是 *.rpm 的档案不能再重新编译的意思 ),与套件及套件之间的属性相依的问题~还真是伤脑筋吶!
  没有关系,现在有解决的方法了!我们可以利用『含有 source code 的 SRPM 』来重新编译 *.rpm 的档案成为我们所希望的样式了!就因为在 SRPM 里面含有的不是 binary 的档案,而是含有 source code ,因此 SRPM 是不能直接拿来安装成为可执行的档案的。必需要将他重新编译,并且打包成为类似 i386, i586, i686 等等 RPM 的档案之后,才能够安装在我们的系统当中哩!这个时候你就应该会想象啦,咦!既然如此的话,那么在编译的过程当中,我们是否可以加入其他的设定参数,来让我们的 SRPM 可以依照我的想法来编译呢!?哈哈!答对了!所以呢,这个时候我们就要来修改别人的 SRPM 以及编译自己的套件啦!
  不过这里需要特别留意的就是,因为 SRPM 需要重新编译,而编译的过程当中,我们至少需要有 make 与其相关的程式,及 gclearcase/" target="_blank" >cc, c, c++ 等其他的编译用的程式语言来进行编译,所以,如果您在安装的过程当中没有选取软体开发工具之类的套件,呵呵!得重新拿出你的光碟,然后再安装喔!哈哈!只是得要克服一大堆的属性相依的问题就是了~嗯!还是建议您再次的看一下如何安裝吧!
  SRPM 使用到的目录:
  SRPM 既然含有 source code ,那么其中必定有设定档啰,所以首先我们必需要知道,这个 SRPM 在进行编译的时候,会使用到哪些目录呢?这样一来才能够来修改嘛!你可以到你的 /usr/src 这个目录里面去查看一下,通常每个 distribution 提供的目录都不太相同,以 Mandrake 9.0 为例,他是以 /usr/src/RPM 为工作目录, Red Hat 是以 /usr/src/redhat 为工作目录, Openlinux 则是以 /usr/src/openlinux 为工作目录!无论如何,反正就是在 /usr/src 这个目录下就对了!好了到 /usr/src/redhat 里头去看一看呦:
  ·/usr/src/redhat/SPEC:这个目录当中放置的是该套件的设定档,例如这个套件的资讯参数、设定项目等等都放置在这里;
  ·/usr/src/redhat/SOURCE:这个目录当中放置的是该套件的原始档(*.tar.gz的档案)以及 config 这个设定档;
  ·/usr/src/redhat/BUILD:在编译的过程中,有些暂存的资料都会放置在这个目录当中;
  ·/usr/src/redhat/RPMS:经过编译之后,并且顺利的编译成功之后,将打包完成的档案放置在这个目录当中。里头有包含了 i386, i586, i686, noarch.... 等等的次目录。
  此外,在编译的过程当中,可能会发生不明的错误,或者是设定的错误,这个时候就会在 /tmp 底下产生一个相对应的错误档,您可以根据该错误档进行除错的工作呢!等到所有的问题都解决之后,也编译成功了,那么刚刚解压缩之后的档案,就是在 /usr/src/redhat/SPEC, SOURCE, BUILD 等等的档案都会被杀掉,而只剩下放置在 /usr/src/redhat/RPMS 底下的档案了!
  设定档的主要内容:
  刚刚我们在上面提过了,SRPM还可以更改一些设定的内容,那么要如何修改这些设定的内容呢?我们以简单的 rp-pppoe 这个套件来说明好了,你可以连上 Internet 上面的 rp-pppoe 官方网站下载 SRPM ,或者由以下的方式来下载这个套件(请注意底下的档案是 2002/11 最新的档案资料,有可能在您看到本文时,这个套件已经更新了,所以请直接上底下的网址来下载吧!http://www.roaringpenguin.com/pppoe/)。至于基本的过程如下:
  1. 下载 SRPM 软体: [root @test root]# wget http://www.roaringpenguin.com/pppoe/rp-pppoe-3.5-1.src.rpm 2. 将 SRPM 解开在/usr/src/redhat 底下的目录当中 [root @test root]# rpm –i rp-pppoe-3.5-1.src.rpm 3. 观察一下有哪些原始码呢? [root @test root]# cd /usr/src/redhat/SOURCES [root @test SOURCE]# ls –l -rw-rw-r-- 1 root root 189321 Jul 8 22:38 rp-pppoe-3.5.tar.gz 呵呵!上面显示我们的原始码就是这个档案啦!
  好了,来看看我们的设定参数档,亦即是在 /usr/src/redhat/SPECS 内的 *.spec 档案啰!
  观察一下预设的设定档案内容: [root @test root]# cd /usr/src/redhat/SPECS [root @test SPECS]# vi rp-pppoe.spec 没错!这个就是SRPM的预设设定内容档案啰,进去修改一下,里面的资料有点像这样: Summary: PPP Over Ethernet (xDSL support) Name: rp-pppoe Version: 3.5 %if %(%{expand:test %{_vendor} != mandrake ; echo $?}) Release: 1mdk %else Release: 1 %endif Copyright: GPL Group: System Environment/Daemons Source: http://www.roaringpenguin.com/pppoe/rp-pppoe-3.5.tar.gz Url: http://www.roaringpenguin.com/pppoe/ Packager: David F. Skoll BuildRoot: /tmp/pppoe-build Vendor: Roaring Penguin Software Inc. Requires: ppp >= 2.3.7 # LIC: GPL %description PPPoE (Point-to-Point Protocol over Ethernet) is a protocol used by many ADSL Internet Service Providers. Roaring Penguin has a free client for Linux systems to connect to PPPoE service providers. The client is a user-mode program and does not require any kernel modifications. It is fully compliant with RFC 2516, the official PPPoE specification. %prep %setup cd src ./configure --mandir=%{_mandir} %build cd src make cd ../gui make %install cd src make install RPM_INSTALL_ROOT=$RPM_BUILD_ROOT cd ../gui make install RPM_INSTALL_ROOT=$RPM_BUILD_ROOT %clean rm -rf $RPM_BUILD_ROOT %files %defattr(-,root,root) %doc doc/CHANGES doc/HOW-TO-CONNECT doc/LICENSE doc/KERNEL-MODE-PPPOE README SERVPOET %config(noreplace) /etc/ppp/pppoe.conf 注:中间还有很多资讯,被我省略掉了!知道了就好喔! %changelog * Thu Jul 21 2001 Shigechika AIKAWA - merged rp-pppeo.spec and rp-pppoe-gui.spec
  注意到的是rp-pppoe.sepc这个档案,这是主要的将SRPM编译成RPM的设定档,他的基本规则可以这样看:
  1.整个档案的开头以Summary为开始,这部份的设定都是最基础的说明内容;
  2.然后每个不同的段落之间,都以%来做为开头,例如%prep与%install等;
  我们来谈一谈几个常见的SRPM设定段落:
  ·系统整体资讯方面:
  oSummary:主要的套件说明,例如上表中,我们说明了他是ppp的拨接用途啦!
  oName:这个就是套件的名称;
  oVersion:这个是套件的版本资讯;
  oRelease:这个是该版本打包的次数说明,在Mandrake里面,会自动的帮你设定打包的次数喔!就是1mdk那个咚咚;
  oCopyright:这个套件的授权模式,我们是使用GPL啦!
  oGroup:这个套件的发展团体名称;
  oSource:这个套件的来源,如果是网路上下载的套件,通常一定会有这个资讯来告诉大家这个原始档的来源!
  oUrl:这个原始码的主要官方网站; Packager:这个套件是经由谁来打包的呢?
  oVender:发展的厂商哪;
  oExclusiveArch:这个是说明这个套件的适合安装的硬体,通常预设为i386,当然,你也可以调整为i586啦等等的!
  oRequires:如果你这个套件还需要其他的套件的支援,那么这里就必需写上来,则当你制作成RPM之后,系统就会自动的去检查啦!这就是『相依属性』的主要来源啰!
  上面几个资料通常都必需要写啦!但是如果你的软体没有相依属性的关系时,那么就可以不需要那个Requires啰!
  ·%description
  将您的套件做一个简短的说明!这个也是必需要的。
  ·%prep
  这部份的设定在于『尚未进行设定或安装之前,你要编译完成的RPM帮你事先做的事情』,就是prepare的简写啰!那么他的工作事项主要有:
  1.寻找套件所需要的目录是否已经存在?确认用的!
  2.事先建立您的套件所需要的目录,或者事先需要进行的任务;
  3.如果待安装的Linux系统内已经有安装的时候可能会被覆盖掉的档案时,那么就必需要进行备份(backup)的工作了!
  大致的工作就是这些啦!
  ·%setup
  这个段落就是在建立我们在Tarball当中说明的那个Makefile档案啦!所以呢,当然就是执行./config之类的设定档案啰!那么如果你要自己新增自己的参数,就可以在这个地方加入你的设定值!如果你的软体本身没有这方面的需要,里面就不需要编写内容啰!
  ·%build
  build就是建立啊!所以当然啰,这个段落就是在谈怎么make编译成为可执行的程式啰!
  ·%install
  编译完成(build)之后,就是要安装啦!安装就是写在这里,也就是类似Tarball里面的make install的意思啰!
  ·%files
  这个套件安装的档案都需要写到这里来,当然包括了『目录』喔!所以连同目录请一起写到这个段落当中!以备查验呢!^_^
  ·%changelog
  这个主要则是在记录这个套件曾经的更新纪录啰!
  好了,那么如果您有自订的资讯想要加入的话,就选择你要加入的那个段落,将他修改一下吧!例如,如果你在设定Makefile的时候,希望能够多一些额外的参数设定,那么就找到 %setup 那个段落,将他修改成您所需要的样子,就可以啰!
  SRPM 的编译指令:
  再来呢?嗯!没错,修改完成了,自然就是要将他编译成可以安装的RPM档案啦!这个时候我们就可以直接在/usr/src/redhat/SPECS底下下达:
  [root @test SPECS]# rpm -bb rp-pppoe.spec <==编译成RPM档案 [root @test SPECS]# rpm -ba rp-pppoe.spec <==打包成SRPM档案
  这个时候系统就会这样做:
  1.先进入到BUILD这个目录中,在Mandrake 9.0当中就是/usr/src/RPM/BUILD,在Red Hat底下就是/usr/src/redhat/BUILD这个目录;
  2.依照*.spec档案内的Name与Version设定定义出工作的目录名称,以我们上面的例子为例,那么系统就会在BUILD目录中先删除rp-pppoe-3.5的目录,再重新建立一个rp-pppoe-3.5的目录,并进入该目录;
  3.在新建的目录里面,针对SOURCES目录下的来源档案,也就是*.spec里面的Source设定的那个档案,以tar进行解压缩,以我们这个例子来说,则会在/usr/src/redhat/BUILD/rp-pppoe-3.5当中,将/usr/src/redhat/SOURCES/rp-pppoe-3.5.tar.gz进行解压缩啦!
  4.然后就开始%setup的工作;
  5.再来开始%build及%install的设定与编译!
  6.最后将完成打包的档案给他放置到该放置的地方去,如果你的规定的硬体是在i386的系统,那么最后编译成功的*.i386.rpm档案就会被放置在/usr/src/RPM/RPMS/i386里面啰!如果是i586那么自然就是/usr/src/redhat/RPMS/i586目录下啰!
  整个步骤大概就是这样子!最后的结果资料会放置在RPMS那个目录底下就对啦!
  打包自己的套件:
  这个就有趣了!我们自己来编辑一下自己制作的RPM怎么样?会很难吗?完全不会!这里简单的以一个小例子来说明喔!请注意,这个真的只是一个小例子,所以不要觉得奇怪喔!其中,比较需要注意的,由于在上面的步骤说明中,我们知道在将SRPM编译成为RPM的时候,会以tar这支程式来将档案解开,因此,我们在进行来源档案的建立时,就必需要将他打包成为一个tar.gz的tarball的档案才行!
  假设我们编辑了一支script,内容是这样:
  [root @test root]# cd /usr/src/redhat/SOURCES [root @test SOURCES]# vi showvbird.sh #!/bin/bash # This file is just used to demo the RPM packaging. # the only thing is showing the hostname. HOST=`/bin/hostname` /bin/echo $HOST [root @test SOURCES]# chmod 755 showvbird.sh [root @test SOURCES]# tar –zcvf showvbird.tar.gz showvbird.sh 注意了,我们必需要将他打包才行!
  上面的动作中,我们编辑了一个shell script档案,档名为showvbird.sh,并且将他打包成为具有gzip压缩的tarball档案,也就是showvbird.tar.gz这样的档案才行!请注意,这个showvbird.tar.gz档案『必需』放置在SOURCES目录之下!
  再来则是要编辑那个很重要的*.spec档案啰!你可以这样简单的编写一下:
  [root @test root]# cd /usr/src/redhat/SPECS [root @test SPECS]# vi showvbird.spec Summary: This is a demo RPM package. Name: showvbird Version: 1.0 Release: 1 Copyright: GPL Group: VBird's Home Source: showvbird.tar.gz <==这个就是刚刚建立起来的 arball档案! Url: http://linux.vbird.org Packager: VBird %description This package is just a demo RPM. %prep %setup –c %install install -m 755 showvbird.sh /usr/local/bin/showvbird.sh %files /usr/local/bin/showvbird.sh
  好了!开始给他编译并打包成为RPM档案啦!
  [root @test SPECS]# rpm -bb showvbird.spec ….(略) Wrote: /usr/src/redhat/RPMS/i586/showvbird-1.0-1.i586.rpm
  最后这个被打包成功的档案就被放置在/usr/src/redhat/RPMS/i586/showvbird-1.0-1.i586.rpm啰!然后给他安装一下:
  [root @test SPECS]# rpm –ivh /usr/src/RPM/RPMS/i586/showvbird-1.0-1.i586.rpm Preparing... ########################################### [100%] 1:showvbird ########################################### [100%] [root @test SPECS]# rpm –qi showvbird Name : showvbird Relocations: (not relocateable) Version : 1.0 Vendor: (none) Release : 1 Build Date: Wed 06 Nov 2002 11:27:17 PM CST Install date: Wed 06 Nov 2002 11:27:42 PM CST Build Host: test.linux.org Group : VBird's Home Source RPM: showvbird-1.0-1.src.rpm Size : 143 License: GPL Packager : VBird URL : http://linux.vbird.org Summary : This is a demo RPM package. Description : This package is just a demo RPM. [root @test SPECS]# showvbird.sh test.linux.org [root @test SPECS]# rpm –ql showvbird /usr/local/bin/showvbird.sh <==嘿嘿!已经记录起来了!自己的软体耶!
  用很简单的方式,就可以将自己的软体或者程式给他修改与设定妥当!很不错吧!以后您就可以自行设定你的RPM啰!当然,也可以手动修改您的SRPM的来源档内容啰!
  
  

原文转自:http://www.ltesting.net