Directrices de Empaquetamiento Fedora

Este documento describe las políticas actuales para empaquetar programas y bibliotecas Ada para Fedora. Estas son enmiendas específicas de Ada a las pautas de empaquetado genéricas. Los paquetes de Ada también deben ajustarse al enlace:../[Directrices de empaquetado] y al enlace:../ReviewGuidelines/[Directrices de revisión].

Compilación

  • El código Ada en Fedora DEBE compilarse usando GNAT, el compilador Ada por defecto en Fedora. Todos los paquetes que contengan código Ada DEBEN tener “BuildRequires: gcc-gnat” para asegurar que el compilador está disponible.

  • Las herramientas GNAT suelen invocarse a través del constructor GPRbuild, por lo que los paquetes Ada suelen necesitar “BuildRequires: gprbuild”.

  • Hay un número de macros RPM que contienen las banderas estándar del compilador y enlazador de Fedora adaptadas para GNAT. La macro apropiada DEBE ser usada en la etapa de construcción. La macro adecuada depende de las herramientas de compilación que utilice el paquete.

    • Para paquetes que se construyen con GPRbuild o Gnatmake pero sin Comfignat existen las macros <var>GPRbuild_flags y <var>Gnatmake_flags, que contienen banderas del constructor, compilador y enlazador.

    • En caso de que el sistema de construcción de un paquete invoque las herramientas GNAT subyacentes sin usar GPRbuild o Gnatmake, entonces DEBE usarse la macro apropiada para cada herramienta. Si por ejemplo Gnatlink es invocado directamente, entonces se le pasará la expansión de <var>Gnatlink_flags.

    • Para paquetes cuyos sistemas de compilación usan Comfignat existe la macro <var>Comfignat_make. Se expande a una orden Make con los valores apropiados para las variables de configuración de Comfignat, incluyendo las banderas del constructor, compilador y enlazador, las variables de directorio y el proyecto de directorios. Úsalo solo para construir el objetivo por defecto:

      %build
      %{Comfignat_make}

      En caso necesario, se puede añadir un objetivo diferente y/o variables adicionales:

      %{Comfignat_make} demo_programs atomic_doodads=true

      Para la etapa de instalación de paquetes que utilizan Comfignat, se recomienda la macro <var>make_install (no <var>makeinstall).

  • Las macros <var>GPRbuild_arches y <var>GNAT_arches se expanden a una lista de arquitecturas donde los paquetes GNAT están disponibles en Fedora. Cuando hay necesidad de prevenir intentos de construir un paquete Ada en arquitecturas secundarias donde GNAT no ha sido arrancado, esto DEBE hacerse con “ExclusiveArch: %{GPRbuild_arches}” o “ExclusiveArch: %{GNAT_arches}”.

  • Todos los paquetes que contengan código Ada DEBEN tener “BuildRequires: fedora-gnat-project-common” para asegurar que se definen las macros RPM necesarias.

  • Si el paquete fuente upstream viene con un sistema de compilación, por ejemplo un archivo de proyecto GNAT o makefiles y un script de configuración, entonces probablemente sea mejor usarlo si es posible. Si no, se recomienda que el empaquetador escriba un archivo de proyecto GNAT y use GPRbuild para controlar la compilación.

Trampolines

Una pila ejecutable se ha convertido en un error del enlazador en Fedora. Esto puede afectar a los paquetes Ada porque GCC utiliza trampolines para implementar algunas construcciones del lenguaje. El uso de trampolines por parte del compilador se ha reducido mucho, pero quedan algunos casos. Un caso que se da es cuando un subprograma anidado en Ada se pasa como rutina devolución de invocación a una función escrita en C - lo que significa que la pila ejecutable también está expuesta a código C que puede contener desbordamientos de búfer. En estos casos las opciones son permitir explícitamente una pila ejecutable pasando “-largs -Wl,--no-warn-execstack” a GPRbuild, o reestructurar el código para eliminar la necesidad de trampolines. La mejor opción puede depender de lo expuesto que esté el programa a entradas potencialmente hostiles.

El uso correcto de las macros RPM debería dar lugar a un mensaje de advertencia del compilador que señala en qué parte del código se necesita un trampolín.

Senderos

GPRbuild añade por defecto una ruta de ejecución a los binarios construidos. Las banderas del constructor de Fedora normalmente incluyen una opción para deshabilitar la ruta de ejecución automática. Sin embargo, hay casos en los que sería ventajoso permitir una ruta de ejecución. Las bibliotecas pueden tener conjuntos de pruebas o programas auxiliares que no están instalados pero que se ejecutan durante la compilación y necesitan enlazarse a la biblioteca en el directorio de compilación, y pueden depender de una ruta de ejecución automática para ello. En esos casos, el archivo de especificaciones puede definir una macro llamada <var>GNAT_add_rpath. El constructor podrá entonces añadir una ruta de ejecución en aquellas partes del fichero de especificaciones donde se defina <var>GNAT_add_rpath+</var>.

<var>GNAT_add_rpath no exime a un paquete de las Directrices de empaquetado. La política sobre rutas de ejecución sigue siendo aplicable.

Paquetes de desarrollo

  • Los paquetes de bibliotecas Ada DEBEN tener un subpaquete -devel que contenga todos los archivos necesarios para la compilación del código que utiliza la biblioteca. Esto incluye ficheros de especificación de Ada (*.ads), ficheros de cuerpo de Ada (*.adb), ficheros de información de bibliotecas Ada (*.ali) y ficheros de proyecto GNAT (*.gpr). (No es necesario incluir todos los ficheros de cuerpo. Normalmente sólo se necesitan algunos archivos de cuerpo).

  • El paquete -devel NO DEBE contener makefiles u otros archivos que sólo se utilicen para recompilar la biblioteca.

  • El paquete -devel NO DEBE contener ningún archivo *.o.

Archivos de proyecto GNAT

  • El paquete -devel DEBE contener uno o más archivos de proyecto GNAT para ser importados por otros proyectos que usen la biblioteca.

  • Los archivos de proyecto DEBEN ser independientes de la arquitectura. Esto significa que el mismo fichero de proyecto debe apuntar a bibliotecas en /usr/lib o /usr/lib64 dependiendo de la arquitectura de destino para la que esté compilando el compilador. Esto DEBERÍA hacerse importando el proyecto "directorios" (es decir, el archivo de proyecto directorios.gpr) y utilizando la variable Directorios.Libdir que está definida allí. El valor de Directorios.Libdir+ se establece en "/usr/lib" o "/usr/lib64" dependiendo de la plataforma de hardware.

  • Los archivos de proyecto NO DEBEN contener nombres de directorio codificados, ni absolutos ni relativos; deben obtenerse de alguna fuente. La fuente puede ser un script de configuración generado por Autoconf u otro sistema de construcción. Los ficheros de proyecto que no estén preprocesados por un sistema de construcción DEBERÍAN usar la variable Directorios.Includedir en lugar de "/usr/include".

  • Si se utiliza el proyecto "directorios", el paquete -devel DEBE tener explícitamente “Requiere: fedora-gnat-project-common”.

  • Los archivos de proyecto DEBEN tener un atributo <var>Externally_Built igual a "true".

He aquí un ejemplo del aspecto que puede tener un archivo de proyecto instalado con una biblioteca:

con "directories";
proyecto Ejemplo es
   para Library_Name utilice "ejemplo";
   para Source_Dirs utilice (Directories.Includedir & "/ejemplo");
   para Library_Dir utilice Directories.Libdir;
   para Library_ALI_Dir utilice Directories.Libdir & "/ejemplo";
   para Externally_Built utilice "true";
end Example;

Colocación de archivos

  • Los ficheros fuente de Ada en paquetes -devel (*.ads y *.adb) DEBEN colocarse en el directorio %{_includedir} o en un subdirectorio del mismo. Colocarlos directamente en %{_includedir} puede ser apropiado si hay muy pocos en el paquete y sus nombres incluyen el nombre de la biblioteca. De lo contrario, normalmente deberían colocarse en un subdirectorio, por ejemplo %{_includedir}/%{name}.

  • Los archivos de información de bibliotecas Ada (*.ali) DEBEN colocarse en un subdirectorio de %{_libdir}, por ejemplo %{_libdir}/%{name}.

  • Los archivos de proyectos GNAT (*.gpr) DEBEN colocarse en el directorio %{_GNAT_project_dir} o en un subdirectorio del mismo. Un subdirectorio, por ejemplo %{_GNAT_project_dir}/%{name}, puede ser una buena idea si hay muchos archivos de proyecto en el mismo paquete o si tienen nombres genéricos. De lo contrario, normalmente deberían colocarse directamente en %{_GNAT_project_dir}. El nombre de la biblioteca DEBE incluirse en el nombre de cada archivo de proyecto o en el nombre del subdirectorio donde se colocan los archivos de proyecto.

Los paquetes que utilizan GPRinstall en la fase de instalación pueden utilizar la macro <var>GPRinstall_flags para pasar los nombres de ruta correctos y otros parámetros a GPRinstall.