Paketbaurichtlinien für Ada

Dieses Dokument beschreibt die aktuellen Richtlinien für die Paketierung von Ada-Programmen und -Bibliotheken für Fedora. Es handelt sich um Ada-spezifische Ergänzungen der allgemeinen Paketbaurichtlinien. Ada-Pakete müssen außerdem den Paketbaurichtlinien und den Review-Richtlinien entsprechen.

Kompilierung

  • Ada-Code in Fedora MUSS mit GNAT, dem Standard-Ada-Compiler von Fedora, kompiliert werden. Alle Pakete, die Ada-Code enthalten, MÜSSEN die Zeile BuildRequires: gcc-gnat enthalten, um sicherzustellen, dass der Compiler verfügbar ist.

  • Die GNAT-Werkzeuge werden üblicherweise über den Builder GPRbuild aufgerufen, daher benötigen Ada-Pakete typischerweise BuildRequires: gprbuild.

  • Es gibt mehrere RPM-Makros, die die Standard-Compiler- und Linker-Flags von Fedora für GNAT anpassen. Das passende Makro MUSS während des Bauprozesses verwendet werden. Welches Makro dies ist, hängt von den Bauwerkzeugen des Pakets ab.

    • Für Pakete, die mit GPRbuild oder Gnatmake, aber ohne Comfignat erstellt werden, gibt es die Makros GPRbuild_flags und Gnatmake_flags, die Builder-, Compiler- und Linker-Flags enthalten.

    • Falls das Bausystem eines Pakets die zugrunde liegenden GNAT-Werkzeuge ohne GPRbuild oder Gnatmake aufruft, muss unbedingt das entsprechende Makro für jedes Werkzeug verwendet werden. Wird beispielsweise Gnatlink direkt aufgerufen, muss die Expansion von Gnatlink_flags übergeben werden.

    • Für Pakete, deren Bausysteme Comfignat verwenden, gibt es das Makro Comfignat_make. Es wird zu einem Make-Befehl mit den entsprechenden Werten für die Konfigurationsvariablen von Comfignat erweitert, einschließlich Builder-, Compiler- und Linker-Flags, Verzeichnisvariablen und dem Verzeichnisprojekt. Verwenden Sie es allein, um das Standardziel zu erstellen:

      %build
      %{Comfignat_make}

      Bei Bedarf können ein anderes Ziel und/oder zusätzliche Variablen hinzugefügt werden:

      %{Comfignat_make} demo_programs atomic_doodads=true

      Für die Installationsphase von Comfignat-Paketen wird das Makro make_install (nicht makeinstall) empfohlen.

  • Die Makros GPRbuild_arches und GNAT_arches werden zu einer Liste von Architekturen erweitert, für die GNAT-Pakete in Fedora verfügbar sind. Wenn verhindert werden soll, dass ein Ada-Paket auf sekundären Architekturen erstellt wird, auf denen GNAT nicht initialisiert wurde, MUSS dies mit ExclusiveArch: %{GPRbuild_arches} oder ExclusiveArch: %{GNAT_arches} erfolgen.

  • Alle Pakete, die Ada-Code enthalten, MÜSSEN BuildRequires: fedora-gnat-project-common enthalten, um sicherzustellen, dass die notwendigen RPM-Makros definiert sind.

  • Wenn das Upstream-Quellpaket ein Bausystem enthält, beispielsweise eine GNAT-Projektdatei oder Makefiles und ein Konfigurationsskript, sollte dieses nach Möglichkeit verwendet werden. Andernfalls empfiehlt es sich, dass der Paketierer eine GNAT-Projektdatei erstellt und GPRbuild zur Steuerung der Kompilierung verwendet.

Trampoline

In Fedora führt ein ausführbarer Stack zu einem Linkerfehler. Dies kann Ada-Pakete betreffen, da GCC Trampoline verwendet, um bestimmte Sprachkonstrukte zu implementieren. Der Einsatz von Trampolinen durch den Compiler wurde zwar stark reduziert, aber einige Fälle bestehen weiterhin. Ein solcher Fall tritt auf, wenn ein verschachteltes Unterprogramm in Ada als Callback-Routine an eine in C geschriebene Funktion übergeben wird. Dadurch wird der ausführbare Stack auch für C-Code zugänglich, der möglicherweise Pufferüberläufe enthält. In solchen Fällen besteht die Möglichkeit, einen ausführbaren Stack explizit zuzulassen, indem man -largs -Wl,--no-warn-execstack an GPRbuild übergibt, oder den Code so umzustrukturieren, dass keine Trampoline mehr benötigt werden. Welche Option die beste ist, hängt möglicherweise davon ab, wie stark das Programm potenziell schädlichen Eingaben ausgesetzt ist.

Bei korrekter Verwendung der RPM-Makros sollte eine Warnmeldung des Compilers ausgegeben werden, die darauf hinweist, wo im Code ein Trampolin benötigt wird.

Ausführungspfade

GPRbuild fügt zu den erstellten Binärdateien standardmäßig einen Ausführungspfad hinzu. Die Builder-Flags von Fedora bieten normalerweise eine Option zum Deaktivieren des automatischen Ausführungspfads. Es gibt jedoch Fälle, in denen die Verwendung eines Ausführungspfads vorteilhaft ist. Bibliotheken können Testsuiten oder Hilfsprogramme enthalten, die nicht installiert sind, aber während des Bauprozesses ausgeführt werden und eine Verknüpfung zur Bibliothek im Bauverzeichnis benötigen. Hierfür kann ein automatischer Ausführungspfad erforderlich sein. In diesen Fällen kann die Spec-Datei ein Makro namens GNAT_add_rpath definieren. Der Builder kann dann in den entsprechenden Abschnitten der Spec-Datei, in denen GNAT_add_rpath definiert ist, einen Ausführungspfad hinzufügen.

GNAT_add_rpath befreit ein Paket nicht von den Paketbaurichtlinien. Die Richtlinie zu Laufzeitpfaden gilt weiterhin.

Devel-Pakete

  • Ada-Bibliothekspakete MÜSSEN ein -devel-Teilpaket haben, das alle Dateien enthält, die für die Kompilierung von Code, der die Bibliothek verwendet, erforderlich sind. Dazu gehören Ada-Spezifikationsdateien (.ads), Ada-Body-Dateien (.adb), Ada-Bibliotheksinformationsdateien (.ali) und GNAT-Projektdateien (.gpr). (Es ist nicht erforderlich, alle Body-Dateien einzuschließen. In der Regel werden nur einige benötigt.)

  • Das -devel-Paket DARF KEINE Makefiles oder andere Dateien enthalten, die ausschließlich zum Neukompilieren der Bibliothek verwendet werden.

  • Das -devel-Paket DARF KEINE *.o-Dateien enthalten.

GNAT-Projektdateien

  • Das -devel-Paket MUSS eine oder mehrere GNAT-Projektdateien enthalten, die von anderen Projekten, die die Bibliothek verwenden, importiert werden können.

  • Projektdateien MÜSSEN architekturunabhängig sein. Das bedeutet, dass dieselbe Projektdatei auf Bibliotheken in /usr/lib oder /usr/lib64 verweisen muss, je nachdem, für welche Zielarchitektur der Compiler aktuell kompiliert. Dies SOLLTE durch Importieren des Projekts „directories“ (d. h. der Projektdatei directories.gpr) und Verwendung der dort definierten Variable Directories.Libdir erfolgen. Der Wert von Directories.Libdir wird je nach Hardwareplattform auf „/usr/lib“ oder „/usr/lib64“ gesetzt.

  • Projektdateien DÜRFEN KEINE fest codierten Verzeichnisnamen enthalten, weder absolute noch relative; sie sollten diese aus einer Quelle beziehen. Die Quelle kann ein von Autoconf generiertes Konfigurationsskript oder ein anderes Bausystem sein. Projektdateien, die nicht von einem solchen Bausystem vorverarbeitet werden, SOLLTEN die Variable Directories.Includedir anstelle des fest codierten Pfads „/usr/include“ verwenden.

  • Wenn das Projekt „directories“ verwendet wird, dann MUSS das Paket -devel ein explizites Requires: fedora-gnat-project-common enthalten.

  • Projektdateien MÜSSEN ein Externally_Built-Attribut mit dem Wert „true“ haben.

Hier ist ein Beispiel dafür, wie eine Projektdatei aussehen könnte, die mit einer Bibliothek installiert wurde:

with "directories";
project Example is
   for Library_Name use "example";
   for Source_Dirs use (Directories.Includedir & "/example");
   for Library_Dir use Directories.Libdir;
   for Library_ALI_Dir use Directories.Libdir & "/example";
   for Externally_Built use "true";
end Example;

Dateiplatzierung

  • Ada-Quelldateien in -devel-Paketen (*.ads und *.adb) MÜSSEN im Verzeichnis %{_includedir} oder einem Unterverzeichnis davon abgelegt werden. Die direkte Platzierung in %{_includedir} kann sinnvoll sein, wenn es nur wenige Dateien im Paket gibt und deren Namen den Namen der Bibliothek enthalten. Andernfalls sollten sie üblicherweise in einem Unterverzeichnis abgelegt werden, beispielsweise %{_includedir}/%{name}.

  • Ada-Bibliotheksinformationsdateien (*.ali) MÜSSEN in einem Unterverzeichnis von %{_libdir} abgelegt werden, zum Beispiel %{_libdir}/%{name}.

  • GNAT-Projektdateien (*.gpr) MÜSSEN im Verzeichnis %{_GNAT_project_dir} oder einem Unterverzeichnis davon abgelegt werden. Ein Unterverzeichnis, beispielsweise %{_GNAT_project_dir}/%{name}, ist empfehlenswert, wenn sich viele Projektdateien im selben Paket befinden oder generische Namen haben. Andernfalls sollten sie in der Regel direkt in %{_GNAT_project_dir} abgelegt werden. Der Name der Bibliothek MUSS entweder im Namen jeder Projektdatei oder im Namen des Unterverzeichnisses, in dem sich die Projektdateien befinden, enthalten sein.

Pakete, die GPRinstall in der Installationsphase verwenden, können das Makro GPRinstall_flags verwenden, um die korrekten Pfadnamen und andere Parameter an GPRinstall zu übergeben.