RPM Packaging Environment for an Arbitrary User

Recently I had to roll my own package on CentOS 7. It's been a while since I've done this and so I had to dig around online to remember how to set up an environment for packaging. So this time around I'll jot down some notes.

First thing's first, to build as an arbitrary user we'll need to set up a space for RPMs to be packaged in. Start by defining the location with this via the RPM Macro _topdir:

[mcvady@centos7 ~]$ cat ~/.rpmmacros
%_topdir /home/mcvady/working/rpm

Once set this value should be picked up immediately. Test the value from shell like so:

[mcvady@centos7 ~]$ rpm --eval '%_topdir'
/home/mcvady/working/rpm

Now create the RPM top-level directory:

[mcvady@centos7 ~]$ mkdir -p `rpm --eval '%_topdir'` # create RPM output directory

Here's a helper script I drop in ~/bin/ to flesh out the structure of the RPM packaging top-level directory (Note that ~/bin/ is automatically added to $PATH in the default ~/.bash_profile):

#!/bin/bash

set -e

RM_BIN="/usr/bin/rm"
RPM_BIN="/usr/bin/rpm"
MKDIR_BIN="/usr/bin/mkdir"

rpmtopdir=`$RPM_BIN --eval '%_topdir'`

pushd $rpmtopdir 2>&1 > /dev/null

$RM_BIN -rf BUILD/*
$RM_BIN -rf BUILDROOT/*
$RM_BIN -rf RPMS/*
$RM_BIN -rf SOURCES/*
$RM_BIN -rf SPECS/*
$RM_BIN -rf SRPMS/*

$MKDIR_BIN -p BUILD
$MKDIR_BIN -p BUILDROOT
$MKDIR_BIN -p RPMS/x86_64
$MKDIR_BIN -p SOURCES
$MKDIR_BIN -p SPECS
$MKDIR_BIN -p SRPMS

popd 2>&1 > /dev/null

And now to test that packaging works by packaging a project:

[mcvady@centos7 ~]$ cd working/
[mcvady@centos7 working]$ git clone http://git.bunkergate.org/chunker
Cloning into 'chunker'...
[mcvady@centos7 working]$ cd chunker/
[mcvady@centos7 chunker]$ ./package.sh 0.9.1
srcdir /home/mcvady/working/rpm/SOURCES
~/working/chunker ~/working/chunker
rm -f chunker test-overflow test-cleanMarkerKeepLast test-handshake ./src/stats.o ./src/connection.o
-rw-rw-r-- mcvady/mcvady  3654 2015-05-13 15:59 chunker.spec
-rw-rw-r-- mcvady/mcvady   474 2015-05-13 15:59 INSTALL
drwxrwxr-x mcvady/mcvady     0 2015-05-13 15:59 lib/
-rw-rw-r-- mcvady/mcvady  6551 2015-05-13 15:59 lib/dictionary.h
-rw-rw-r-- mcvady/mcvady 39097 2015-05-13 15:59 lib/iniparser-3.1.tar.gz
-rw-rw-r-- mcvady/mcvady 11574 2015-05-13 15:59 lib/iniparser.h
-rw-rw-r-- mcvady/mcvady 17594 2015-05-13 15:59 lib/libiniparser.a
-rwxrwxr-x mcvady/mcvady 18867 2015-05-13 15:59 lib/libiniparser.so.0
-rw-rw-r-- mcvady/mcvady  2221 2015-05-13 15:59 makefile
-rwxrwxr-x mcvady/mcvady  1035 2015-05-13 15:59 package.sh
-rw-rw-r-- mcvady/mcvady   236 2015-05-13 15:59 README
drwxrwxr-x mcvady/mcvady     0 2015-05-13 15:59 src/
-rwxrwxr-x mcvady/mcvady  3718 2015-05-13 15:59 src/chunker-init
-rw-rw-r-- mcvady/mcvady 22744 2015-05-13 15:59 src/chunker.c
-rw-rw-r-- mcvady/mcvady  1066 2015-05-13 15:59 src/chunker.conf
-rw-rw-r-- mcvady/mcvady  2409 2015-05-13 15:59 src/chunker.h
-rwxrwxr-x mcvady/mcvady  2628 2015-05-13 15:59 src/chunker2s3.sh
-rw-rw-r-- mcvady/mcvady    98 2015-05-13 15:59 src/chunker_health-cron
-rwxrwxr-x mcvady/mcvady   969 2015-05-13 15:59 src/chunker_health.sh
-rw-rw-r-- mcvady/mcvady 12154 2015-05-13 15:59 src/connection.c
-rw-rw-r-- mcvady/mcvady  1325 2015-05-13 15:59 src/connection.h
-rw-rw-r-- mcvady/mcvady  5014 2015-05-13 15:59 src/stats.c
-rw-rw-r-- mcvady/mcvady   382 2015-05-13 15:59 src/stats.h
drwxrwxr-x mcvady/mcvady     0 2015-05-13 15:59 test/
-rw-rw-r-- mcvady/mcvady  2978 2015-05-13 15:59 test/test-cleanMarkerKeepLast.c
-rw-rw-r-- mcvady/mcvady  3159 2015-05-13 15:59 test/test-handshake.c
-rw-rw-r-- mcvady/mcvady  1923 2015-05-13 15:59 test/test-overflow.c
-rw-rw-r-- mcvady/mcvady   464 2015-05-13 15:59 TODO
~/working/chunker
SPEC [/home/mcvady/working/rpm/SPECS/chunker_0.9.1.spec]
~/working/rpm/SPECS ~/working/chunker
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.FV0fiB
+ umask 022
+ cd /home/mcvady/working/rpm/BUILD
+ cd /home/mcvady/working/rpm/BUILD
+ rm -rf chunker-0.9.1
+ /usr/bin/mkdir -p chunker-0.9.1
+ cd chunker-0.9.1
+ /usr/bin/gzip -dc /home/mcvady/working/rpm/SOURCES/chunker-0.9.1.tgz
+ /usr/bin/tar -xvvf -
-rw-rw-r-- mcvady/mcvady  3654 2015-05-13 15:59 chunker.spec
-rw-rw-r-- mcvady/mcvady   474 2015-05-13 15:59 INSTALL
drwxrwxr-x mcvady/mcvady     0 2015-05-13 15:59 lib/
-rw-rw-r-- mcvady/mcvady  6551 2015-05-13 15:59 lib/dictionary.h
-rw-rw-r-- mcvady/mcvady 39097 2015-05-13 15:59 lib/iniparser-3.1.tar.gz
-rw-rw-r-- mcvady/mcvady 11574 2015-05-13 15:59 lib/iniparser.h
-rw-rw-r-- mcvady/mcvady 17594 2015-05-13 15:59 lib/libiniparser.a
-rwxrwxr-x mcvady/mcvady 18867 2015-05-13 15:59 lib/libiniparser.so.0
-rw-rw-r-- mcvady/mcvady  2221 2015-05-13 15:59 makefile
-rwxrwxr-x mcvady/mcvady  1035 2015-05-13 15:59 package.sh
-rw-rw-r-- mcvady/mcvady   236 2015-05-13 15:59 README
drwxrwxr-x mcvady/mcvady     0 2015-05-13 15:59 src/
-rwxrwxr-x mcvady/mcvady  3718 2015-05-13 15:59 src/chunker-init
-rw-rw-r-- mcvady/mcvady 22744 2015-05-13 15:59 src/chunker.c
-rw-rw-r-- mcvady/mcvady  1066 2015-05-13 15:59 src/chunker.conf
-rw-rw-r-- mcvady/mcvady  2409 2015-05-13 15:59 src/chunker.h
-rwxrwxr-x mcvady/mcvady  2628 2015-05-13 15:59 src/chunker2s3.sh
-rw-rw-r-- mcvady/mcvady    98 2015-05-13 15:59 src/chunker_health-cron
-rwxrwxr-x mcvady/mcvady   969 2015-05-13 15:59 src/chunker_health.sh
-rw-rw-r-- mcvady/mcvady 12154 2015-05-13 15:59 src/connection.c
-rw-rw-r-- mcvady/mcvady  1325 2015-05-13 15:59 src/connection.h
-rw-rw-r-- mcvady/mcvady  5014 2015-05-13 15:59 src/stats.c
-rw-rw-r-- mcvady/mcvady   382 2015-05-13 15:59 src/stats.h
drwxrwxr-x mcvady/mcvady     0 2015-05-13 15:59 test/
-rw-rw-r-- mcvady/mcvady  2978 2015-05-13 15:59 test/test-cleanMarkerKeepLast.c
-rw-rw-r-- mcvady/mcvady  3159 2015-05-13 15:59 test/test-handshake.c
-rw-rw-r-- mcvady/mcvady  1923 2015-05-13 15:59 test/test-overflow.c
-rw-rw-r-- mcvady/mcvady   464 2015-05-13 15:59 TODO
+ STATUS=0
+ '[' 0 -ne 0 ']'
+ /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w .
+ exit 0
Executing(%build): /bin/sh -e /var/tmp/rpm-tmp.MTVkPK
+ umask 022
+ cd /home/mcvady/working/rpm/BUILD
+ cd chunker-0.9.1
+ make chunker
gcc -std=gnu99 -O2 -Wall -c ./src/connection.c -o ./src/connection.o
gcc -std=gnu99 -O2 -Wall -c ./src/stats.c -o ./src/stats.o
gcc -std=gnu99 -O2 -Wall ./src/chunker.c ./src/connection.o ./src/stats.o -o chunker -I./lib -L./lib -liniparser
+ exit 0
Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.BluP5U
+ umask 022
+ cd /home/mcvady/working/rpm/BUILD
+ '[' /home/mcvady/working/rpm/BUILDROOT/chunker-0.9.1-1.el7.centos.x86_64 '!=' / ']'
+ rm -rf /home/mcvady/working/rpm/BUILDROOT/chunker-0.9.1-1.el7.centos.x86_64
++ dirname /home/mcvady/working/rpm/BUILDROOT/chunker-0.9.1-1.el7.centos.x86_64
+ mkdir -p /home/mcvady/working/rpm/BUILDROOT
+ mkdir /home/mcvady/working/rpm/BUILDROOT/chunker-0.9.1-1.el7.centos.x86_64
+ cd chunker-0.9.1
+ rm -rf /home/mcvady/working/rpm/BUILDROOT/chunker-0.9.1-1.el7.centos.x86_64
+ make PFX=/home/mcvady/working/rpm/BUILDROOT/chunker-0.9.1-1.el7.centos.x86_64 install
gcc -std=gnu99 -O2 -Wall -c ./src/connection.c -o ./src/connection.o
gcc -std=gnu99 -O2 -Wall -c ./src/stats.c -o ./src/stats.o
gcc -std=gnu99 -O2 -Wall ./src/chunker.c ./src/connection.o ./src/stats.o -o chunker -I./lib -L./lib -liniparser
install -m 775 chunker /home/mcvady/working/rpm/BUILDROOT/chunker-0.9.1-1.el7.centos.x86_64/opt/tsdb/bin
install -m 755 ./src/chunker-init /home/mcvady/working/rpm/BUILDROOT/chunker-0.9.1-1.el7.centos.x86_64/etc/init.d/chunker
install -m 644 ./src/chunker.conf /home/mcvady/working/rpm/BUILDROOT/chunker-0.9.1-1.el7.centos.x86_64/etc
install -m 755 ./src/chunker2s3.sh /home/mcvady/working/rpm/BUILDROOT/chunker-0.9.1-1.el7.centos.x86_64/opt/tsdb/scripts
install -m 755 ./src/chunker_health.sh /home/mcvady/working/rpm/BUILDROOT/chunker-0.9.1-1.el7.centos.x86_64/opt/tsdb/scripts
install -m 644 ./src/chunker_health-cron /home/mcvady/working/rpm/BUILDROOT/chunker-0.9.1-1.el7.centos.x86_64/opt/tsdb/scripts
+ /usr/lib/rpm/find-debuginfo.sh --strict-build-id -m --run-dwz --dwz-low-mem-die-limit 10000000 --dwz-max-die-limit 110000000 /home/mcvady/working/rpm/BUILD/chunker-0.9.1
extracting debug info from /home/mcvady/working/rpm/BUILDROOT/chunker-0.9.1-1.el7.centos.x86_64/opt/tsdb/bin/chunker
dwz: Too few files for multifile optimization
/usr/lib/rpm/sepdebugcrcfix: Updated 0 CRC32s, 1 CRC32s did match.
+ /usr/lib/rpm/check-buildroot
+ /usr/lib/rpm/redhat/brp-compress
+ /usr/lib/rpm/redhat/brp-strip-static-archive /usr/bin/strip
+ /usr/lib/rpm/brp-python-bytecompile /usr/bin/python 1
+ /usr/lib/rpm/redhat/brp-python-hardlink
+ /usr/lib/rpm/redhat/brp-java-repack-jars
Processing files: chunker-0.9.1-1.el7.centos.x86_64
Provides: chunker = 0.9.1-1.el7.centos chunker(x86-64) = 0.9.1-1.el7.centos config(chunker) = 0.9.1-1.el7.centos
Requires(interp): /bin/sh /bin/sh /bin/sh /bin/sh
Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1
Requires(pre): /bin/sh
Requires(post): /bin/sh
Requires(preun): /bin/sh
Requires(postun): /bin/sh
Requires: /bin/bash /bin/sh libc.so.6()(64bit) libc.so.6(GLIBC_2.14)(64bit) libc.so.6(GLIBC_2.2.5)(64bit) libc.so.6(GLIBC_2.3)(64bit) libc.so.6(GLIBC_2.3.2)(64bit) libc.so.6(GLIBC_2.9)(64bit) rtld(GNU_HASH)
Processing files: chunker-debuginfo-0.9.1-1.el7.centos.x86_64
Provides: chunker-debuginfo = 0.9.1-1.el7.centos chunker-debuginfo(x86-64) = 0.9.1-1.el7.centos
Requires(rpmlib): rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1 rpmlib(CompressedFileNames) <= 3.0.4-1
Checking for unpackaged file(s): /usr/lib/rpm/check-files /home/mcvady/working/rpm/BUILDROOT/chunker-0.9.1-1.el7.centos.x86_64
Wrote: /home/mcvady/working/rpm/SRPMS/chunker-0.9.1-1.el7.centos.src.rpm
Wrote: /home/mcvady/working/rpm/RPMS/x86_64/chunker-0.9.1-1.el7.centos.x86_64.rpm
Wrote: /home/mcvady/working/rpm/RPMS/x86_64/chunker-debuginfo-0.9.1-1.el7.centos.x86_64.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.vSpeIF
+ umask 022
+ cd /home/mcvady/working/rpm/BUILD
+ cd chunker-0.9.1
+ rm -rf /home/mcvady/working/rpm/BUILDROOT/chunker-0.9.1-1.el7.centos.x86_64
+ exit 0
~/working/chunker
[mcvady@centos7 chunker]$ ls -Ahl chunker-0.9.1-1.el7.centos.x86_64.rpm 
-rw-rw-r--. 1 mcvady mcvady 21K May 13 16:00 chunker-0.9.1-1.el7.centos.x86_64.rpm

やった!