RPM 构建问题

RPM 构建问题

我是这样构建我的 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 软件包。

相关内容