有时你可能需要获取一个开源应用的源码包,但是可能没有无法通过该应用的RPM文件来安装到系统。

在这种情况下,你既可以编译源码安装,也可以以源码包来创建一个rpm包文件,实现安装应用的功能。

同样存在一种情况即你想要创建一个你自己开发的自定义的RPM包。

这篇指南解释了如何提高源码来创建一个rpm包。

为了创建rpm包,你将需要源码包(通常为一个压缩文件,其内也包含了SPEC文件)。

SPEC文件包含以下说明:如何创建rpm包,包内包含的文件,安装的路径。

RPM将展现创建过程中的测试过程。

执行spec文件中的prep块中定义的系统命令和宏命令。

检测文件列表的内容

执行spec文件中的build块中定义的系统命令和宏命令。在这一步中文件列表中的宏命令也被执行。

创建二进制包文件

创建源码包文件

一旦RPM执行了上述步骤,将创建二进制的包文件和源码包文件。

二进制包文件包含所有安装或卸载包的额外信息的源文件。

通常安装包的所有选项都是有平台差异的。二进制包文件包含为一个特殊结构而编译的完整应用或函数库。源码包通常包含原始压缩的tar文件,spec文件和创建二进制包时相关的补丁。

让我们使用tar文件来看看如何创建一个简单的源和二进制RPM包。

如果你对rpm包比较陌生,你应该首先去理解在CentOS/Redhat上如何使用rpm命令安装,升级和卸载包。

  1. 安装rpm-build包

为了创建基于spec文件的rpm文件,我们需要使用rpmbuild命令。

rpmbuild命令是rpm-build包的一部分。安装过程如下。

# yum install rpm-build

rpm-build依赖下面的几个包。如果你还未安装,就赶紧自动安装这些包。

elfutils-libelf
rpm
rpm-libs
rpm-python
  1. RPM创建目录

rpm-build命令会在build阶段自动创建下列目录结构。

# ls -lF /root/rpmbuild/drwxr-xr-x. 2 root root 4096 Feb  4 12:21 BUILD/drwxr-xr-x. 2 root root 4096 Feb  4 12:21 BUILDROOT/drwxr-xr-x. 2 root root 4096 Feb  4 12:21 RPMS/drwxr-xr-x. 2 root root 4096 Feb  4 12:21 SOURCES/drwxr-xr-x. 2 root root 4096 Feb  4 12:21 SPECS/drwxr-xr-x. 2 root root 4096 Feb  4 12:21 SRPMS/

注意:上述的目录结构对CentOS和Redhat是都适用。你也可以使用/usr/local/redhat命令,但是你想要在build阶段修改topdir参数。如果你使用的是SuSE企业版Linux,使用 /usr/src/packages目录。

如果你想使用你自己的命令结构来代替/root/rpmbuild,你可以使用下列选择:

使用-buildroot选择,并在rpmbuild阶段定义自定义的目录。在rpmrc文件或rpmmacros文件中定义topdir参数
  1. 下载源码tar文件

接着,下载你想要创建的包的源码tar文件,并保存在SOURCES目录下。

在这个例子中,我使用的是icecase开源软件的源码包,这时一个流多媒体服务器软件。但是这些步骤在创建其他rpm包时都是相同。你只需要下载你想要的软件的源码包即可。

# cd /root/rpmbuild/SOURCES/# wget http://downloads.xiph.org/releases/icecast/icecast-2.3.3.tar.gz# ls -l-rw-r--r--. 1 root root 1161774 Jun 11  2012 icecast-2.3.3.tar.gz
  1. 创建spec文件

在这一步中,我们通过创建一个spec文件来定义创建过程。这个spec文件通常包含下列8个不同的块:

  • Preamble – preamable块包含了被创建包的信息和定义相关依赖。通常它是一些行,以标签信息开头,后接冒号,而后是一些说明信息。

  • %prep – 在这一个块中,我们将为创建过程准备软件。在此过程中,任何先前的创建都被删除,而源文件(. tar)文件被扩展,等等。 一个更关键的事情是要了解可用的有预定义宏命令,可以执行各种快捷选项来构建rpm包。当您尝试创建一个复杂的包时,您可能正在使用这个宏命令。在下面的示例中,我使用了一个名为% setup的宏,它删除了先前的创建,解压源文件并更改文件的权限。您还可以在% prep部分中使用sh脚本执行此操作,但是% setup宏使用预定义的sh脚本简化了流程。

  • %description – 描述块通常包含对包的描述信息

  • %build – 这个是真正执行build指令的块。通常是一个sh脚本。

  • %install – %install块也是作为sh脚本来执行的,就像%prep和%build块。这时安装阶段的步骤

  • %files –这个块包含了这个包的一系列文件。不在此块中的文件将不可用。要求是完整的路径,并且在此块中你可以设置文件的属性和权限。

  • %clean – 这个块是为了清理那些不是应用正常创建区域的其他文件。举个例子来说:如果应用在创建过程中在/tmp目录下创建了一个临时目录结构,它将不会被移除;但是如果在该块中定义了,那么在正确安装后临时目录将被移除。

下面是icecast.spec文件

# cat /root/rpmbuild/SPECS/icecast.specName:           icecast
Version:        2.3.3Release:        0Summary:        Xiph Streaming media server that supports multiple formats.
Group:          Applications/Multimedia
License:        GPL
URL:            http://www.icecast.org/
Vendor:         Xiph.org Foundation team@icecast.org
Source:         http://downloads.us.xiph.org/releases/icecast/%{name}-%{version}.tar.gz
Prefix:         %{_prefix}
Packager:   Karthik
BuildRoot:      %{_tmppath}/%{name}-root%description
Icecast is a streaming media server which currently supports Ogg Vorbisand MP3 audio streams. It can be used to create an Internet radio
station or a privately running jukebox and many things in between.
It is very versatile in that new formats can be added relatively
easily and supports open standards for commuincation and interaction.%prep
%setup -q -n %{name}-%{version}%build
CFLAGS="$RPM_OPT_FLAGS" ./configure --prefix=%{_prefix} --mandir=%{_mandir} --sysconfdir=/etcmake%install
[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOTmake DESTDIR=$RPM_BUILD_ROOT install
rm -rf $RPM_BUILD_ROOT%{_datadir}/doc/%{name}%clean
[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT%files
%defattr(-,root,root)
%doc README AUTHORS COPYING NEWS TODO ChangeLog
%doc doc/*.html
%doc doc/*.jpg
%doc doc/*.css
%config(noreplace) /etc/%{name}.xml
%{_bindir}/icecast
%{_prefix}/share/icecast/*%changelogIn this file, under % prep section you may noticed the macro “%setup -q -n %{name}-%{version}”. This macro executes the following command in the background.cd /usr/src/redhat/BUILD
rm -rf icecast
gzip -dc /usr/src/redhat/SOURCES/icecast-2.3.3.tar.gz | tar -xvvf -
if [ $? -ne 0 ]; thenexit $?
fi
cd icecast
cd /usr/src/redhat/BUILD/icecast
chown -R root.root .
chmod -R a+rX,g-w,o-w .

在% build部分中,您将看到带有配置选项的CFLAGS,它定义了在RPM安装期间可以使用的选项和前缀选项,强制目录用于安装和sysconfig目录,系统文件需要在该目录下复制。

在这一行中,您将看到make实用程序,它决定需要编译的文件列表,并适当地编译它们。

在%安装部分中,“make install”的%安装下面的行用于从前面的步骤中编译的二进制文件,并安装或将它们复制到适当的位置,这样它们就可以被访问。

  1. 使用rpmbuild命令创建rpm文件

一旦SPEC文件准备好,您就可以开始使用rpm - b命令来构建rpm了。b选项用于执行构建过程的所有阶段。如果您在这个阶段看到任何错误,那么您需要在再次尝试之前解决它。错误通常是库依赖项,您可以在需要时下载并安装它。

# cd /root/rpmbuild/SPECS# rpmbuild -ba icecast.specExecuting(%prep): /bin/sh -e /var/tmp/rpm-tmp.Kohe4t
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd /root/rpmbuild/BUILD
+ rm -rf icecast-2.3.3
+ /usr/bin/gzip -dc /root/rpmbuild/SOURCES/icecast-2.3.3.tar.gz
+ /bin/tar -xf -
+ STATUS=0
+ '[' 0 -ne 0 ']'+ cd icecast-2.3.3
+ /bin/chmod -Rf a+rX,u+w,g-w,o-w .
+ exit 0
Executing(%build): /bin/sh -e /var/tmp/rpm-tmp.ynm7H7
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd icecast-2.3.3
+ CFLAGS='-O2 -g'+ ./configure --prefix=/usr --mandir=/usr/share/man --sysconfdir=/etc
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking whether to enable maintainer-specific portions of Makefiles... no
checking for gcc... gcc
..
..
..
Wrote: /root/rpmbuild/SRPMS/icecast-2.3.3-0.src.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/icecast-2.3.3-0.x86_64.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.dzahrv
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd icecast-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
+ exit 0

注意:如果你使用的是SuSE linux,如果rpmbuild工具不可用,试试使用“rpm -ba” 去创建rpm包。

在安装过程中,你可能会注意到如下错误信息:

错误1: XSLT配置文件未被找到

checking for xslt-config... noconfigure: error: XSLT configuration could not be founderror: Bad exit status from /var/tmp/rpm-tmp.8J0ynG (%build)
RPM build errors:Bad exit status from /var/tmp/rpm-tmp.8J0ynG (%build)

解决方法1: 安装libxstl-devel

yum install libxstl-devel

将同时安装如下依赖包:

  • libgcrypt

  • libgcrypt-devel

  • libgpg-error-devel

错误2: libvorbis错误

checking for libvorbis... configure: error: must have Ogg Vorbis v1.0 or above installederror: Bad exit status from /var/tmp/rpm-tmp.m4Gk3f (%build)

解决方法2: 安装libvorbis-devel

yum install libvorbis-devel

将同时安装如下依赖包:

  • libogg

  • libogg-devel

  • libvorbis

  1. 验证源和二进制RPM包

一旦rpmbuild命令成功运行结束,你可以在下列命令下验证源码rpm包和二进制rpm包文件。

# ls -l /root/rpmbuild/SRPMS/-rw-r--r-- 1 root root 1162483 Aug 25 15:46 icecast-2.3.3-0.src.rpm# ls -l /root/rpmbuild/RPMS/x86_64/-rw-r--r--. 1 root root 349181 Feb  4 12:54 icecast-2.3.3-0.x86_64.rpm7. Install the RPM File to Verify

作为最后的步骤,你可以安装二进制包来验证是否成功安装,以及所有的依赖都被满足。

# 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: loading keyring from pubkeys in /var/lib/rpm/pubkeys/*.keyD: couldn't find any keys in /var/lib/rpm/pubkeys/*.keyD: loading keyring from rpmdbD: opening  db environment /var/lib/rpm cdb:mpool:joinenvD: opening  db index       /var/lib/rpm/Packages rdonly mode=0x0D:  read h#     210 Header sanity check: OKD: added key gpg-pubkey-c105b9de-4e0fd3a3 to keyringD: Using legacy gpg-pubkey(s) from rpmdbD: Expected size:       349181 = lead(96)+sigs(180)+pad(4)+data(348901)D:   Actual size:       349181D: ========== relocationsD:      added binary package [0]D: found 0 source and 1 binary packagesD: ========== +++ icecast-2.3.3-0 x86_64/linux 0x2..
..

安装完成后可以验证是否成功。

# rpm -qa icecasticecast-2.3.3-0.x86_64

来源:http://www.thegeekstuff.com/2015/02/rpm-build-package-example/

如何在CentOS/RedHat下实现根据源码包创建rpm包相关推荐

  1. 从零开始,手把手教你如何在Ubuntu下编译VLC-Android源码

    前言 公司项目中使用的libvlcjni.so库文件,有点老,对Android 6.0+系统兼容性太差了,当程序运行在Android6.0+系统上时,回弹出警告框,提示libvlcjni.so:tex ...

  2. 在CentOS下编译VLC源码

    在CentOS下编译VLC源码 一.下载VLC源码 二.VLC编译与安装 1.编译与安装 2.库文件 3.头文件 三.报错解决 1.configure: error: Could not find l ...

  3. 最全解释:Linux操作系统下的软件安装与管理详解(源码安装、rpm/dpkg、yum/apt-get安装)

      在linux上安装软件,安装方式和软件包获取的途径都远远比windows的丰富,那当然这就变得复杂很多,本文旨在理解linux下繁杂的软件安装.管理原理 ,学习软件的安装方式.源码包格式.远程软件 ...

  4. Redhat linux 安装 gcc编译器,Gcc源码包,rpm包安装方法!

    点评:分两种情况: 先看这篇转过来的文章,俺老孙懒得写了. Linux软件安装通用思路 在Linux系统中,软件安装程序比较纷繁复杂,不过最常见的有两种: 1)一种是软件的源代码,您需要自己动手编译它 ...

  5. 如何在ARM开发板上从源码编译安装OpenCV和OpenCV contrib

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 本文主要介绍如何在ARM开发板上从源码编译安装OpenCV和OpenCV contrib. OpenC ...

  6. ubuntu10.04下audacious2.4源码编译过程(解决2.3cue的bug)

    本文最新版本:ubuntu10.04下audacious2.5源码编译过程 编译最新的2.4是为了解决ubuntu源中安装的audacious播放cue时有bug,会一直重复第一首歌 听ape的时候很 ...

  7. linux部署3proxy源码,在CentOS 7系统中从源码安装RTPProxy的方法

    本文介绍在CentOS 7操作系统中从源码安装RTPProxy的方法,按照以下步骤操作即可成功. 在CentOS 7.x上安装RTPProxy 1.将目录更改为/usr/src: [root@kama ...

  8. mac下编译安卓源码

    资源 Mac OS10.12 编译Android源码8.1 aosp编译-需翻墙 Mac下编译安卓源码 手把手教你在Mac OS下载.编译及导入Android源码 步骤 准备 磁盘空间大于180G 安 ...

  9. Ubuntu下获取Android源码

    1.必要的软件环境 sudo apt-get install build-essential sudo apt-get install make sudo apt-get install gcc su ...

  10. WINDOWS 下编译 ffmpeg 源码总结

    WINDOWS 下编译 ffmpeg 源码,有两种方式:VC.GCC 1.VC 编译:   https://github.com/ShiftMediaProject/FFVS-Project-Gene ...

最新文章

  1. Linux System Programming --Chapter Two
  2. rhel 6下配置网络yum源(虚拟机环境下)
  3. 护士计算机等级考试报名时间2015,湖南大学2015年9月全国计算机等级考试报名时间...
  4. matlab中的lower,请问:MATLAB中,有实现Gabor变换的函数吗?
  5. hadoop可以解决什么问题_快速解决皮带机轴磨损问题可以这样做
  6. linux运维、架构之路-Zabbix监控
  7. 不重启docker容器修改 容器中的时区
  8. 图像处理算法工程师——1必备技能总结——2面试题大全
  9. 不解之缘———我与Linux系统
  10. MacOS配置Sql Server环境
  11. php 图片木马,php图片木马实现原理
  12. u3d 100道面试题(包含答案)
  13. Java 网络IO编程
  14. 利用Excel宏中文转拼音方法
  15. 打造全新的网站群管理系统
  16. 【matlab教程】11、动态数组
  17. 2020年国内云服务器排名 哪家性价高一些?
  18. FileAlterationMonitor监听目录下文件变化
  19. 苹果有意离开,全球最大手机品牌却下大单,中国制造优势凸显
  20. 初中数学最全几何模型_初中数学几何模型大汇总,学霸一手复习资料,赶快收藏!...

热门文章

  1. Oracle SQL篇(四)group by 分组与分组的加强 rollup
  2. 程序员应该具备的12种能力
  3. 「leetcode」236. 二叉树的最近公共祖先:【递归与回溯】详解
  4. leetcode [383] 赎金信 / Ransom Note , 空间换时间的哈希策略
  5. 如何在 MacBook 上使用低电量模式和高电量模式?
  6. iOS开发之Xcode开发快捷键大全
  7. 如何在 Mac 上修复丢失的鼠标光标?
  8. 如何将Mac上的墙纸更改为任何图像?
  9. 云创大数据荣获2018年度南京白下高新园区统计工作先进单位
  10. Hadoop设备实际上属于有待编排的超级计算机