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.
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) |
|
RHEL 8 (alle Varianten) |
|
RHEL 9 (alle Varianten) |
|
Fedora 37 |
|
Fedora 38 |
|
Fedora 39 |
|
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.
Want to help? Learn how to contribute to Fedora Docs ›