19

因为我必须在通过 kickstart 过程构建的多个 Oracle Linux 服务器上安装多个版本的 Python,所以我想为我们的 yum 存储库构建一个 python rpm。我能够使用“make altinstall”手动构建 Python,它不会安装在您的默认系统 Python 安装上,所以我认为这将是可行的方法。

经过多次试验和错误,我设法从 .bz2 python 2.7 包开始构建了一个 rpm - 但是现在当我尝试安装它时,我收到一个错误:

error: Failed dependencies:
    /usr/local/bin/python is needed by Python-2.7.2-1.i386

什么……???Python是我要安装的!!!并且系统默认的 Python (2.4) 在 /usr/bin/python !!!我的python目录的原型位置是/tmp/python2.7(可执行文件是/tmp/python2.7/bin/python2.7)。那么为什么它在 /usr/local/bin 中查找呢?

这是我的 RPM SPEC 的核心:

%prep
%setup -q

%build
./configure --prefix=/tmp/python2.7
make

%install

make altinstall

我仔细查看了 rpm 构建日志,我看到:

Requires: /bin/sh /tmp/python2.7/bin/python2.7 /usr/bin/env /usr/local/bin/python libc.so.6 libc.so.6(GLIBC_2.0)...[a lot more...]

好的,那么 /usr/local/bin 就派上用场了……现在,问题是,它是如何确定这些要求的?我是否指定了错误?我需要覆盖一些东西吗?

像许多 rpm 新手一样,我得到了构建部分,但我并没有真正“了解”在 rpmbuild 结束时会发生什么以及实际放入 rpm 文件(除了您在 %files 中指定的文件之外)的内容,然后是什么实际发生在您进行 rpm 安装时。

谁能提出我的安装失败的原因或者我可能会阅读什么来理解为什么我的 rpm 构建需要我正在尝试构建的内容?

4

2 回答 2

23

您应该能够通过将以下行添加到您的规范文件来解决此问题:

AutoReq: no

这是我对为什么这是必要的理解。当 rpmbuild 运行带有 #! 的 .py 文件时 (shebang) 它将自动添加 shebang 指定为要求的二进制文件。不仅如此,如果 shebang 是#!/usr/bin/env python,它将为解析为的任何内容添加一个依赖项(第一个 python on $PATH)。

您要么需要关闭自动需求处理,要么找到所有会导致问题的 shebangs 并将它们更改为其他内容。

于 2011-09-14T22:58:24.440 回答
8

rpmbuild 可以变得非常聪明,这就是其中一种情况。它可能/usr/local/bin/python从您的一个脚本文件中提取,其中包含以下内容:

#!/usr/local/bin/python

在顶部。尝试在 bz2 文件中的文件中查找此路径。

于 2011-09-14T22:44:40.180 回答