Annotated spec file

# A spec file contains a number of sections, in a specific order,
# each of which contains tags and/or data.  Comments and blank lines
# are ignored.  Tags are of the form "name:value".  The names of
# tags are not case-sensitive; white-space around the colon is optional.

# The values can include macros of the form %%{name} (macros are expanded
# even in comments, so the percent must be escaped by using "%%";
# macros only use a single percent symbol).  If you wish to use a
# macro only if it is defined, use %%{?name}.  Many macros are predefined,
# and additional ones can be defined in ~/.rpmmacros or by using the
# %%global (preferred) or %%define tags.
# See http://fedoraproject.org/wiki/Packaging/RPMMacros for more info.
# See https://fedoraproject.org/wiki/Packaging:Guidelines#Tags_and_Sections
# For guidelines on packaging and spec file contents.
# Also see https://rpm-packaging-guide.github.io/#what-is-a-spec-file

# The required name tag should match the name of the software.
# The name (on the right of the colon) cannot contain any whitespace.

Name:           foo

# The required version tag should match the developer's version number,
# usually this uses the major.minor.build scheme but doesn't have to.
# Note the value of this tag can't contain any dashes.

Version:        1.2.3

# The required release is typically a single number provided by the packager.
# It often indicates what patch level (of the packager) has been applied.

Release:        1%{?dist}

# The optional Epoch tag provides an ordering for the version
# numbers (replacing the deprecated Serial tag). Use this tag
# if RPM cannot figure out the ordering of which release comes
# after another, just by examining version numbers.  (This can happen
# because the version and release numbers are unrelated.)  Hopefully
# you won't need this tag:

Epoch:          1

# Next is a bunch of required tags that are fairly obvious in meaning:

Summary:        required one-line description of package, should not end in a period

License:        name of (and optionally the URL to) the license, e.g., "GPLv2"
URL:            URL_to_package_home
Distribution:   Linux_or_product_distribution_this_package_is_for

# These are optional.  Vendor is set automatically by the build system,
# and Packager should be set in your ~/.rpmmacros file instead:
Vendor:         name_of_vendor deprecated - don't use
Packager:       John Q. Smith <john.smith@example.com> deprecated - don't use

# The optional Group tag is used to place this package in some yum group.
# The list of groups is found by running the command
#   rpm -qa --qf '%{group}\n' | sort -u  deprecated - don't use

Group:          Unspecified

# The optional Icon tag says what icon to display on a GUI desktop for
# this RPM file.

Icon:           filename-without-extension
# or:
#Icon:    /full/path/to/icon/filename-including-extension
# (The first way is preferred as it allows for theming.)

# The optional BuildArch (and the related ExcludeArch) is for architecture
# dependent RPMs.  The following says this is independent ("noarch"), which
# you might use for shell or other scripts:

BuildArch:     noarch

# Normally RPM determines the software provided and required when building
# a package; it examines all executable programs and libraries being
# packaged, analyzes them to determine their shared library requirements as
# well as interpreters required (such as "bash"), and any required modules
# for all Perl scripts and modules being packaged.  Also, the soname of
# each shared library being packaged is automatically added to the
# package's list of "provides" information.  However, there is optional
# Provides and Requires tags. Provides is used to specify a "virtual package" that
# the packaged software makes available when it is installed.  Normally,
# this tag would be used when different packages provide equivalent services.
# For example:
#  Provides:   mta

# The optional Requires tag refer to the name of another package, or
# to a virtual package.  Version comparisons may also be included by
# following the package name with <, >, =, <=, or >=, and
# a version (optionally with release and epoch).  For example:

Requires:       mcrypt >= 2.6.8

# RPM does not determine automatically other packages needed to build this
# package, so you need to specify all packages in a comma separated list
# for the BuildRequires tag.  (The most commonly used stuff, gcc, bash, awk,
# etc is assumed and you don't need to list that.  To find missing required
# packages, install and use "mock" (http://fedoraproject.org/wiki/Extras/MockTricks)
# or "mach".

# The "conflicts" tag is used to specify what packages cannot be installed
# if the current package is to operate properly, using the same syntax as
# for the Requires tag ("epoch:version-release").

# The optional "prefix" tag is used when a relocatable package is to be built.
# It specifies the leading part of the absolute pathnames listed elsewhere,
# that can be replaced with the "--prefex=" rpm option.  If this tag is
# not present then the package is not relocatable.  You can have multiple
# prefix tag, such as for /etc, /usr/share/man, etc.

Prefix: /usr/bin

# (Note:  In Fedora, the use of relocatable packages is strongly discouraged.
# It is difficult to make work properly, impossible to use from yum, and
# not generally necessary if other packaging guidelines are followed.)

# The required Source tag indicates the name of the source file used to build
# the RPM.  It is usually a URL, but only the name following the final
# slash is used; that file is under the SOURCES directory.
# A spec file may contain more than one source tag, each with a number
# such as "source1", "source2", ...  ("source" is the same as "source0".)

Source: ftp://example.com/foo/src/foo-1.2.3.tar.gz

# Similar to the source tag, the optional Patch tag(s) list(s) any patch files
# that should be applied to the source files.

# (See below for the modern replacement for Source and Patch tags.)

# RPM needs a location to put the compiled files before they can
# be bundled into an RPM package.  This is called the "build root".
# The vim spec file template includes and overrides the default
# location, but I don't recommend using anything but the default, so
# you should remove or comment out this optional line if vim created your spec:

#BuildRoot:  %%(mktemp -ud %%{_tmppath}/%%{name}-%%{version}-%%{release}-XXXXXX)

# You should also include a longer description section,
# marked by %%description on a line by itself, and ending with
# the next section marker.  (Don't have lines in the description
# that look like tags or section names!  As with comments, double up
# any percent symbols.)

%description
In the description section, blank lines indicate paragraphs.
Lines that start with a space are not wrapped/filled.

# Following the (global) directives are the script sections.  Each
# starts with a keyword beginning with a percent symbol.

# Instead of the Source (and Patch) directive in the preamble section, you can
# (since RPM 4.15) list sources (and patches) in their own sections.
# The Patchlist is a list of patch files found in the SOURCES directory.
# These are source code patches and will be applied in the
# order listed, before building the software.  These no longer need to be URLs:

%sourcelist
foo-1.2.3.tar.gz

%patchlist
someniftypatch-1.16.1.patch

# The required Prep script creates the build root directory, unpacks the source
# into that directory, applies any patches to the source, and does any
# other prep steps needed (usually none, but this might include creating
# users, directories, or even a database).  Usually you just need to do
# standard stuff, and the "%%setup" (and "%%patch") built-in macros do that
# (The "-q" means show minimal output):

%prep
%setup -q
%patch              Omit if no patches, of course

# The required Build script includes the steps needed to build the software.
# Usually this is just "./configure" (you can use the built-in "%%configure"
# macro for that, which will also setup various environment variables used
# by the Gnu configure script), possibly with configure options, followed
# by "make" (including any make options, such as "-j2"; in the command
# below, a macro is used to include that option if the macro is defined):

%build
%configure
make %{?_smp_mflags}

# The required Install script first cleans up the build root and then
# installs the software there (so it can easily be bundled into the RPM
# we will create):

%install
rm -rf $RPM_BUILD_ROOT
make install DESTDIR=$RPM_BUILD_ROOT

# Finally you need to define the script to run after the RPM has been
# built, to clean up any leftover files:

%clean
rm -rf $RPM_BUILD_ROOT

# You can define four optional additional scripts, that get copied into
# the RPM.  These are the pre- and post- install scripts, and the
# pre- and post- remove scripts.  You rarely need to add these, but
# the post script is the most often used: to run chkconfig and to start
# the new service, for example.  These should not be interactive:
#
# %%pre
# %%post
# %%preun
# %%postun

# The required files section defines all the files that go into the RPM.
# These should be absolute pathnames (but will be relative to the buildroot).
# This section contains some optional directives that can be used to
# describe the file's type or set owner/group/modes.  In addition to
# listing individual files you can use shell-style wild-cards (globs)
# and list whole directories:

%files

# First set the defaults for all the files listed.  The four values are
# the file permissions, the owner, the group, and the directory permissions.
# Use a dash if you just want the default (determined by the install step,
# such as a chmod command done as part of the "make install"):

%defattr(0755,root,root,-)

# Next you list the files.  To install one with non-default attributes,
# use the "attr" tag as shown below.
/usr/bin/foo
/usr/lib/libfoo.so

# You should list man pages and any package documentation files you
# want to install too.  But these should be marked as documentation
# files.  By default certain directories are assumed to be documentation
# so you could just list those files or directories (/usr/share/doc,
# /usr/share/man, and /usr/share/info).
#
# As a special case, file names (without a leading slash) that are
# in the build root should normally not be installed in "/"!  If
# you list such a filename, then RPM will install it into a default
# documentation directory, /usr/share/doc/<packagename>-<version>.
# Notice how two directives are used together and how many files can be listed
# in one line:

%attr(0644,root,root) %doc /usr/share/man/man1/foo.1.gz
%attr(0644,root,root) %doc README NEWS LICENSE CREDITS

# Similar to the doc directive is the %%config directive.  This takes
# some options to control the over-writing of existing config files:
#  %%config(noreplace) - don't over-write an existing file that was
#                        modifed from the original version (you get
#                        a whatever.rpmnew file instead).  Without the
#                        noreplace option, a changed file will be saved
#                        as whatever.rpmsave before the new file is writen.
#  %%config(missingok) - Use this for config files that don't exist
#                        (created later, possibly in the "post' script),
#                        but need to be removed when the package is.

%attr(0644,root,root) %config /etc/foo.conf

# Not shown here, but you can also use the "lang" tag to mark some file
# as needing installation only for that language:
#  %%lang(fr) %%{_datadir}/locale/fr/LC_MESSAGES/foo* 

# When the RPM package has had a significant change (used new version of
# the source, changed various options, etc.), you should add an entry to
# the RPM's change log (at the top).  This is done in the last optional
# section, and usually looks like the following:

%changelog
 * Fri Jun 24 2016 Wayne Pollock <wpollock@example.com>
- Downloaded version 1.4, applied patches
* Tue May 08 2001 Peter Tosh <tosh@reggae.com> 1.3-1
- updated to 1.3