我是这样构建我的 rpm 的:
rpmbuild-bb 规格/python.spec
使用以下规范文件:
%define _topdir /home/rpmbuild/python
%define name Python
%define release 1
%define version 2.6.4
%define buildroot %{_topdir}/%{name}-%{version}-root
BuildRoot: %{buildroot}
Summary: python
License: GPL
Name: %{name}
Version: %{version}
Release: %{release}
Source: %{name}-%{version}.tar.bz2
Group: Python
%description
Python, compiled by Jon Haddad for CentOS
%prep
%setup -q
%build
./configure --prefix=/usr/local
make
%install
%makeinstall
%files
%defattr(-,root,root)
/usr
这是我尝试安装时收到的错误:
[root@puppet rpms]# rpm -ivh Python-2.6.4-1.x86_64.rpm 错误:依赖项失败:Python-2.6.4-1.x86_64 需要 /home/rpmbuild/python/Python-2.6.4-root/usr/bin/python2.6 /Python-2.6.4-1.x86_64 需要 /usr/local/bin/python 需要 /Python-2.6.4-1.x86_64 需要 usr/local/bin/python2.6
我确实没有构建自己的 RPM 的经验,但我正在尝试设置一个 puppet 服务器,它似乎倾向于通过 RPM 安装。我需要使用 CentOS 上尚未以 RPM 形式提供的软件版本。
RPM 文件在 RPM 目录中创建 - 但我不知道该错误意味着什么。
有什么想法吗?提前致谢。
答案1
它有助于理解 RPM 的工作原理。
RPM 将自动添加它所知道的特定文件分类的要求(例如 ELF 共享库、#! 脚本等):
http://www.rpm.org/max-rpm-snapshot/s1-rpm-depend-auto-depend.html
这里发生的情况是,有效载荷的某些内容已被拾取,但具有未打包的要求:
/home/rpmbuild/python/Python-2.6.4-root/usr/bin/python2.6
/usr/local/bin/python2.6
我们可以通过运行rpmbuild -bi Python.spec
构建到安装阶段来验证这一点。根据上面提供的信息,您可以搜索文件:
find /home/rpmbuild/python/Python-2.6.4-root/ -type f -exec grep \ /home/rpmbuild/python/Python-2.6.4-root/usr/bin/python2.6
我想说你正在看的是:
/home/rpmbuild/Python-2.6.4-root/usr/bin/python2.6-config
对于具有引用完整 buildroot 的 shebang 和一堆引用 /usr/local/bin/python2.6 的脚本的文件
RPM 在这里没有做错任何事,而正确修复此问题的方法的细节通常特定于您正在构建的包的构建。
AutoProvReq: no
解决此问题的一种方法是在 SPEC 文件的前言中设置,例如直接在之后Group: Python
。这应该会给你一个可安装的 RPM,但你可能会认为它没有充分利用 RPM 的依赖模型,并且你的一些 Python 包文件中会有错误的路径。
让我们具体看一下 Python 构建,并尝试了解我们可以做些什么来以更全面的方式解决这个问题。
您的 %install 部分使用宏 %makeinstall,它默认扩展为:
[pnasrat@centos5 ~]$ rpm -E '%makeinstall'
/usr/bin/make \
prefix=/usr \
exec_prefix=/usr \
bindir=/usr/bin \
sbindir=/usr/sbin \
sysconfdir=/etc \
datadir=/usr/share \
includedir=/usr/include \
libdir=/usr/lib64 \
libexecdir=/usr/libexec \
localstatedir=/var \
sharedstatedir=/usr/com \
mandir=/usr/share/man \
infodir=/usr/share/info \
install
作为参考,我倾向于参考上游 Fedora规格,这要复杂得多,但可以构建(经过一些修改和针对 autotools 版本 IIRC 的补丁)一个并行的 python26 包。我现在不打算详细介绍这一点,但如果我们看看他们如何安装,关键行是:
make install DESTDIR=%{buildroot}
我强烈建议您这样做,而不是禁用 AutoProvReq。由于 Python 是基于 libtool 的构建,因此它可能比 %makeinstall 宏更好,因为您已经配置了前缀。通过检查此处,这似乎做对了。请注意,如果您使用此更改进行重建,您还需要添加:
%clean
rm -rf $RPM_BUILD_ROOT
并希望在本节开头有一个类似的 rm 行%install
。对我来说,这一切似乎都有效:
[pnasrat@centos5 RPMS]$ rpm --test -ivh x86_64/Python-2.6.4-1.x86_64.rpm
Preparing... ########################################### [100%]
也许值得使用其他地方提供的 python2.6 包,我相信 IUSCommunity 提供了包,如下面所记录的 -http://agilesysadmin.net/recent-python-on-rhel-or-centos。这些可能更接近 Fedora 软件包。