Chapter 3. Preparing software for RPM packaging
To prepare a piece of software for packaging with RPM, you can first patch the software, create a LICENSE
file for it, and archive it as a tarball.
3.1. Patching software Copy linkLink copied to clipboard!
When packaging software, you might need to make certain changes to the original source code, such as fixing a bug or changing a configuration file. In RPM packaging, you can instead leave the original source code intact and apply patches on it.
A patch is a piece of text that updates a source code file. The patch has a diff format, because it represents the difference between two versions of the text. You can create a patch by using the diff
utility, and then apply the patch to the source code by using the patch
utility.
Software developers often use version control systems such as Git to manage their code base. Such tools offer their own methods of creating diffs or patching software.
3.1.1. Creating a patch file for a sample C program Copy linkLink copied to clipboard!
You can create a patch from the original source code by using the diff
utility. For example, to patch a Hello world
program written in C (cello.c
), complete the following steps.
Prerequisites
You installed the
diff
utility on your system:dnf install diffutils
# dnf install diffutils
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Procedure
Back up the original source code:
cp -p cello.c cello.c.orig
$ cp -p cello.c cello.c.orig
Copy to Clipboard Copied! Toggle word wrap Toggle overflow The
-p
option preserves mode, ownership, and timestamps.Modify
cello.c
as needed:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Generate a patch:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Lines that start with
+
replace the lines that start with-
.NoteUsing the
Naur
options with thediff
command is recommended because it fits the majority of use cases:-N
(--new-file
)The
-N
option handles absent files as empty files.-a
(--text
)The
-a
option treats all files as text. As a result, thediff
utility does not ignore the files it classified as binaries.-u
(-U NUM
or--unified[=NUM]
)The
-u
option returns output in the form of output NUM (default 3) lines of unified context. This is a compact and an easily readable format commonly used in patch files.-r
(--recursive
)The
-r
option recursively compares any subdirectories that thediff
utility found.
However, note that in this particular case, only the
-u
option is necessary.Save the patch to a file:
diff -Naur cello.c.orig cello.c > cello.patch
$ diff -Naur cello.c.orig cello.c > cello.patch
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Restore the original
cello.c
:mv cello.c.orig cello.c
$ mv cello.c.orig cello.c
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ImportantYou must retain the original
cello.c
because the RPM package manager uses the original file, not the modified one, when building an RPM package. For more information, see Working with spec files.
3.1.2. Patching a sample C program Copy linkLink copied to clipboard!
To apply code patches on your software, you can use the patch
utility.
Prerequisites
You installed the
patch
utility on your system:dnf install patch
# dnf install patch
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - You created a patch from the original source code. For instructions, see Creating a patch file for a sample C program.
Procedure
The following steps apply a previously created cello.patch
file on the cello.c
file.
Redirect the patch file to the
patch
command:patch < cello.patch
$ patch < cello.patch patching file cello.c
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Check that the contents of
cello.c
now reflect the desired change:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Verification
Build the patched
cello.c
program:make
$ make gcc -g -o cello cello.c
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Run the built
cello.c
program:./cello
$ ./cello Hello World from my very first patch!
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.2. Creating a LICENSE file Copy linkLink copied to clipboard!
It is recommended that you distribute your software with a software license.
A software license file informs users of what they can and cannot do with a source code. Having no license for your source code means that you retain all rights to this code and no one can reproduce, distribute, or create derivative works from your source code.
Procedure
Create the
LICENSE
file with the required license statement:vim LICENSE
$ vim LICENSE
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Example 3.1. Example GPLv3
LICENSE
file textCopy to Clipboard Copied! Toggle word wrap Toggle overflow
3.3. Creating a source code archive for distribution Copy linkLink copied to clipboard!
An archive file is a file with the .tar.gz
or .tgz
suffix. Putting source code into the archive is a common way to release the software to be later packaged for distribution.
3.3.1. Creating a source code archive for a sample Bash program Copy linkLink copied to clipboard!
The bello project is a Hello World
file in Bash.
The following example contains only the bello
shell script. Therefore, the resulting tar.gz
archive has only one file in addition to the LICENSE
file.
The patch
file is not distributed in the archive with the program. The RPM package manager applies the patch when the RPM is built. The patch will be placed into the ~/rpmbuild/SOURCES/
directory together with the tar.gz
archive.
Prerequisites
-
Assume that the
0.1
version of thebello
program is used. -
You created a
LICENSE
file. For instructions, see Creating a LICENSE file.
Procedure
Move all required files into a single directory:
mkdir bello-0.1 mv ~/bello bello-0.1/ mv LICENSE bello-0.1/
$ mkdir bello-0.1 $ mv ~/bello bello-0.1/ $ mv LICENSE bello-0.1/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Create the archive for distribution:
tar -cvzf bello-0.1.tar.gz bello-0.1
$ tar -cvzf bello-0.1.tar.gz bello-0.1 bello-0.1/ bello-0.1/LICENSE bello-0.1/bello
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Move the created archive to the
~/rpmbuild/SOURCES/
directory, which is the default directory where therpmbuild
command stores the files for building packages:mv bello-0.1.tar.gz ~/rpmbuild/SOURCES/
$ mv bello-0.1.tar.gz ~/rpmbuild/SOURCES/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.3.2. Creating a source code archive for a sample Python program Copy linkLink copied to clipboard!
The pello project is a Hello World
file in Python.
The following example contains only the pello.py
program. Therefore, the resulting tar.gz
archive has only one file in addition to the LICENSE
file.
The patch
file is not distributed in the archive with the program. The RPM package manager applies the patch when the RPM is built. The patch will be placed into the ~/rpmbuild/SOURCES/
directory together with the tar.gz
archive.
Prerequisites
-
Assume that the
0.1.1
version of thepello
program is used. -
You created a
LICENSE
file. For instructions, see Creating a LICENSE file.
Procedure
Move all required files into a single directory:
mkdir pello-0.1.1 mv pello.py pello-0.1.1/ mv LICENSE pello-0.1.1/
$ mkdir pello-0.1.1 $ mv pello.py pello-0.1.1/ $ mv LICENSE pello-0.1.1/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Create the archive for distribution:
tar -cvzf pello-0.1.1.tar.gz pello-0.1.1
$ tar -cvzf pello-0.1.1.tar.gz pello-0.1.1 pello-0.1.1/ pello-0.1.1/LICENSE pello-0.1.1/pello.py
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Move the created archive to the
~/rpmbuild/SOURCES/
directory, which is the default directory where therpmbuild
command stores the files for building packages:mv pello-0.1.1.tar.gz ~/rpmbuild/SOURCES/
$ mv pello-0.1.1.tar.gz ~/rpmbuild/SOURCES/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.3.3. Creating a source code archive for a sample C program Copy linkLink copied to clipboard!
The cello project is a Hello World
file in C.
The following example contains only the cello.c
and the Makefile
files. Therefore, the resulting tar.gz
archive has two files in addition to the LICENSE
file.
The patch
file is not distributed in the archive with the program. The RPM package manager applies the patch when the RPM is built. The patch will be placed into the ~/rpmbuild/SOURCES/
directory together with the tar.gz
archive.
Prerequisites
-
Assume that the
1.0
version of thecello
program is used. -
You created a
LICENSE
file. For instructions, see Creating a LICENSE file.
Procedure
Move all required files into a single directory:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Create the archive for distribution:
tar -cvzf cello-1.0.tar.gz cello-1.0
$ tar -cvzf cello-1.0.tar.gz cello-1.0 cello-1.0/ cello-1.0/Makefile cello-1.0/cello.c cello-1.0/LICENSE
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Move the created archive to the
~/rpmbuild/SOURCES/
directory, which is the default directory where therpmbuild
command stores the files for building packages:mv cello-1.0.tar.gz ~/rpmbuild/SOURCES/
$ mv cello-1.0.tar.gz ~/rpmbuild/SOURCES/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow