为当前 git 版本构建 CentOS RPM,使用备用前缀重建失败

为当前 git 版本构建 CentOS RPM,使用备用前缀重建失败

我一直致力于为一组 CentOS Linux 服务器提供维护最新的 git 版本。我希望能够创建二进制 RPM,我可以将其发布到本地 yum 镜像 - 以便简单地安装,并轻松地使所有内容与操作系统的其余部分一起作为定期维护的一部分保持最新。

通常建议从操作系统的包管理器 (yum) 安装 git 二进制文件。然而,即使在最新的 CentOS / RHEL 7 下,最新提供的软件包也停留在相对古老的 1.8.3.1 - 与最新的 2.7.1 相比。看起来 RPMForge 曾经提供过一些更新的 git 包,但从 EL 6 开始就不再提供了。所以看起来从源代码构建实际上是这里唯一剩下的选项 - 但在这里使用自定义 RPM 包来维护这将是一个好主意。

看起来使用 Fedora 的“mock”进行 RPM 打包将是处理这个问题的最佳方法。看来最糟糕的是获取/创建/维护 SPEC 文件。幸运的是,Fedora Rawhide 似乎对此非常有价值 - 可以在https://rpmfind.net/linux/RPM/fedora/devel/rawhide/src/g/git-2.7.0-1.fc24.src.html

我成功地从 SRPM 进行了简单的重建:

$ mock -r epel-7-x86_64 rebuild /tmp/git-2.7.0-1.fc24.src.rpm

但是,由于与现有操作系统提供的 git 安装存在许多冲突,安装失败。无论如何,我不想删除/替换操作系统提供的版本,因为可能会遇到与其他操作系统提供的软件包(可能需要较旧的 git 版本)的兼容性或依赖性问题的风险。我更喜欢使用前缀的自定义 RPM /usr/local

使用rpm -qpi任何本机 RPM 报告它们是(not relocatable)- 这意味着我无法运行带有--prefix标志的 rpm 以安装在这样的备用位置。然而,我不认为我想依赖于使用它,因为它会使从 yum 运行默认安装变得复杂。我认为这可以很容易地定制到源 RPM 构建中,这样生成的 RPM 就不会发生冲突。

我认为这就像_prefix在 SPEC 文件中为宏定义一个替代值一样简单,如下所示:

$ mock -r epel-7-x86_64 -D "_prefix /usr/local" rebuild /tmp/git-2.7.0-1.fc24.src.rpm

这看起来进展顺利,直到它彻底失败 - 以以下错误结束:

+ sed -e 's@^/builddir/build/BUILDROOT/git-2.7.0-1.el7.centos.x86_64@@'
find: '/builddir/build/BUILDROOT/git-2.7.0-1.el7.centos.x86_64/usr/share/perl5/vendor_perl': No such file or directory
+ find /builddir/build/BUILDROOT/git-2.7.0-1.el7.centos.x86_64/usr/share/perl5/vendor_perl -mindepth 1 -type d
+ sed -e 's@^/builddir/build/BUILDROOT/git-2.7.0-1.el7.centos.x86_64@%dir @'
find: '/builddir/build/BUILDROOT/git-2.7.0-1.el7.centos.x86_64/usr/share/perl5/vendor_perl': No such file or directory
+ grep Git/SVN perl-git-files
error: Bad exit status from /var/tmp/rpm-tmp.sw2Kfy (%install)


RPM build errors:
    Bad exit status from /var/tmp/rpm-tmp.sw2Kfy (%install)
ERROR: Exception(/tmp/git-2.7.0-1.fc24.src.rpm) Config(epel-7-x86_64) 2 minutes 39 seconds
INFO: Results and/or logs in: /var/lib/mock/epel-7-x86_64/result
ERROR: Command failed. See logs for output.
# bash --login -c /usr/bin/rpmbuild -bb --target x86_64 --nodeps  /builddir/build/SPECS/git.spec

或者,如果我首先提取 SPECS 和 SOURCES,更改prefix/usr/local(from %{_prefix}) in SPECS/git.spec,然后重建,事情仍然会失败 - 但在不同的位置:

+ install -pm 644 contrib/emacs/git.el /builddir/build/BUILDROOT/git-2.7.0-1.el7.centos.x86_64/usr/share/emacs/site-lisp/git
+ install -Dpm 644 /builddir/build/SOURCES/git-init.el /builddir/build/BUILDROOT/git-2.7.0-1.el7.centos.x86_64/usr/share/emacs/site-lisp/site-start.d/git-init.el
+ install -pm 755 contrib/credential/gnome-keyring/git-credential-gnome-keyring /builddir/build/BUILDROOT/git-2.7.0-1.el7.centos.x86_64/usr/libexec/git-core
install: cannot create regular file '/builddir/build/BUILDROOT/git-2.7.0-1.el7.centos.x86_64/usr/libexec/git-core': No such file or directory
error: Bad exit status from /var/tmp/rpm-tmp.CJFTef (%install)
    Bad exit status from /var/tmp/rpm-tmp.CJFTef (%install)


RPM build errors:
ERROR: Exception(git-build/2/git-2.7.0-1.el7.centos.src.rpm) Config(epel-7-x86_64) 1 minutes 37 seconds
INFO: Results and/or logs in: /var/lib/mock/epel-7-x86_64/result
ERROR: Command failed. See logs for output.
 # bash --login -c /usr/bin/rpmbuild -bb --target x86_64 --nodeps  /builddir/build/SPECS/git.spec

(我猜测前一次定义宏的尝试比在 SPEC 文件中_prefix强制更改更接近成功- 因为现在可能还有其他用法仍在使用默认值。)prefix_prefix

我不太确定如何继续。我是否应该以不同的方式指定备用安装前缀,或者我可以尝试其他方法吗?

答案1

我发现一些 git repo 的人有 git 2.7.2 的 SRPM 如果这对你来说足够新的话。

我在 Centos 6 上成功构建了它。

https://github.com/nkadel/git27-srpm

它为我创建了所有包和依赖项,并且我能够将其添加到我的私人存储库中以安装 git。我从 2.9.3 的变更日志中猜测,您只需修改规范文件中的版本号即可获得 2.9.3。 (撰写本文时的最新版本)

答案2

看来您尝试将前缀设置为/usr/local部分有效。

获取 CentOS 的 SRPM,解压它,读取它的.spec文件。查看它在哪里设置配置,并修复那里的前缀。获取最新的 git 压缩包,更改对源代码(和版本!)的引用,然后尝试构建。可能大多数补丁都不适用,需要检查它们的适用性/需求。

将包的名称更改为git-local或类似的名称;如果没有,很可能(如您所见)软件包管理器将其视为官方 git 软件包的替代品,并在安装您的软件包时卸载该软件包。

相关内容