返回顶部
首页 > 资讯 > 精选 >如何在CentOS/RedHat下实现根据源码包创建rpm包
  • 214
分享到

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

2023-06-16 12:06:19 214人浏览 安东尼
摘要

今天就跟大家聊聊有关如何在Centos/RedHat下实现根据源码包创建rpm包,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。有时你可能需要获取一个开源应用的源码包,但是可能没有无法

今天就跟大家聊聊有关如何在Centos/RedHat下实现根据源码包创建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

2. 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参数

3. 下载源码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

4. 创建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=/etc  make  %install [ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT  make 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/*  %changelog  In 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 ]; then   exit $? 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”的%安装下面的行用于从前面的步骤中编译的二进制文件,并安装或将它们复制到适当的位置,这样它们就可以被访问。

5. 使用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

6. 验证源和二进制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

看完上述内容,你们对如何在CentOS/RedHat下实现根据源码包创建rpm包有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注编程网精选频道,感谢大家的支持。

--结束END--

本文标题: 如何在CentOS/RedHat下实现根据源码包创建rpm包

本文链接: https://lsjlt.com/news/283619.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何在CentOS/RedHat下实现根据源码包创建rpm包
    今天就跟大家聊聊有关如何在CentOS/RedHat下实现根据源码包创建rpm包,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。有时你可能需要获取一个开源应用的源码包,但是可能没有无法...
    99+
    2023-06-16
  • linux如何从一个rpm源码构建一个 rpm 包
    ...
    99+
    2024-04-02
  • POSTGRESQL10.3 RPM包如何实现主从搭建
    这篇文章主要介绍POSTGRESQL10.3  RPM包如何实现主从搭建,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、POSTGRESQL主从复制搭建 1、安装POS...
    99+
    2024-04-02
  • CentOS系统中如何实现只下载RPM包而不进行安装
    这篇文章主要讲解了“CentOS系统中如何实现只下载RPM包而不进行安装”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“CentOS系统中如何实现只下载RPM包而不进行安装”吧!通常是使用yu...
    99+
    2023-06-10
  • 如何在CentOS中用yum命令下载RPM包但不进行安装
    本篇内容介绍了“如何在CentOS中用yum命令下载RPM包但不进行安装”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!yum是基于Red H...
    99+
    2023-06-10
  • linux如何从一个rpm源码安装一个构建好的包
    ...
    99+
    2024-04-02
  • PHP如何根据范围创建数组,包含指定的元素
    这篇文章将为大家详细讲解有关PHP如何根据范围创建数组,包含指定的元素,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。PHP 根据范围创建包含指定元素的数组 PHP 提供了多种函数来创建数组,其中之一是 r...
    99+
    2024-04-02
  • 如何下载POSTGRESQL源码安装包及实现主机配置
    这篇文章将为大家详细讲解有关如何下载POSTGRESQL源码安装包及实现主机配置,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、下载POSTGRESQL源码安装包及主机...
    99+
    2024-04-02
  • 如何在PHP中打包数据类型并创建API?
    PHP是一种流行的脚本语言,它被广泛用于Web开发。在PHP中,我们经常需要打包不同类型的数据,并通过API将这些数据发送到其他应用程序。在本文中,我们将学习如何在PHP中打包数据类型并创建API。 打包数据类型 在PHP中,我们可以使用多...
    99+
    2023-06-16
    数据类型 打包 api
  • 如何根据url 批量下载二维码实现详解
    目录React 前端实现一、依赖二、思路整理1.将选用展示的数据放在数组中2. 实用 qrcode + canvas 将 url 装换成 canvas 的二维码图片3.二维码 cav...
    99+
    2023-05-20
    url 批量下载二维码 url批量下载
  • PHP如何实现创建以太坊钱包转账等功能
    这篇文章给大家分享的是有关PHP如何实现创建以太坊钱包转账等功能的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。PHP开发环境搭建工具有哪些一、phpStudy,是一个新手入门最常用的开发环境。二、WampServ...
    99+
    2023-06-14
  • 如何在PHP中打包和处理不同的数据类型以创建API?
    PHP是一种非常流行的编程语言,它被广泛用于Web开发和API构建。在构建API时,您需要处理和打包不同类型的数据,例如字符串、数字、数组和对象。本文将介绍如何在PHP中打包和处理不同的数据类型以创建API。 处理字符串 在API开发中...
    99+
    2023-06-16
    数据类型 打包 api
  • 如何在PHP编程中实现高效的大数据打包算法?
    在PHP编程中,实现高效的大数据打包算法是一项关键任务。由于PHP是一种解释型语言,其性能不如编译型语言,因此在处理大量数据时,需要使用一些优化技巧来提高其性能。本文将介绍如何在PHP编程中实现高效的大数据打包算法,并提供相应的演示代码。 ...
    99+
    2023-06-24
    编程算法 大数据 打包
  • Python 数组如何在 Unix 系统中实现数据的高效打包?
    在 Unix 系统中,数据的高效打包是非常重要的,而 Python 数组可以帮助实现这一目标。Python 数组是一种特殊的数据结构,它允许我们在一个连续的内存块中存储相同类型的数据。这使得数组在 Unix 系统中进行数据的高效打包非常有...
    99+
    2023-11-02
    数组 unix 打包
  • 如何在 Unix 环境下实现 ASP 打包?面试中可能会问到哦!
    在 Unix 环境下实现 ASP 打包,是一个常见的需求。本文将介绍如何使用 Unix 环境下的一些工具和技术,来实现 ASP 打包的目标。同时,我们也会提到一些面试可能会问到的问题,希望对读者有所帮助。 一、ASP 打包的背景 ASP(A...
    99+
    2023-08-07
    打包 面试 unix
  • 如何在ASP网站中充分利用二维码技术实现高效并发打包?
    ASP网站是一种常用的动态网站技术,随着现代物流和电商业务的迅速发展,网站在处理并发打包等业务时,需要更高效的解决方案。为此,我们可以利用二维码技术来实现高效并发打包。 一、什么是二维码技术 二维码是一种矩阵式条形码,它可以存储更多的数据,...
    99+
    2023-08-13
    二维码 并发 打包
  • 如何在 Java 编程中利用算法和接口打包实现更高效的代码?
    Java 是一种广泛应用的编程语言,具有高效、安全、可靠等优点。在 Java 编程中,算法和接口是两个重要的概念,它们可以帮助我们实现更高效的代码。本文将介绍如何利用算法和接口打包实现更高效的 Java 代码,并演示一些示例代码。 一、算法...
    99+
    2023-10-29
    编程算法 打包 接口
  • PHP打包技术在Linux平台上的应用,如何实现高效大数据处理?
    PHP是一种广泛应用于网络应用开发的脚本语言,而在大数据处理方面,PHP打包技术则是非常重要的一环。本文将介绍PHP打包技术在Linux平台上的应用,以及如何实现高效大数据处理。 一、什么是PHP打包技术? PHP打包技术是指将多个PHP...
    99+
    2023-11-13
    打包 大数据 linux
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作