Recovered from the older tannerjc.net wiki snapshot dated January 23, 2016.

workspace

  • yum groupinstall Development Tools
  • yum install mercurial
  • yum install rpmlint
  • yum instal ruby rubygems ruby-devel
  • gem install fpm
  • https://github.com/jctanner/mfp
mkdir ~/rpmbuild
mkdir ~/rpmbuild/SPECS
mkdir ~/rpmbuild/SOURCES

mfp

  • mkdir ~/github; cd ~/github ; git clone git://github.com/jctanner/mfp.git
  • mkdir bin ; ln -s /home/rpmdevel/github/mfp/mfp bin/mfp

specs

create spec file

mfp package.recipe --speconly
cp /tmp/package.spec ~/rpmbuild/SPECS

validate the spec file

rpmlint name.spec

validate spec with rpmbuild

rpmbuild -ba name.spec

python packages

python setup.py bdist_rpm --spec-only --build-requires python --requires python-rpmfluff,rpm-python
python setup.py bdist_rpm --source-only --build-requires python --requires python-rpmfluff,rpm-python
cp build/bdist.linux-x86_64/rpm/SRPMS/mfp-0.2.0-1.src.rpm ~/rpmbuild/SRPMS/
mock -r fedora-19-x86_64 rpmbuild/SRPMS/mfp-0.2.0-1.src.rpm

mock

  • creates a chroot for the builds based on the defined OS config
  • buildrequires in spec files should be one package per line
  • ie: BuildRequires package1\nBuildRequires package2
  • putting them all in the same line, causes none of them to get installed
  • make sure you copy the artifact(s) out of the results dir, because they won’t be there next time to you run something

create an EL6 release SRPM with mock

mock -r epel-6-x86_64 –buildsrpm –spec SPECS/bar.spec –sources SOURCES/*

INFO: Done(bar.spec) Config(epel-6-x86_64) 1 minutes 42 seconds
INFO: Results and/or logs in: /var/lib/mock/epel-6-x86_64/result
Finish: run

[rpmdevel@jenkins rpmbuild]$ ll /var/lib/mock/epel-6-x86_64/result
total 1920
-rw-rw-r-- 1 root     mock 1925831 Jul  5 19:46 available_pkgs
-rw-rw-r-- 1 rpmdevel mock    2016 Jul  5 19:46 bar-0.1-1.el6.src.rpm
-rw-rw-r-- 1 rpmdevel mock    1042 Jul  5 19:46 build.log
-rw-rw-r-- 1 rpmdevel mock   23609 Jul  5 19:46 root.log
-rw-rw-r-- 1 rpmdevel mock     905 Jul  5 19:46 state.log

build EL6 RPM with mock

mock -r epel-6-x86_64 /var/lib/mock/epel-6-x86_64/result/bar-0.1-1.el6.src.rpm

[rpmdevel@jenkins rpmbuild]$ mock -r epel-6-x86_64 SRPMS/bar-0.1-1.el6.src.rpm
INFO: mock.py version 1.1.32 starting...
Start: init plugins
INFO: selinux disabled
Finish: init plugins
Start: run
INFO: Start(SRPMS/bar-0.1-1.el6.src.rpm)  Config(epel-6-x86_64)
Start: lock buildroot
Start: clean chroot
INFO: chroot (/var/lib/mock/epel-6-x86_64) unlocked and deleted
Finish: clean chroot
Finish: lock buildroot
Start: chroot init
Start: lock buildroot
Mock Version: 1.1.32
INFO: Mock Version: 1.1.32
INFO: calling preinit hooks
INFO: enabled root cache
Start: unpacking root cache
Finish: unpacking root cache
INFO: enabled yum cache
Start: cleaning yum metadata
Finish: cleaning yum metadata
INFO: enabled ccache
Start: device setup
Finish: device setup
Start: yum update
Start: Outputting list of available packages
Finish: Outputting list of available packages
Finish: yum update
Finish: lock buildroot
Finish: chroot init
INFO: Installed packages:
Start: build phase for bar-0.1-1.el6.src.rpm
Start: device setup
Finish: device setup
Start: build setup for bar-0.1-1.el6.src.rpm
Finish: build setup for bar-0.1-1.el6.src.rpm
Start: rpmbuild -bb bar-0.1-1.el6.src.rpm
Start: Outputting list of installed packages
Finish: Outputting list of installed packages
Finish: rpmbuild -bb bar-0.1-1.el6.src.rpm
Finish: build phase for bar-0.1-1.el6.src.rpm
INFO: Done(SRPMS/bar-0.1-1.el6.src.rpm) Config(epel-6-x86_64) 0 minutes 21 seconds
INFO: Results and/or logs in: /var/lib/mock/epel-6-x86_64/result
Finish: run

[rpmdevel@jenkins rpmbuild]$ file /var/lib/mock/epel-6-x86_64/result/*
/var/lib/mock/epel-6-x86_64/result/available_pkgs:           C++ source, ASCII text
/var/lib/mock/epel-6-x86_64/result/bar-0.1-1.el6.src.rpm:    RPM v3.0 src
/var/lib/mock/epel-6-x86_64/result/bar-0.1-1.el6.x86_64.rpm: RPM v3.0 bin i386/x86_64 bar-0.1-1.el6
/var/lib/mock/epel-6-x86_64/result/build.log:                ASCII text, with very long lines
/var/lib/mock/epel-6-x86_64/result/installed_pkgs:           ASCII text
/var/lib/mock/epel-6-x86_64/result/root.log:                 ASCII text, with very long lines
/var/lib/mock/epel-6-x86_64/result/state.log:                ASCII text

Examples

conary

[rpmdevel@jenkins ~]$ cat recipes/conary.recipe
class TestPackage(RpmPackage):

    name = conary
    version = 2.4.13
    release = 1
    description = conary package manager
    license = Apache 2.0
    vendor = rpath
    packager = tanner.jc@gmail.com
    url = https://bitbucket.org/rpathsync/conary

	# requires: python-devel, openssl-devel, elfutils-libelf-devel, sqlite-devel

    def setup(r):
		r.addArchive(https://bitbucket.org/rpathsync/conary/get/conary-2.4.13.tar.gz)

		# cd rpathsync-conary-9e82ab6709a2

		# make minimal libelf=-lelf
		r.Make(options=minimal libelf=-lelf)

		# make install NO_KID=1
		r.MakeInstall(options=NO_KID=1)
mfp recipes/conary.recipe --speconly
mock -r epel-6-x86_64 --buildsrpm --spec SPECS/conary.spec --sources SOURCES/conary* --copyin SOURCES/conary* builddir/build/SOURCES/
cd ~ ; mock -r epel-6-x86_64 --buildsrpm --spec rpmbuild/SPECS/conary.spec --sources ~/rpmbuild/SOURCES
cp /var/lib/mock/epel-6-x86_64/result/conary-2.4.13-1.src.rpm ~/rpmbuild/SRPMS/
mock -r epel-6-x86_64 --installdeps rpmbuild/SRPMS/conary-2.4.13-1.src.rpm
mock -r epel-6-x86_64 rpmbuild/SRPMS/conary-2.4.13-1.src.rpm
cp /var/lib/mock/epel-6-x86_64/result/conary-2.4.13-1.x86_64.rpm ~/rpmbuild/RPMS/x86_64/conary-2.4.13-1.el6.x86_64.rpm

References