当前位置: 首页 > 科技观察

如何在CentOS-RedHat下创建基于源码包的rpm包

时间:2023-03-21 16:52:48 科技观察

有时候你可能需要获取一个开源应用的源码包,却不一定能通过该应用的RPM文件安装到系统中.这种情况下,既可以编译源码进行安装,也可以将源码包创建rpm包文件,实现安装应用的功能。还有一种情况是您想要创建一个您自己开发的自定义RPM包。本指南说明如何添加源代码以创建rpm包。为了创建rpm包,您需要源包(通常是一个压缩文件,其中还包含SPEC文件)。SPEC文件包含以下说明:如何创建rpm包、包中包含的文件以及安装路径。RPM会在创建过程中显示测试过程。执行spec文件中prep块中定义的系统命令和宏命令。执行spec文件中buildblock中定义的系统命令和宏命令,检测文件列表的内容。在这一步中,文件列表中的宏命令也被执行。创建二进制包文件创建源包文件一旦RPM执行了上述步骤,它将创建二进制包文件和源包文件。二进制包文件包含有关安装或卸载包的所有附加信息的源文件。通常安装包的所有选项都是特定于平台的。二进制包文件包含为特定体系结构编译的完整应用程序或库。源包通常包含原始压缩的tar文件、规范文件和用于创建二进制包的相关补丁。让我们使用tar文件来了解如何创建简单的源代码和二进制RPM包。如果您对rpm包比较陌生,您应该首先了解如何使用rpm命令在CentOS/Redhat上安装、升级和卸载包。1.安装rpm-build包为了创建一个基于spec文件的rpm文件,我们需要使用rpmbuild命令。rpmbuild命令是rpm-build包的一部分。安装过程如下。#yuminstallrpm-buildrpm-build依赖于以下包。如果您还没有安装这些包,请自动安装它们。elfutils-libelfrpmrpm-libsrpm-python2。RPM创建目录rpm-build命令将在构建阶段自动创建以下目录结构。#ls-lF/root/rpmbuild/drwxr-xr-x.2rootroot4096Feb412:21BUILD/drwxr-xr-x.2rootroot4096Feb412:21BUILDROOT/drwxr-xr-x.2rootroot4096Feb412:21RPMS/drwxr-xr-x.2rootroot40912:2SOUR1Feb-x.2rootroot4096Feb412:21SPECS/drwxr-xr-x.2rootroot4096Feb412:21SRPMS/注意:以上目录结构对CentOS和Redhat都适用。您也可以使用/usr/local/redhat命令,但您希望在构建阶段修改topdir参数。如果您使用的是SuSEEnterpriseLinux,请使用/usr/src/packages目录。如果您想使用自己的命令结构而不是/root/rpmbuild,您可以使用以下选项:使用-buildroot选项并在rpmbuild阶段定义自定义目录。在rpmrc文件或rpmmacros文件中定义topdir参数3.下载源tar文件接下来,下载要创建的包的源tar文件并将其保存在SOURCES目录中。本例中我使用的是icecase开源软件的源码包,是一款流媒体服务器软件。但是这些步骤在创建其他rpm包时是相同的。你只需要下载你想要的软件的源码包。#cd/root/rpmbuild/SOURCES/#wgethttp://downloads.xiph.org/releases/icecast/icecast-2.3.3.tar.gz#ls-l-rw-r--r--.1rootroot1161774Jun112012icecast-2.3.3.tar.gz4。创建规范文件在这一步中,我们通过创建规范文件来定义构建过程。spec文件通常由以下8个不同的块组成:Preamble-preamable块包含有关正在构建的包的信息并定义依赖项。通常它是以标签信息开头的行,后面跟着一个冒号,然后是一些描述性信息。%prep–在此块中,我们将为构建过程准备软件。在此过程中,将删除任何先前创建的内容、展开源(.tar)文件等。更关键的是要了解有可用的预定义宏命令,这些命令可以执行各种快捷选项来构建rpm包。当您试图创建一个复杂的包时,您可能正在使用这个宏。在下面的示例中,我使用了一个名为%setup的宏,它删除了之前的创建、解压缩源文件并更改了文件的权限。您也可以使用%prep部分中的sh脚本执行此操作,但%setup宏使用预定义的sh脚本简化了该过程。%description——描述块通常包含包的描述信息。%build–这是实际执行构建命令的块。通常是一个sh脚本。%install–%install块也作为sh脚本执行,就像%prep和%build块一样。这是安装阶段%files的步骤——这个块包含这个包的一系列文件。不在此块中的文件将不可用。需要完整路径,在此块中您可以设置文件的属性和权限。%clean-此块用于清理不在应用程序正常创建区域中的其他文件。例如:如果应用程序在创建时在/tmp目录下创建了一个临时目录结构,则不会被移除;但是如果它在这个块中定义,那么临时目录将在正确安装后被删除。消除。下面是icecast.spec文件#cat/root/rpmbuild/SPECS/icecast.specName:icecastVersion:2.3.3Release:0Summary:XiphStreamingmediaserverthatsupportsmultipleformats.Group:Applications/MultimediaLicense:GPLURL:http://www.icecast.org/Vendor:Xiph.orgFoundationteam@icecast.org来源:http://downloads.us.xiph.org/releases/icecast/%{name}-%{version}.tar.gzPrefix:%{_prefix}Packager:KarthikBuildRoot:%{_tmppath}/%{name}-root%descriptionIcecastisastreamingmediaserverwhichcurrentlysupportsOggVorbisandMP3audiostreams.ItcanbeusedtocreateanInternetradiostationoraprivatelyrunningjukeboxandmanythingsinbetween.Itisveryversatileinthatnewformatscanbeaddedrelativelyeasilyandsupportsopenstandardsforcommuincationandinteraction.%prep%setup-q-n%{name}-%{version}%buildCFLAGS="$RPM_OPT_FLAGS"./configure--prefix=%{_prefix}--mandir=%{_mandir}--sysconfdir=/etcmake%install["$RPM_BUILD_ROOT"!="/"]&&rm-rf$RPM_BUILD_ROOTmakeDESTDIR=$RPM_BUILD_ROOTinstallrm-rf$RPM_BUILD_ROOT%{_datadir}/doc/%{name}%clean["$RPM_BUILD_ROOT"!="/"]&&rm-rf$RPM_BUILD_ROOT%files%defattr(-,root,root)%docREADMEAUTHORSCOPYINGNEWSTODOChangeLog%docdoc/*.html%docdoc/*.jpg%docdoc/*.css%config(noreplace)/etc/%{name}.xml%{_bindir}/icecast%{_prefix}/share/icecast/*%changelogInthisfile,under%prepsectionyoumaynoticedthemacro"%setup-q-n%{name}-%{version}".这个宏在后台执行如下命令.cd/usr/src/redhat/BUILDrm-rficecastgzip-dc/usr/src/redhat/SOURCES/icecast-2.3.3.tar.gz|tar-xvvf-if[$?-ne0];thenexit$?ficdicecastcd/usr/src/redhat/BUILD/icecastchown-Rroot.root.chmod-Ra+rX,g-w,o-w。在%build部分你会看到ThereisCFLAGSforconfigureoptions,它定义了RPM安装时可以使用的options和prefixes选项,安装的必选目录和sysconfig目录,系统文件需要拷贝到该目录下这一行,您将看到make实用程序,它确定需要编译的文件列表,并适当地编译它们。在%install部分,%install下面的行“makeinstall”获取从前面的步骤编译的二进制文件,并将它们安装或复制到适当的位置,以便可以访问它们。5.使用rpmbuild命令创建rpm文件SPEC文件准备就绪后,您可以使用rpm-b命令开始构建rpm。b选项用于执行构建过程的所有阶段。如果您在这个阶段看到任何错误,那么您需要在重试之前修复它。错误通常是库依赖项,您可以根据需要下载并安装它们。#cd/root/rpmbuild/SPECS#rpmbuild-baicecast.specExecuting(%prep):/bin/sh-e/var/tmp/rpm-tmp.Kohe4t+umask022+cd/root/rpmbuild/BUILD+cd/root/rpmbuild/BUILD+rm-rficecast-2.3.3+/usr/bin/gzip-dc/root/rpmbuild/SOURCES/icecast-2.3.3.tar.gz+/bin/tar-xf-+STATUS=0+'['0-ne0']'+cdicecast-2.3.3+/bin/chmod-Rfa+rX,u+w,g-w,o-w.+exit0Executing(%build):/bin/sh-e/var/tmp/rpm-tmp.ynm7H7+umask022+cd/root/rpmbuild/BUILD+cdicecast-2.3.3+CFLAGS='-O2-g'+./configure--prefix=/usr--mandir=/usr/share/man--sysconfdir=/etccheckingforaBSD-compatibleinstall.../usr/bin/install-ccheckingwhetherbuildenvironmentissane...yescheckingforthread-safemkdir-p.../bin/mkdir-pcheckingforgawk...gawkcheckingwhethermakesets$(MAKE)...yescheckingwhethertoenablemaintainer-specificportionofMakefiles...nocheckingforgcc...gcc......写:/root/rpmbuild/SRPMS/icecast-2.3.3-0.src.rpm写:/root/rpmbuild/RPMS/x86_64/icecast-2.3.3-0.x86_64.rpmExecuting(%clean):/bin/sh-e/var/tmp/rpm-tmp.dzahrv+umask022+cd/rroot/rpmbuild/BUILD+cdicecast-2.3.3+'['/root/rpmbuild/BUILDROOT/icecast-2.3.3-0.x86_64'!='/']'+rm-rf/root/rpmbuild/BUILDROOT/icecast-2.3.3-0.x86_64+exit0注意:如果您使用的是SuSElinux,如果rpmbuild工具不可用,请尝试使用“rpm-ba”创建rpm包。在安装过程中,您可能会注意到以下错误消息:Error1:XSLTconfigurationfilenotfoundcheckingforxslt-config...noconfigure:error:XSLTconfigurationcouldnotbefounderror:Badexitstatusfrom/var/tmp/rpm-tmp.8J0ynG(%build)RPMbuilderrors:Badexitstatusfrom/var/tmp/rpm-tmp.8J0ynG(%build)解决方案1:安装libxstl-develyuinstalllibxstl-devel还会安装以下依赖项:libgcryptlibgcrypt-devellibgpg-error-develerror2:libvorbis错误检查用于libvorbis。..configure:error:musthaveOggVorbisv1.0oraboveinstallerederror:fromadexitstat/var/tmp/rpm-tmp.m4Gk3f(%build)方案二:安装libvorbis-develyuinstalllibvorbis-devel也会安装以下依赖:libogglibogg-devellibvorbis6。验证源和二进制RPM包一旦rpmbuild命令成功运行,您可以使用以下命令验证源rpm包和二进制rpm包文件。#ls-l/root/rpmbuild/SRPMS/-rw-r--r--1rootroot1162483Aug2515:46icecast-2.3.3-0.src.rpm#ls-l/root/rpmbuild/RPMS/x86_64/-rw-r--r--.1rootroot349181Feb412:54icecast-2.3.3-0.x86_64.rpm7.InstalltheRPMFiletoVerify作为最后一步,您可以安装二进制包以验证它是否已成功安装并且满足所有依赖项。#rpm-ivvh/root/rpmbuild/RPMS/x86_64/icecast-2.3.3-0.x86_64.rpmD:===============/root/rpmbuild/RPMS/x86_64/icecast-2.3.3-0.x86_64.rpmD:loadingkeyringfrompubkeysin/var/lib/rpm/pubkeys/*.keyD:找不到任何keysin/var/lib/rpm/pubkeys/*.keyD:loadingkeyringfromrpmdbD:openingdbenvironment/var/lib/rpmcdb:mpool:joinenvD:openingdbindex/var/lib/rpm/Packagesrdonlymode=0x0D:readh#210Headersanitycheck:OKD:addedkeygpg-pubkey-c105b9de-4e0fd3a3tokeyringD:Usinglegacygpg-pubkey(s)fromrpmdbD:Expectedsize:3491818=leads(9)+垫(4)+data(348901)D:Actualsize:349181D:==========relocationsD:addedbinarypackage[0]D:found0sourceand1binarypackagesD:==========++++icecast-2.3.3-0x86_64/linux0x2....安装完成后可以验证是否成功。#rpm-qaicecasticecast-2.3.3-0.x86_64