CentOS is a great operating system, but recent versions of software packages is not one of its virtues. For example the current CentOS 7.2 ships with git version 1.8.3 released 2013, almost 3 years ago. And by that time git gained quite some useful features. So lets see how to build RPMs with latest git.
RPM build chroot
First thing is to make a chroot where to build the RPM, because there are a lot of dependencies required for building, which needs to be cleaned up afterwards. Much easier is to just delete the whole chroot dir 🙂
First lets create the chroot directory and initialize the rpm database  :
mkdir /root/buildroot rpm --root=/root/buildroot --rebuilddb
Next install the latest centos-release package and yum inside :
rpm --root=/root/buildroot -i http://mirror.centos.org/centos/7.2.1511/os/x86_64/Packages/centos-release-7-2.1511.el7.centos.2.10.x86_64.rpm yum --installroot=/root/buildroot install yum
Next we continue inside the chroot. Lucky us, systemd-nspawn makes it trivial to work inside the chroot :
systemd-nspawn -D /root/buildroot/
Building RPMs
Next we need to install gcc, and few other packages that are needed to compile RPMs .
yum install make gcc perl-ExtUtils-MakeMaker rpmdevtools curl-devel expat-devel gettext-devel openssl-devel zlib-devel
And now we need a git SRPM to build. We can just grab the Fedora one which has git 2.7.1. Here https://apps.fedoraproject.org/packages/git/overview/ are all Fedora builds, and I picked the Rawhide version. Clicking on it takes us to a page with build information and there is also a link to download the SRPM for this build. Lets install it :
rpm -i https://kojipkgs.fedoraproject.org//packages/git/2.7.1/1.fc24/src/git-2.7.1-1.fc24.src.rpm
You can just ignore the warning about missing users. Go to SPECS directory and try to build the RPMs:
cd rpmbuild/SPECS/ rpmbuild -ba git.spec error: Failed build dependencies: asciidoc >= 8.4.1 is needed by git-2.7.1-1.el7.centos.x86_64 xmlto is needed by git-2.7.1-1.el7.centos.x86_64 desktop-file-utils is needed by git-2.7.1-1.el7.centos.x86_64 emacs is needed by git-2.7.1-1.el7.centos.x86_64 libgnome-keyring-devel is needed by git-2.7.1-1.el7.centos.x86_64 pkgconfig(bash-completion) is needed by git-2.7.1-1.el7.centos.x86_64
Ok, we need to install some dependencies to be able to build. Lets just install them:
yum install asciidoc xmlto desktop-file-utils emacs libgnome-keyring-devel pkgconfig bash-completion
and run rpmbuild again:
rpmbuild -ba git.spec
After the build finishes we have the RPMs in ~/rpmbuild/RPMS:
cd ~/rpmbuild/RPMS/ find . ./noarch ./noarch/gitweb-2.7.1-1.el7.centos.noarch.rpm ./noarch/gitk-2.7.1-1.el7.centos.noarch.rpm ./noarch/git-email-2.7.1-1.el7.centos.noarch.rpm ./noarch/git-gui-2.7.1-1.el7.centos.noarch.rpm ./noarch/git-cvs-2.7.1-1.el7.centos.noarch.rpm ./noarch/git-p4-2.7.1-1.el7.centos.noarch.rpm ./noarch/perl-Git-SVN-2.7.1-1.el7.centos.noarch.rpm ./noarch/git-all-2.7.1-1.el7.centos.noarch.rpm ./noarch/perl-Git-2.7.1-1.el7.centos.noarch.rpm ./x86_64 ./x86_64/git-core-doc-2.7.1-1.el7.centos.x86_64.rpm ./x86_64/git-svn-2.7.1-1.el7.centos.x86_64.rpm ./x86_64/git-core-2.7.1-1.el7.centos.x86_64.rpm ./x86_64/git-daemon-2.7.1-1.el7.centos.x86_64.rpm ./x86_64/git-2.7.1-1.el7.centos.x86_64.rpm ./x86_64/git-debuginfo-2.7.1-1.el7.centos.x86_64.rpm
Exit the chroot and install the following packages for a minimal git installation:
yum install buildroot/root/rpmbuild/RPMS/x86_64/git-2.7.1-1.el7.centos.x86_64.rpm buildroot/root/rpmbuild/RPMS/x86_64/git-core-* buildroot/root/rpmbuild/RPMS/noarch/perl-Git-2.7.1-1.el7.centos.noarch.rpm
Not, so bad 🙂 Next time I will check how to create a repository .
FYI, there were some updates to the build process on 2.21 that required installing epel-rpm-macros before building.
The error I got was:
“cc: error: %{build_cflags}: No such file or directory”
https://src.fedoraproject.org/rpms/git/c/95fc1fa70e0f38fb3ef9c1610a388157582c5ad2
If you don’t need to make any modifications to the spec or source from the srpm you can also do:
wget http://example.com/git.src.rpm
rpmbuild –rebuild git.src.rpm
I knew it there is shorter way for the last step 🙂
I just didn’t feel like searching for it .