## yum! RPMs!

The content of this article will be very bland if you’re not regularly on a linux machine and, in particular, a Red Hat based machine. I am goign to write about RPMs, so if this is of interest to you, congrats reader, read on!

# Preliminaries

This guide is pretty specific to Fedora. To follow along, you must be inside a Fedora machine with the fedora-packager package installed from yum,

sudo yum install fedora-packager


If you do not have access to a fedora machine, I can provide one for you.

# Meat and Potatoes

How do you typically install software from source? The ./configure, make, and make install pattern is pretty ubiquitous and most people are familiar with it.

There are two common problems to this process:

• handling dependencies
• removing old and extraneous files during upgrades

## RPMs

RPMs are a package format that attempts to solve those two problems from installing new software. It offers a user a way to specify dependencies as well as keep track of installed files.

Yum is related to RPM in that it is an RPM package manager. When you download an RPM and need to install it, but it has dependencies, an RPM by itself does not know where to look for those dependencies. That is where yum comes in to save the day.

## A Hello World Example

Starting off in a clean directory, we are goign to create a couple files. First file will be the spec file, SPECS/helloworld.spec:

Name: helloworld
Version:  0.0.1
Release:  1%{?dist}
Summary:  Quick RPM example

URL:  http://intranet/~rbruns/

Source0:  helloworld.conf

BuildArch:  noarch

%description
A very complicated shell script that prints out the string "hello
world".

%prep
cp %SOURCE0 .

%build
cat <<EOF >%{name}
#!/bin/sh
. %{_sysconfdir}/%{name}.conf
echo \$HELLO EOF %install install -pDm644 %{name}.conf %{buildroot}%{_sysconfdir}/%{name}.conf install -pDm644 %{name} %{buildroot}%{_bindir}/%{name} %files %config %attr(0644, root, root) %{_sysconfdir}/%{name}.conf %attr(0755, root, root) %{_bindir}/%{name} %changelog * Fri Dec 05 2014 Renning Bruns <rbruns@ixl.com> - initial creation  We have also specified a source file which contains our config in SOURCES/helloworld.conf: HELLO="hello world"  So our directory tree now looks like: $ find .
.
./SOURCES
./SOURCES/helloworld.conf
./SPECS
./SPECS/helloworld.spec


And to build the RPM,

$rpmbuild --define "_topdir$(pwd)" -bb SPECS/helloworld.spec


Note the use of --define "_topdir $(pwd)". This single-handedly made creating RPMs not as painful as many of the guides available online which required first creating a non-privileged user, then creating a chroot to jail in the process, and using those to create your RPMs. While there are some security benefits in doing that, they are terribly inpractical. Not doing that lets us easily script out the creation of RPMs. Everything should build successfully, and if it does, our new RPM lives somewhere inside the RPMS directory. We can install it with yum now. $ sudo yum install RPMS/noarch/helloworld-0.0.1-1.fc20.noarch.rpm


### Sections

There are Four important sections:

• prep
• build
• install
• files

The main reason for the separation of these sections and steps is that there are also some convenience macros to help make writing the spec file for simple projects much quicker.

There are also a handful of other sections that are of use. For example sections to run before and after installing or uninstalling a package to create users, groups, and upstart/systemd files. All of these are detailed on the How to create an RPM page.

#### Prep

This section is mostly for things like extracting tar balls, checking out code repositories, and copying source files to the current work space.

Those things are not necessary, but essentially this is where all the “prep work” that you need done can safely happen.

#### Build

This section does all the compilation. Following the typical pattern of building source code, this sections corresponds to the the

./configure
make


portion of installing software.

#### Install

This section is where things get a little different. Instead of installing things as you normally would, you must prefix the destination of the files you install to first go into %{buildroot}.

This is so that the RPM can neatly archive up all the files to be installed.

#### Files

This section may seem to be made redundant but here you list all of the files installed as well as any permissions and user ownership.

### Macros

Each section can employ different RPM macros to help shorten up some more common tasks. The Fedora project has a list of macros available to them.

# Examples In The Wild

You can view actual spec files used in almost all of the packages available through yum to fedora users. For instance, I looked at the redis package to get an idea of how to create a spec file with an updated copy of that package for Fedora 14 (which does not exist in the yum repository).