




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、浅谈制作rpm包之spec文件的配制历史记录日期版本说明交表人2012-03-02vi宁超举1. rpm 概述41.1为什么要打包41.2如何创建rpm包41.3 rpm安装包的制做方法52. srpm 介绍52.1 srpm包的编译52.2安装srpm时使用的路径63. spec 文件6spec文件的注意事项73.2基本要素和准备工作73.3 spec文件内容讲解74. rpm包制作的一个小例子 154.1首先写一段hellow.c程序154.2然后写了个configure将以下内容传送到makefile 154.3然后用vi命令建了一个readme 154.4创建目录并把文件拷到相应的目录
2、164.5配置spec文件164.6接下来谈谈patch的问题 171. rpm概述rpm(redhad package manager)是一个开放的包管理器,它使用户可以从源码构 建一个二进制的软件发行包和利用补丁包给软件打补丁。rpm包非常灵活易用,因此被作为 很多linux发行版的默认软件安装包。自行打包一些文件或自己开发了一套软件当然,使用tar包也可以打包文件,甚至比制 作rpm要简单很多。但如果您想在安装的过程中就把一套额外的软件部署完毕,那使用rpm 方式通常是是唯一的方法。而且rpm还有数据库协助软件升级、文件校验等,结合yum升 级方式,没有理由不选择rpm,特别是对于最终用
3、户,我认为提供rpm包是最佳的方法。1.1为什么要打包软件开发的最终目标就是要给用户用,而在把软件发布给用户前,我们一般会先制作 一个安装包,这样用户在使用我们的软件前就能轻松的把软件安装到系统上,并不是所有的软件都提供rpm方式的。这是最常见的原因。负责任的开发者可能提供 rpm方式的二进制软件包,以便用户选择使用。但也很常见的就是软件作者只是发布了源码, 最后一部分的编译和安装需要用户自行解决。制作rpm包不仅仅是打包,更可以解决菜单创建、打补钉、完成大量预配置、与其他 软件包互动等操作。假如用户使用源代码安装,得要求用户了解基本的编译过程、能够应付 各种不能编译的意外、必须自己完成抽象的
4、配置、甚至懂得软件开发,能够自己打补钉, 对非计算机专业的用户而言简直就是天方夜谭。这是把软件开发的最后一步抛给了用户,作 为发行版,这是极不负责任的!也是不现实的,软件作者发布源代码是正确的,负责的作者 一般都同时提供rpm或deb包以及它们的源代码包,除非他们不会制作。1.2如何创建rpm包rpm建包原理其实就是写spec脚本,主要是在spec里提供一些软件相关信息,以及安装、卸载前后要执行的脚本,然后展开压缩的源代码包,打上补丁,执行编译,然后 利用make install可以重新指定安装目的地的特性,把编译好的文件安装到指定的虚拟根目录下的指定位置里,一般是虚拟的/usr里,然后把这些
5、目录、信息和脚本打成一个压缩 包,即rpm包。同时可选地生成源码包src.rpnio当然有很多具体细节问题。您应该首先 阅读软件的readme和install文件。打包原则:1任何人都应该在系统现有src.rpm的spec基础上修改更新,除非没有这样的包。 这可以省去很多麻烦,少走弯路。2任何人都无权删除别人的changelog和原始打包者的信息,这是对别人的不尊重。但你可以追加自己的信息。3.尽可能在spec里使用系统的标准宏定义,而不要用非标准写法。4任何人都不应该直接提供修改后的源代码,而应该以补丁形式发布你的修改,在spec 里完成打补丁操作。务必做到一个补丁只解决一个问题,这样才能确
6、保补丁的可重用性,否 则版本升级后补丁很容易失效。如果你确信自己的补丁是清洁补丁,尽可能发给上游开发者, 这样才能一劳永逸。你所打的任何补丁,其授权方式必须和被修改源代码保持一致。5. rpm不是跨平台打包技术。确保软件的二进制代码能够跨平台运行,不是系统软件 打包者要考虑的事,而是应用软件作者和独立二进制代码发布者应该考虑的事。我们没有责 任和义务确保从我们系统里拆解下来的部件能够运行于其他系统上,不支持,更不提倡这种 移花接木的作法。1.3 rpm安装包的制做方法创建一个rpm安装包是件很容易的事,特别是当你可以获得软件的源代码包的时候。 制做一个rpm软件安装包有以下几个步骤:获得软件的
7、源代码包(即xxx.tar.gz的源码包)如果你自己修改了软件,那么给它做一个补丁编写一个包含软件包信息的spec文件确保软件被正确的安装到适当的位置创建rpm安装包从上面的几步我们可以看到,制做一个rpm包最主要的就是第三步编写一个spec文件, 这在后面将有详细的介绍。2. srpm介绍谈完了 rpm类型的软件之后,再来我们谈一谈包含了 source code的rpm (即srpm源码包格式的)该如何使用呢?假如今天我们在网络上面下载了一个srpm的档案, 该如何安装他?又,如果我想要修改这个srpm里面原始码的相关设定值,又该如何订正 不重新编译呢?此外,最需要注意的是,新版的rpm已经
8、将rpm不srpm的扌至令分 开了,srpm使用的是rpmbuild这个指令,而不是rpm。2.1 srpm包的编译假设我下载了一个srpm的档案,又7t想要修订这个档案内的原始码不相关的设定值, 那举我可以直接编译幵安装吗?当然可以!利用rpmbuild配合选项即可。选项主要有底下 两个:rebuild这个选项会将后面的srpm进行编译不打包的动作,最后会产生rpm的档 案,但是产生的rpm档案并没有安装到系统上。当你使用一rebuild的时候,最后通常会 发现一行字体:wrote: /usr/src/redhat/rpms/i386/pkgname.i386.rpm 这个就是 编译完成的r
9、pm档案,这个档案就可以用来安装啦!安装的时候请加绝对路径来安装即可!recompile这个动作会直接的编译打包并且安装,请注意,rebuild仅编译并打包 而已,而recompile不但进行编译跟打包,还同时进行安装了!2.2安装srpm时使用的路径srpm既然吨有source code ,那么其中必定有配置文件啰,所以首先我们必需要知 道,这个srpm在进行编译的时候会使用到哪些目录呢?这样一来才能够去修改嘛!你可 以到你的/usr/src这个目录里面去查看一下,通常每个linux提供的目录都不太相同,以radhad为例,他是以/usr/src/redhat/为工作目录,openlinux
10、则是以/usr/src/openlinux为工作目录!无论如何,反正就是在/usr/src这个目录下就对了!/ usr/src/redhat/specs这个目录当中放置的是该软件的配置文件,例如spec,这个软件的信息参数,设定项目 等等都放置在这里;/ usr/src/redhat/sources这个目录当中放置的是该软件的原始文件(*.tar.gz的档案)以及config这个配置文件;/usr/src / redhat/build在编译的过程中,有些暂存的数据都会放置在这个/ usr/src / redhat/rpms经过编译之后,幵丐顺利的编译成功之后,将打包完成的档案放置在这个目录当中
11、。里 头有包含了 1386,1586, i686, noarch.等等的次目录。/ usr/src/redhat/srpms与rpms内相似的,这里放置的就是srpm封装的档案,有时候你想要将你的软件用srpm的方式释出时,你的srpm档案就会放置在这个目录中了。3spec文件在linux系统上下载的软件有很多种类型,不同的软件管理器就有不同的软件格式,今 天我们来谈谈rpm上的软件管理。我们从网上下载的软件有已经编译好的xxx.rpm格式的,这种是可以通过rpm命令直 接安装的。还有xxx.src.rpm这种srpm源码包格式的,它是由xxx.tar.gz源码、xxx.patch 补丁软件和
12、xxx.spec脚本等其他配置文件组成的,它也可以通过rpmbuild命令编译成可 直接安装的二进制rpm格式的软件,还有一种就是xxx.tar.gz或自己写的源码程序,这种 要想方便的在rpm或yum管理器这样的机制上安装,写自己的spec文件就是一项非常重 耍的工作了,下面就来讲讲关于怎样制作spec文件的内容了。3.1 spec文件的注意事项凡是行首加上#的都被注释掉了,实际运行时不起作用,如要使其生效,请去掉注释符 #。凡是以%*和%*形式出现的符号都是“宏”,很多宏都是系统预定义的,也可 以是自己定义的。如果软件没有使用gnu autotool创建,而是自己写的makefile,这就
13、导致不能按 照常规方法打包,非常麻烦。服务器软件通常都需要大量预配置工作,spec打包绝非一两天能解决,需要深入研究 很多东西和反复实践,建议初学者不要尝试。其他发行版的spec与src.rpm是很好的教材,建议打包前先找找fedora的文件 学习,能借鉴最好,但不应该不修改照搬过来或使用,因为它使用的大量专有宏定义和我们不 兼容,甚至src.rpm直接编译都通不过。spec文件有一个命名规则,其文件名由以下几部份组成:软件包名版本号发行号.spec3.2基本要素和准备工作打包之前在/usr/src/redhad/目录下得存在一下目录:sources build rpm/i386 specs
14、srpm打包时至少需要准备源代码和spec文件。源代码放到/usr/src/redhad/sources目录中,spec 文件放到/usr/src/redhad/spec 目录。3.3 spec文件内容讲解(1)编写spec脚本生成rpm除了源码外,最重耍的就是懂得编写.spec脚本。rpm建包的原理其实并不复 杂,可以理解为按照标准的格式整理一些信息,包括:软件基础信息,以及安装、卸载前后 执行的脚本,对源码包解压、打补丁、编译,安装路径和文件等。实际过程中,最关键的地方,是要清楚虚拟路径的位置,以及宏的定义。(2)关键字 spec脚本包括很多关键字,主要有:name:软件包的名称,后面可使
15、用%name的方式引用summary:软件包的内容概耍version:软件的实际版本号,例如:1.0.1等,后面可使用%version引用release:发布序列号,标明第几次打包,后面可使用%release引用group:软件分组,建议使用标准分组license:软件授权方式,通常就是gplsource:源代码包,可以带多个用sourcek source2等源,后面也可以用%sourcel> %source2引用buildroot:这个是安装或编译时使用的“虚拟目录”,考虑到多用户的环境,一般定义为: %_tmppath/%name-%version-%release-root或%_t
16、mppath/%name-%version-%release-buildroot-%(%_id_u -n该参数非常重要,因为在生成rpm的过程中,执行make install时就会把软件安装到上述 的路径中,在打包的时候,同样依赖“虚拟目录”为“根目录”进行操作后面可使用$rpm_build_root方式引用url:软件官网的主页vendor:发行商或打包组织的信息disstribution:发行版标识patch:补丁源码,可使用patch 1 > patch2等标识多个补丁,使用%patch0或%patcho 引用prefix:%lprefix这个主要是为了解决今后安装rpm包时,并不
17、一定把软件安装到rpm中 打包的目录的情况。这样,必须在这里定义该标识,并在编写%install脚本的时候引用,才 能实现rpm安装时重新指定位置的功能buildarch:指编译的目标处理器架构,noarch标识不指定,但通常都是以/usr/lib/rpm/marcros中的内容为默认值buildrequires:列出软件编译必须依赖的编译工具软件包,如果有人用你的src.rpm自己编 译,会提示他需要安装这些包才能编译。requires:是软件运行时依赖的软件包,这个非常重耍,因为仓库安装要依赖它来同时安装其 他依赖的软件包(虽然rpm有自动依赖关系判定,但不能100%保险)。package
18、r:打包者的信息%description软件的详细说明(3) spec脚本功能主体 spec脚本的主体中也包括了很多关键字和描述,下面会一一列举。我会把一些特别需要留意的地方标注出来。%prep预处理脚本,准备阶段,用来展开源代码并打上patch,这里的做法是采用宏的方式(绝 大部分软件包都是可以的)%setup -n %name-%version把源码包解压并放好通常是从/usr/src/redhad/sources里的源码包解压到/usr/src/radhad/build/%name-%version中。假如我们用的是 radhad linux 为 例。一般用%setup -c就可以了,但
19、有两种情况:一就是同时编译多个源码包,二就是源码的tar 包的名称与解压出来的目录不一致,此时,就需要使用参数指定一下了。%patch 打补丁通常补丁都会一起在源码xxx.tar.gz包中,或和xxx.tar.gz 起放到sources目录下。 一般参数为:%patch -pl使用前面定义的patch补丁进行,pl是忽略patch的第一层目录%patch2 -pl -b xxx.patch打上指定的补丁,-b是指生成备份文件补充一下%setup不加任何选项,仅将软件包打开。%setup -n newdir将软件包解压在newdir目录。%setup -c解压缩之前先产生目录。%setup -b
20、 num 将第num个source文件解压缩。%setup -t不使用default的解压缩操作。%setup -t -b 0将第0个源代码文件解压缩。%setup -c -n newdir指定目录名称newdir,并在此目录产生rpm套件。%patch最简单的补丁方式,自动指定patch levelo%patch 0使用第0个补丁文件,相当于%patch ?p 0。%patch -s不显示打补丁时的信息。%patch -t将所有打补丁时产生的输出文件删除。%configure这个不是关键字,而是rpm定义的标准宏命令。意思是执行源代码的configure 配置在 / usr/src/radh
21、ad/ build / %name-%version g 录中进行,%build部分,配置和编译,实际上就是你编译软件的过程,不过这里可以用宏去做。在/usr/src/radhad/build/%name-%version目录中进行 make 的工作,标准写法:%configu"额外的参数(注意,这里不用./configure,是因为%configure是一个宏定 义,已经约定了prefix=/usr sysconfdir=/etc 等配置)make %?_smp_mflags(大部分软件包支持并行编译,加上_smp_mflags可以利用你的 cpu性能,如果软件明确不支持,不要加)
22、 %install开始把软件安装到虚拟的根目录中在/usr/src/radhad/build/%name-%version目录中进行 make install 的操作。这 个很重要,因为如果这里的路径不对的话,则下面"匕中寻找文件的时候就会失败。常见内 容有:%make install这不是关键字,而是rpm定义的标准宏命令。也可以使用非标准写 法:make destdir=$rpm_build_root install或make prefix=$rpm_build_root install需耍说明的是,这里的%install主耍就是为了后面的%file服务的。所以,还可以使用常规
23、的系统命令:install -d $rpm_build_root/cp -a * $rpm_build_root/%clean部分,这部分在打包的最后执行,当软件包生成后,删除/var/tmp下的临时目录, 以免时间长了系统空间被展。一般写法:%cleanrm -rf $rpm_build_root 这就足够了。$rpm_build_root是指开头定义的buildroot,而$rpm_build_dir通常就是指 /usr/src/radhad/build,其中,前面的才是file需要的。%pre安装前执行的脚本%post安装后执行的脚本 %preun卸载前执行的脚本 %postun卸载后执
24、行的脚本 %files文件部分就是列出软件包包含的所有的文件,如果只有一个软件包,耍偷懒,只需耍 列顶层目录即可。比如,这个软件包可能包含了/ etc/abc.conf/ usr/share/data/*/usr/lib/lib*.so那么,如果偷懒,就这么列,这里你可以使用p貯等通配符,比如/usr/也就是你在命令 行怎么操作目录和文件,就可以怎么写:%files%defattr(-, root, root)/ etc/ usr当然,这部分还有其他技巧,比如defattr是定义权限,(-,root,root)指定包装文件的属性, 分别是(mode,owner,group),-表示默认值,对文
25、本文件是0644,可执行文件是0755 还有%doc, %config, %ghost, %exclude等宏,现在如果都说就有点吓人了,呵呵。注意, 一定不要只写一个/,这样有可能会破坏/的权限,安装这样的软件包后,系统会出错。 这里会在虚拟根目录下进行,千万不要写绝对路径,而应用宏或变量表示相对路径。% exclude列出不想打包到rpm中的文件小心,如果%exclude指定的文件不存在,也会出错的。%changelog部分,软件包修改记录,格式很简单:%changelogsat jun 14 2008 cjacker vcjacker>-i mod辻ied it- this is
26、second line.fri jun 13 2008 cjacker vcjacker>i mod辻ied it- this is second line.格式是头加内容的方式。头的格式是:星期月 日年名字v邮件地址内容可以有多行,用-开头即可。(4)范例下面的.spec脚本是一个比较简单的范例,其作用是把一个目录中的所有文件都打包为一 个rpm包。前期工作:我们假设需要打包的目录就是我们的源码文件。这样,可以暂时忽略比较麻烦的打补丁、编 译等问题,而且也是一种常见的方式。在编写.spec脚本前,需要准备好“源码”,也就是 目录,内容比较简单:rootmail html # 11tot
27、al 4drwxr-xr-x 3 root root 40array6 jun 4 14:45 demorootmail html# 11 demo/total 4drwxr-xr-x 3 root root 40 ar ray 6 jun 4 14:45 images-rw-rr 1 root root 0 jun 4 14:45 index.html因为rpm只认tar.gz格式,所以,必须打包好并移动到sources 0录中: rootmail html# tar czvf demo.tar.gz demo/demo/demo/images/demo/ images / logo gif
28、/demo / index.htmlrootmail html# mv demo.tar.gz /usr/src/asianux/sources/ 编写demo.spec的内容:准备工作完成,下面就是范例用的脚本内容:rootmail html# cd /usr/src/radhad/specs/ rootmail specs# vi demo.specsummary:test package for linuxfly webblogname:demoversion:1.0.0release:1license:gplgroup:systemsource:demo, tar.gzbuildroo
29、t: %_tmppath/%name-%version-%release-rooturl:http: / / www. linuxf ly. or gpackager: linuxingprefix:%_prefix%defineuserpath /var/www/html/demo%descriptionjust a test rpm suite.%prep%setup -c%build%configuremake%installinstall -d $rpm_build_root%userpathcp -a %name* $rpm_build_root%userpath%cleanrm -
30、rf $rpm_build_rootrm i*f $rpm_build_dir/%name-%version%files%defattr(-,root,root)%userpath%changelogsat jun 14 2008 cjacker <cjacker> i mod辻ied it- this is second line.fri jun 13 2008 cjacker <cjacker>-i mod辻ied it- this is second line.特别需要注意的是:%install部分使用的是绝对路径,而五上部分使用则是相对路径, 虽然其描述的是同一
31、个地方。千万不要写错。进行打包工作:在specs目录下运行一下命令:rpmbuild -ba demo.spec你将会在/usr/src/radhad/rpms/i386目录生成你的xxx.i386.rpm软件包。你将会在/usr/src/radhad/srpms/ g录生成你的xxx.src.rpm软件包。扩展内容:虽然上面的范例很简陋,而且缺少%build部分,但实际上只要记住两点:就是%build和血5上衣1的过程中,都必须把编译和安装的文件定义到“虚拟根目录”中%buildmake -f admin/mmon cvs./configure prefix=%_prefix -enable
32、-final -disable-debug with-extra-includes=%_includedir/freetype2 -includedir=%_mcludedirmake%installrm -fr $rpm_build_rootmake destdir=$rpm_build_root installcp -r $rpm_build_root%_datadir/apps/kolourpaint/icons/hicolor/*$rpm_build_root%_datadir/icons/crystal svg/就是file中必须明白,用的是相对目录%files%defattr(-,
33、root,root)%lbindir%_libdir%_datadir%exclude %_libdir/debug如果把引用%files%defattr(-,root,root)%lbindir写成引用%files%defattr(-,root,root)/usr/bin则打包的会是根目录下的/usr/bin中所有的文件。一些rpm相关信息rpm 软件包系统的标准分组:/usr/share/doc/rpm-4.3.3/groups各种宏定义:/ usr/lib/rpm/macros已经安装的rpm包数据库:/var/lib/rpm如果rpm包已经做好,但在安装的时候想修改默认路径,则可以:r
34、pm -ivh prefix= / opt/usr xxx.rpm又或者同时修改多个路径:rpm xxx.rpm relocate=/usr=/opt/usr relocate=/etc=/usr/etc3、制作补丁使用diff同patch工具4、如何编写临说段由于必须在%file中包括所有套件中的文件,所以,我们需耍清楚编译完的套件到底包括那些 文件?常见的做法是,人工模拟一次编译的过程:./configrue prefix=/usr/local/xxxmakemake destdir=/usr/local/xxx install或make prefix=/usr/local/xxx ins
35、tall这样,整个套件的内容就会被放到/usr/local/xxx中,可根据情况编写%file和宓(沁(16 段。当然,这个只能对源码按gnu方式编写,并使用gnu autotool创建的包有效,若自定 义makefile则不能一概而论。4. rpm包制作的一个小例子我的rpm包是用来学习交流的,目的在于rpm的制作,所以本身源码就只有hello, worldo不过基本rpm包的结构都已具备,完成补丁的支持,有一个patch,接下来聊一下 我的rpm包的诞生之路。4.1首先写一段hellow.c程序#include<stdio.h>int main()printf(hhellown
36、");return 0;j4.2然后写了个configure将以下内容传送到makefile#!/bin/bashcat > makefile << edall: hello whellow.o : hello w.cgcc -c hellow.chellow : hellow.ogcc -o hellow hellow.odistclean:rm -f hellow makefileclean:rm -f hellow hellow.oinstall:cp hellow /usr/binuninstall:rm -fr /usr/bin/ hellowed4.3然后用vi命令建了一个readme填一些有关hellow的使用和介绍之类的东西,随便写。4.4创建目录并把文件拷到相应的目录在/usr/src/neokylin/sources下新建一个hellow目录,mv以上三个文件到里 面,然后tar 一 czvf hellow-0.1-1 .tar.gz hellow搞定后就可以进入rpm包制作的关键步骤了写一个spec文件,如果你对spec没有任何了解也不要紧,简单来说,它就是一
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- T/CFPA 012-2022消防用压接式涂覆碳钢管材及管件
- T/CEPPEA 5023-2023风光储充一体化充电站设计规范
- T/CEMTA 4-2023工业炸药生产线安全联锁检测方法温度、压力和流量
- T/CECS 10197-2022高分子膜基预铺防水卷材
- T/CCS 062-2023井工煤矿智能化采煤系统运维管理规范
- T/CCOA 56-2023拉面专用小麦粉
- T/CBMCA 028-2022室内空气治理产品
- T/CATCM 013-2021灵芝(赤芝)及其孢子粉质量规范
- T/CASTEM 1015-2023新型研发机构绩效评估规范
- 2024年度江苏省二级注册建筑师之建筑结构与设备模考模拟试题(全优)
- 外科视角解读-《甲状腺结节和分化型甲状腺癌诊治指南(第二版)》
- 2023CSCO免疫检查点抑制剂相关的毒性控制指南(全文)
- 五年级下册分数加减混合运算练习400题及答案
- 不同行业安全管理的特点与要求
- 医学人文素质教育的跨学科研究与创新
- 社区居民满意度调查问卷
- 异常子宫出血护理查房的课件
- 医院基建科招聘笔试题目
- 无创血糖仪行业营销策略方案
- 答案-国开电大本科《当代中国政治制度》在线形考(形考任务一)试题
- 国际经贸新形势下我国外贸高质量发展的挑战及对策
评论
0/150
提交评论