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
やった!