我构建的Python RPM无法安装
因为我需要在多个通过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构建需要我想要构建的内容?
2 个回答
rpmbuild这个工具挺聪明的,这就是其中一个例子。它可能从你某个脚本文件里找到了/usr/local/bin/python
这个路径,文件里可能有类似这样的内容:
#!/usr/local/bin/python
在文件的开头。你可以试着在你的bz2文件里的文件中搜索这个路径。
你可以通过在你的规格文件中添加以下一行来解决这个问题:
AutoReq: no
我来解释一下为什么这样做是必要的。当rpmbuild处理带有#!(也叫shebang)的.py文件时,它会自动将shebang指定的二进制文件作为依赖项添加进去。换句话说,如果shebang是#!/usr/bin/env python
,它会添加一个依赖,指向在$PATH
中找到的第一个python。
你要么需要关闭这种自动处理依赖的功能,要么就得找到所有可能引起问题的shebang,并把它们改成其他的。