Paketbaurichtlinien für C und C++

Einführung

Die Programmiersprachen C und C++ sowie deren Laufzeitumgebungen gehören zu den gängigsten Entwicklungsframeworks für Pakete in Fedora. Daher gibt es große Unterschiede hinsichtlich Qualität, Stil und Konventionen in den jeweiligen Paketen. Das folgende Dokument zeigt Ihnen bewährte Vorgehensweisen für bestimmte Aspekte der Paketierung von C- und C++-Paketen.

Paketierung

BuildRequires und Requires

Wenn Ihre Anwendung in C oder C++ geschrieben ist, müssen Sie in BuildRequires die Pakete gcc, gcc-c++ oder clang angeben. Diese Pakete enthalten alles, was zum Erstellen einer standardkonformen C- oder C++-Anwendung benötigt wird.

Wenn Ihre Bibliothek Standard-C- oder C++-Header enthält, müssen Sie BuildRequires für gcc, gcc-c++ oder clang auflisten, um die benötigten standardkonformen Header zu installieren.

Wenn Sie zur Laufzeit cpp verwenden, um C- oder C++-Sprachheader zu verarbeiten, müssen Sie Requires für gcc, gcc-c++ oder clang verwenden, um die benötigten Header für eine standardkonforme C- oder C++-Anwendung zu installieren. Dies könnte sich in Zukunft ändern, falls spezielle Anbieter wie z.B. c-headers oder c++-headers einen Satz standardkonformer C- oder C++-Sprachheader bereitstellen.

Wenn Sie zur Laufzeit cpp verwenden, um C- oder C++-Sprachheader zu verarbeiten, müssen Sie BuildRequires oder Requires für gcc, gcc-c++ oder clang verwenden, um den benötigten Header für eine standardkonforme C- oder C++-Anwendung zu installieren. Dies könnte sich in Zukunft ändern, falls spezielle Anbieter wie z.B. c-headers oder c++-headers einen Satz standardkonformer C- oder C++-Sprachheader bereitstellen.

Eine Liste der unterstützten Compiler für C und C++ finden Sie in den Compiler-Richtlinien.

Fragen und Antworten zur Paketierung

  1. Benötige ich Requires: glibc, um sicherzustellen, dass die C-Laufzeitumgebung für meine Anwendung installiert ist?

    Nein. RPM ermittelt automatisch die benötigten ELF-Bibliotheken anhand der Binärdateien in Ihrem Paket. Dies reicht für die Installation von glibc aus.

  2. Benötige ich Requires: libgcc?

    Wenn Sie eine API von libgcc direkt verwenden, benötigen Sie die Zeile Requires: libgcc. Im Allgemeinen benötigt glibc jedoch libgcc, daher ist es immer installiert.

Bibliotheken

Bibliotheken sollten eindeutige Shared-Object-Namen (SONAMEs über -Wl,-soname=libfoo.so) besitzen, die nicht mit anderen in der Distribution verwendeten Bibliotheks-SONAMEs kollidieren. Beispielsweise sollte es nur eine libfoo.so in der Distribution geben. Eine Ausnahme besteht, wenn mehrere Implementierungen derselben Bibliothek libfoo.so von verschiedenen Autoren bereitgestellt werden und diese miteinander in Konflikt stehen. In diesem Fall müssen beide libfoo.so exakt dieselbe Schnittstelle, jedoch mit unterschiedlicher Implementierung, bereitstellen. Zwei libfoo.so mit jeweils unterschiedlicher API zu verwenden, ist schlechte Praxis und erschwert das Paketieren und Verteilen.

Versionierte Symbole

Ohne versionierte Symbole generiert RPM einen Abhängigkeitsausdruck, der die Bibliothek zwar benennt, aber keine Version angibt. Dadurch wird effektiv „$Major.0.0“ als Mindestversion festgelegt. Versionierte Symbole liefern die notwendigen Informationen, um sicherzustellen, dass Bibliotheken tatsächlich aktuell genug sind, um die Software auszuführen, die mit ihnen verlinkt ist.

Paketbetreuer werden dazu angehalten, mit den Upstream-Projekten zusammenzuarbeiten, um versionierte Symbole zu Bibliotheken hinzuzufügen, die diese noch nicht enthalten.

Siehe Versionierte Symbole für weitere Informationen.

Anwendungen

Derzeit gibt es keine zusätzlichen Vorschläge für Anwendungen.