你确定你需要最后一个吗?不能向后移植吗?

你确定你需要最后一个吗?不能向后移植吗?

我运行的是 CentOS 5.5。我需要将一些软件包升级到新版本,不幸的是它们不可用。我陷入了从源代码构建的困境。

有没有一种简单的方法可以使用 yum 来管理我从源代码构建的内容,以便如果稍后某个软件包可用,我可以卸载从源代码构建的版本并将其替换为该软件包?

答案1

你确定你需要最后一个吗?不能向后移植吗?

仅安装向后移植而不是从源代码构建可能会更容易。基于 RHEL 的发行版默认包含安全修复程序的向后移植。并且什么都不用做!您可以使用 ie 检查包rpm -q --changelog httpd | grep CVE的安全修复httpd。考虑读这个这就是为什么 CentOS 有看似较旧版本的软件包。如果您不喜欢这个,请考虑使用其他一些使用前沿的发行版特征,是的,这是一个功能。如果您意识到这一点,请继续阅读。

我们尽量不要破坏系统

从网上的不同文章看来,将源包安装到稳定的 CentOS 时必须特别小心,因为这会破坏系统的配置另外,您绝对不能以 root 身份构建软件包,因为构建软件包时会尝试将其自身安装到系统上,在这种情况下建议使用两个终端,一个用于安装工具,yum另一个用于构建包。也就是说,让我们破坏你的系统:D。

先决条件

在构建任何包之前,您需要正确的工具集来执行此操作(就像其他任何东西一样),因此您必须开始下载用于构建表单源的基本工具集:

$ sudo yum groupinstall "Development Tools"
$ sudo yum install rpm-build

一些最近的软件包将需要包含在以下位置的某些宏和脚本redhat-rpm-config

$ sudo yum install redhat-rpm-config

也就是说,根据您尝试构建的包/源,您可能需要比这更多的标头。事先搜索特定的构建依赖关系就足够了。

创造环境

下一步是在主目录下创建构建 RPM 所需的文件和目录。如前所述,为了避免可能的系统库和其他文件损坏,您不应该使用 root 用户构建 RPM。你应该始终使用非特权用于此目的的用户。

现在,让我们在您的主路径中创建目录结构:

 $ mkdir -p ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}

我们需要编写~/.rpmmacros,您应该检查您是否没有该文件或对当前的文件进行备份。

 $ echo '%_topdir %(echo $HOME)/rpmbuild' > ~/.rpmmacros

此后,您的系统应该准备好构建大多数 RPM 包,而无需再四处寻找。

您还需要更多工具

你听说过吗make?嗯,我们还没有安装它。那么,让我们动手(手指)来工作吧:

$ sudo yum install make

另外,您可能需要一些C库来构建一些在...中完成的包C

# yum install gcc

正如我之前所说,您可能需要更多的库,但这取决于您正在构建的软件。通常这些文件以 结尾-devel,因此如果软件包告诉您需要安装,zlib则需要安装zlib-devel

源码包并创建.spec

您一定已经收到tar.gz文件了。如果没有,那还等什么!?获得源代码后,您必须创建.spec文件。这相当于debian/*Debian 类系统中的文件,因为它们包含有关您要构建的包的规则和信息。

这是复制的示例从某处:

#
# Example spec file for cdplayer app...
#
Summary: A CD player app that rocks!
Name: cdplayer
Version: 1.0
Release: 1
Copyright: GPL
Group: Applications/Sound
Source: ftp://ftp.gnomovision.com/pub/cdplayer/cdplayer-1.0.tgz
URL: http://www.gnomovision.com/cdplayer/cdplayer.html
Distribution: WSS Linux
Vendor: White Socks Software, Inc.
Packager: Santa Claus <[email protected]>

%description
It slices!  It dices!  It's a CD player app that
can't be beat.  By using the resonant frequency
of the CD itself, it is able to simulate 20X
oversampling.  This leads to sound quality that
cannot be equaled with more mundane software...

我认为到目前为止一切都必须是不言自明的。但在这里我们也应该编写构建包、准备工作等的规则,但我会尽力让每个人都更容易,所以让我们使用宏:

%prep
%setup

前面几行%prep表示准备工作,应该是升级、安装软件包之前要做的操作。您也可以手动制定自己的规则,但说实话,这很痛苦。既然我们已经结束了,下一部分是%build,很容易知道这里发生了什么;)

%build
make

您可以根据需要个性化此部分,使用BUILD_PARAMETERS="--some-switch",这当然取决于您的源包。现在是%install部分:

%install
make install

这里没有火箭科学。所以只剩下一部分了%files

%files
%doc README
/usr/local/bin/cdp
/usr/local/bin/cdplay
/usr/local/man/man1/cdp.1

此部分列出了包中要包含的所有文件,如果不设置此部分,则包实际上是空的!文档代表%doc...您已经知道了。现在,如何选择要包含在该部分中的文件%files?让我们引用一下:

由于应用程序的大部分文件是通过其 makefile 安装的,因此 RPM 无法控制构建过程的该部分,因此无法自动确定哪些文件应成为包的一部分。有些人尝试使用安装的修改版本来记录它安装的每个文件的名称。但并非每个 makefile 都使用 install,或者即使使用,也只是偶尔使用它。

尝试的另一种方法是在构建之前和之后立即获取构建系统上每个文件的列表,并将差异用作文件列表。虽然这种方法肯定会找到应用程序安装的每个文件,但它也可能会拾取无关的文件,例如系统日志、/tmp 中的文件等。开始使这种方法可行的唯一方法是在构建系统上不做任何其他事情,这是非常不方便的。这种方法还可以防止在任何给定时间在系统上构建多个包。

目前,创建文件列表的最佳方法是读取 makefile 以查看它安装了哪些文件,根据构建系统上安装的文件进行验证,然后创建列表。

取决于你怎么做:)。

精加工

好吧,您已经有了一个.spec可以工作的简单文件。但是,世界并非一帆风顺,在某些情况下这不起作用,因此您可能需要更复杂的构建步骤。我找到了本指南很容易遵循,可能会对您有所帮助。

资料来源:

相关内容