LFS-RPM/03-Repository-Macro.md
YellowJacketLinux d546244605 typo fix
2023-05-05 12:40:11 -07:00

4.4 KiB

The %{?repo} Macro

Most (but not all) RPM spec files will have a Release tag that contains the following:

Release:      %{?repo}N%{?dist}

where N is usually either a positive integer or is of the form 0.rcM or 0.devM where M is a positive integer.

The idea behind this added complexity to the Release tag is so that different repositories can exist that have duplicate packages sometimes even built from the same RPM spec file but with different capabilities.

These repositories can then have a hierarchical repo macro so that as long as the Version is the same, the repository with the greater repo tag will always resolve as the newer package to RPM.

This can help avoid things like GNU Emacs linked against X11 from being replaced by a GNU Emacs package that is not linked against X11 just because a “lower-level” package repository rebuilt GNU Emacs with a larger N than the “higher-level” package repository uses.

There are some exceptions, packages that do not have %{?repo} in the Release tag. For example, glibc and kernel-api-headers should never be replaced by packages in a “higher-level” package repository so those packages simply do not use the %{?repo} macro within their Release tag.

Spec files MUST build when the %{?repo} macro is not defined, as it is not a standard RPM macro. When defined, it should be defined by the build system for the repository, or a user can define it within their ~/.rpmmacros file or at package build time.

The %{?repo} macro must start with a non-negative integer, followed by a dot, followed by a code for the package repository.

Planned Package Repositories

The following list of %{?repo} tags is what I plan to use. Note that because the %{?repo} tag comes first but may not be defined, it MUST end in a . when it is defined.

1.core.
The core of YJL. Basically LFS plus enough for RPM and basic system usage including a text browser, e-mail client, SSH server/client, GPM mouse support, NTPD client, and fcron support. I likely will add a console-based game.
2.cli.
Programs and libraries that do not need a graphical user interface, including the rebuild of some packages from the 1.core repository.
2.py2.
Python2 and modules for Python2. This repository will not be active by default.
3.gui.
Programs and libraries intended to support a Graphical Desktop Environment, including the rebuild of some packages from the 1.core and 2.cli repositories.
4.apps.
Graphical programs that require a Graphical Desktop Environment but are not part of a specific Desktop Environment. For example, Firefox and Thunderbird.
4.cpan.
Perl 5 modules from CPAN that are of interest to Perl programmers and students but are not specifically needed by any programs in YJL.
4.pypi.
Python 3 modules from PyPi that are of interest to Python programmers and students but are not specifically needed by any programs in YJL.
5.mate.
The MATE Graphical Desktop Environment.
5.xfce.
The Xfce Graphical Desktop Environment.

It is not a perfect system, but just like taxonomy in biology, I do not think there ever truly could be a perfect system.

One thing that is specifically part of the design---this system is too allow third party repositories that want to use YJL as a base but build package their own way.

For example, my personal philosophy is to use GnuTLS as the system TLS library and use LibreSSL when a TLS software package has not been ported to GnuTLS---only using OpenSSL when specific library features of OpenSSL that are not in GnuTLS are needed.

Someone with a different philosophy can simply make a 5.openssl repository that replaces packages in YJL with the equivalent versions but built against OpenSSL. This could be important if, say, FIPS compliance is mandatory.

Multiple Repository Notes

Some packages may have spec files that can build for multiple package repositories dependent upon what %{repo} evaluates to.

In such cases, the spec file should build for the reasonable default without internally defining the macro.

Spec File ChangeLog Notes

In an RPM Spec File %changelog section, both the %{?repo} and the %{?dist} tags should be omitted from the version-release portion of the changelog because a package should always be buildable without those macros defined.