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 Build-Systeme 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.

Trampolines

In Fedora führt ein ausführbarer Stack zu einem Linkerfehler. Dies kann Ada-Pakete betreffen, da GCC Trampolines verwendet, um bestimmte Sprachkonstrukte zu implementieren. Der Einsatz von Trampolines 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 Trampolines 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.

Correct usage of the RPM macros should result in a warning message from the compiler that points out where in the code a trampoline is needed.

Runpaths

GPRbuild adds a runpath to the built binaries by default. Fedora’s builder flags normally include an option to disable the automatic runpath. There are however cases where it would be advantageous to allow a runpath. Libraries can have test suites or auxiliary programs that aren’t installed but run during the build and need to link to the library in the build directory, and they may rely on an automatic runpath for this. In those cases the spec file may define a macro named GNAT_add_rpath. The builder will then be allowed to add a runpath in those parts of the spec file where GNAT_add_rpath is defined.

GNAT_add_rpath does not exempt a package from the Packaging Guidelines. The policy on runpaths still applies.

Devel-Pakete

  • Ada library packages MUST have a -devel subpackage containing all the files that are necessary for compilation of code that uses the library. This includes Ada specification files (*.ads), Ada body files (*.adb), Ada library information files (*.ali) and GNAT project files (*.gpr). (There is no requirement to include all body files. Typically only some body files are needed.)

  • The -devel package MUST NOT contain any makefiles or other files that are only used for recompiling the library.

  • 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.

  • Project files MUST be architecture-independent. This means that the same project file must point to libraries in /usr/lib or /usr/lib64 depending on what target architecture the compiler is currently compiling for. This SHOULD be done by importing the “directories” project (that is, the project file directories.gpr) and using the variable Directories.Libdir which is defined there. The value of Directories.Libdir is set to either “/usr/lib” or “/usr/lib64” depending on the hardware platform.

  • Project files MUST NOT contain hard-coded directory names, neither absolute nor relative; they should get them from some source. The source may be an Autoconf-generated configuration script or other build system. Project files that aren’t pre-processed by such a build system SHOULD use the variable Directories.Includedir rather than a hard-coded “/usr/include”.

  • If the “directories” project is used, then the -devel package MUST have an explicit “Requires: fedora-gnat-project-common”.

  • Project files MUST have an Externally_Built attribute equal to “true”.

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 source files in -devel packages (*.ads and *.adb) MUST be placed in the %{_includedir} directory or a subdirectory thereof. Placing them directly in %{_includedir} may be appropriate if there are very few of them in the package and their names include the name of the library. Otherwise they should usually be placed in a subdirectory, for example %{_includedir}/%{name}.

  • Ada library information files (*.ali) MUST be placed in a subdirectory of %{_libdir}, for example %{_libdir}/%{name}.

  • GNAT projects files (*.gpr) MUST be placed in the %{_GNAT_project_dir} directory or a subdirectory thereof. A subdirectory, for example %{_GNAT_project_dir}/%{name}, may be a good idea if there are lots of project files in the same package or if they have generic names. Otherwise they should usually be placed directly in %{_GNAT_project_dir}. The name of the library MUST be included either in the name of each project file or in the name of the subdirectory where the project files are placed.

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.