Richtlinien für Dist-Tags

Die Verwendung des %{?dist}-Tags ist in Fedora zwingend vorgeschrieben.

Dieses Dokument ist als Ergänzung zu Benennungsrichtlinien zu betrachten.

Zweck des Dist-Tags

Das %{?dist}-Tag hat mehrere Verwendungsmöglichkeiten. Ursprünglich diente es dazu, eine einzige Spec-Datei für mehrere Distributionsversionen zu nutzen. Dabei kann es vorkommen, dass BuildRequires: und Requires: für verschiedene Distributionsversionen unterschiedlich sein müssen. Daher erfüllt %{?dist} eine doppelte Funktion:

  • Es unterscheidet mehrere Pakete, die ansonsten die gleiche %{name}-%{version}-%{release} hätten, aber sehr unterschiedliche Abhängigkeiten aufweisen.

  • Es ermöglicht eine bedingte Prüfung in der Spec-Datei, um mit den unterschiedlichen Abhängigkeiten umzugehen.

Muss ich den Dist-Tag verwenden?

Ja. Es ist sehr nützlich, um die korrekte Reihenfolge zwischen den Fedora-Releases beizubehalten, und die Konsistenz der Release-Tags ist für die automatisierten Werkzeuge, die für Massen-Rebuilds verwendet werden, sehr hilfreich.

Verwendung von %{?dist}

Hier die wichtigsten Informationen:

Mögliche Werte für %{dist}

Wenn Sie fedpkg-Befehle wie fedpkg build ausführen, werden die Werte für %{dist} und die zugehörigen Hilfsvariablen automatisch dem Git-Zweig zugewiesen, in dem Sie arbeiten. Sie müssen diese Variablen NICHT in Ihrer Spec-Datei definieren. fedpkg setzt %{?dist} automatisch für Sie.

Zur Veranschaulichung sind hier einige mögliche Werte für %{dist} aufgeführt. Beachten Sie, dass %{?dist} leer bleibt, wenn %{dist} nicht definiert ist. Fedora-Releases verwenden aus historischen Gründen im Tag „fc“ anstelle von „f“.

OS %{?dist} Tag

RHEL 7 (alle Varianten)

.el7

RHEL 8 (alle Varianten)

.el8

RHEL 9 (alle Varianten)

.el9

Fedora 37

.fc37

Fedora 38

.fc38

Fedora 39

.fc39

Entwicklung:

Der Entwicklungszweig erhält den Dist-Tag der nächsten noch unveröffentlichten Hauptversion von Fedora.

Beachten Sie den vorangestellten Punkt in der Definition von %{?dist}. Dieser dient der einfacheren Verwendung im Release-Feld. Diese Definitionen finden Sie in common/branches.

Beachten Sie, dass RHEL-Dist-Tags nur für EPEL-Pakete definiert sind.

%{?dist} im „Release:“-Feld

Das %{?dist}-Tag wird wie folgt in das Release-Feld eingefügt:

Release: 1%{?dist}

Das bedeutet:

Falls %{dist} definiert ist, wird hier dessen Wert einfegügt. Anderenfalls geschieht nichts.

Wenn wir also Folgendes in einer Spec-Datei haben:

Name: logjam
Version: 1.4
Release: 2%{?dist}

Wenn dieses Paket in einem i386-Buildroot in FC 20 erstellt wird, erzeugt es ein rpm mit dem Namen logjam-1.4-2.fc20.i386.rpm.

Beachten Sie, dass %{?dist} niemals in den Feldern „Name“ oder „Version“ oder in %changelog-Einträgen verwendet werden sollte.

Bedingungen

Neben %{?dist} gibt es mehrere vom Bausystem definierte „Hilfsvariablen“. Diese Variablen sind:

%{rhel}: Diese Variable ist nur für Bauvorgänge für Red Hat Enterprise Linux definiert. Falls definiert, wird sie auf die zum Zeitpunkt des Baus vorhandene Versionsnummer von Red Hat Enterprise Linux gesetzt.

%{fedora}: Diese Variable ist nur in Fedora-Bauvorgängen definiert. Falls definiert, wird sie auf die zum Zeitpunkt des Baus vorhandene Fedora-Versionsnummer gesetzt.

%{rhl}: Diese Variable ist nur in Bauvorgängen in Red Hat Linux definiert. Falls definiert, wird sie auf die zum Zeitpunkt des Baus vorhandene Red Hat Linux-Versionsnummer gesetzt.

%{fc#}: Diese Variable ist nur in Fedora-Bauvorgängen definiert. Beispielsweise ist in Fedora 38-Bauvorgängen %{fc38} auf 1 gesetzt.

%{el#}: Diese Variable ist nur in Bauvorgängen in Red Hat Enterprise Linux definiert. Beispielsweise ist in RHEL 7-Bauvorgängen %{el7} auf 1 gesetzt.

Alle diese Variablen haben, sofern definiert, einen rein numerischen Wert. Mit %{dist} und diesen zusätzlichen Variablen können Sie in einer Spec-Datei Bedingungen erstellen, um die Unterschiede zwischen den Distribuutionen zu berücksichtigen.

Hier sind einige Beispiele für die Verwendung dieser Variablen in Bedingungen:

%if 0%{?rhel}
%endif

%if 0%{?fedora} >= 21
%endif

%{?fedora:%global _with_xfce --with-xfce}

%if 0%{?rhel}
%if 0%{?rhl}
%endif
%endif

%if 0%{?rhl}%{?fedora}
%endif

%{?fc20:Requires: foo}
%{?fc21:Requires: bar}
%{?fc22:Requires: baz}

Beachten Sie, dass Sie zum Überprüfen auf eine bestimmte Distributionsfamilie Folgendes verwenden müssen:

%if 0%{?rhel}

und NICHT

%if %{?rhel}

Ohne die zusätzliche 0 würde die Bedingung %if nicht mehr existieren, wenn %{rhel} nicht definiert ist, und das rpm-Paket könnte nicht erstellt werden.

Distributionsspezifische Werte

Ab Fedora 37 sind einige Hilfsmakros definiert, um Paketierern das Schreiben distributionsunabhängiger Spec-Dateien zu erleichtern:

%{dist_vendor}: Der Anbieter der Distribution. Für Fedora ist dies Fedora.

%{dist_name}: Der Name der Distribution. Für Fedora ist dies Fedora Linux.

%{dist_home_url}: Die Adresse der Homepage der Distribution. Für Fedora ist dies https://fedoraproject.org/.

%{dist_bug_report_url}: Die Adresse zum Melden von Fehlern. Für Fedora ist dies https://bugzilla.redhat.com/.

%{dist_debuginfod_url}: Die Adresse, unter der der debuginfod-Server läuft (falls vorhanden). Diese wird in elfutils.spec verwendet. Für Fedora lautet sie https://debuginfod.fedoraproject.org/.

Diese Werte werden über das Paket fedora-release konfiguriert. Von den Downstream-Fedora-Distributionen wird erwartet, dass sie hier ihre distributionsspezifischen Werte angeben.

Dinge, wofür Sie %{?dist} nicht verwenden können

  • Sie dürfen die Variablen für %{dist} (oder eine der zugehörigen Variablen) nicht außer Kraft setzen.

  • Sie dürfen in Ihrer Spec-Datei keinen Wert für %{dist} (oder eine der zugehörigen Variablen) fest kodieren.

  • Sie dürfen in der Spec-Datei kein Dist-Tag fest kodieren: SCHLECHT: Release: 1.fc38 GUT: Release: 1%{?dist}

  • Sie können in %{dist} (oder einer der zugehörigen Variablen) keinerlei Tags einfügen. %{dist} (und die zugehörigen Variablen) dienen AUSSCHLIESSLICH dazu, die Distribution zu definieren, für die ein Paket erstellt wurde.

  • %{?dist} darf niemals in den Feldern „Name“ oder „Version“ verwendet werden, sondern nur im Feld „Release“, und zwar nur wie oben beschrieben.

  • %{fedora}, %{rhel}, %{rhl}, %{fc#}, %{el#} dürfen nie in den Feldern „Name“, „Version“ oder „Release“ verwendet werden.

Häufig gestellte Fragen

Frage: Warum überlasst ihr nicht einfach dem Bausystem (oder dem Paketierer) die Übergabe des Werts für dist an rpm, z.B. rpm --with dist el7? Antwort: Genau das tun wir. Das Fedora-Bausystem definiert die Werte für dist, wenn fedpkg ausgeführt wird.

Frage: Warum ist die Verwendung von %{?dist} obligatorisch? Antwort: Es gibt nur sehr wenige Pakete, die es nicht verwenden. Der ursprüngliche, sehr alte Grund für den Verzicht darauf (die gemeinsame Nutzung großer Datenpakete über verschiedene Fedora-Releases hinweg) ist nicht mehr relevant, da alle Fedora-Releases mit einem anderen Schlüssel signiert sind. Konsistente Release-Tags vereinfachen es den automatisierten Werkzeugen, die diese möglicherweise inkrementieren müssen.