Pautas del Empaquetado en Ada

Este documento describe las directivas 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 Pautas de Empaquetado y al Pautas 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 ser invocadas 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 los indicadores estándar del compilador y enlazador de Fedora adaptadas para GNAT. La macro apropiada DEBE ser usada en la etapa de compilación. La macro adecuada depende de las herramientas de compilación que utilice el paquete.

    • Para paquetes que se construyan con GPRbuild o Gnatmake pero sin Comfignat existen las macros GPRbuild_flags y Gnatmake_flags, la cual 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 Gnatlink_flags.

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

      %build
      %{Comfignat_make}

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

      %{Comfignat_make} demo_programs atomic_doodads=true

      Para la etapa de instalación de paquetes que utilizan Comfignat, la macro make_install (no makeinstall) es recomendada.

  • Las macros GPRbuild_arches y 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 de Ada en arquitecturas secundarias donde GNAT no ha sido arrancado, esto DEBE ser hecho con “ExclusiveArch: %{GPRbuild_arches}” o con “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 tampón. 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.

Rutas de ejecución

GPRbuild añade por defecto una ruta de ejecución a los binarios construidos. Los indicadores 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 GNAT_add_rpath. El constructor podrá entonces añadir una ruta de ejecución en aquellas partes del fichero de especificaciones donde se defina GNAT_add_rpath.

GNAT_add_rpath no exime a un paquete de las Directrices de empaquetado. La directiva 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), archivos de cuerpo de Ada (*.adb), archivos de información de bibliotecas Ada (*.ali) y archivos de proyecto GNAT (*.gpr). (No es necesario incluir todos los archivos de cuerpo. Típicamente 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 archivo 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 se HARÍA importando el proyecto “directorios” (es decir, el archivo de proyecto directorios.gpr) y utilizando la variable Directories.Libdir el cual está definida allí. El valor de Directories.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; los obtendrían de alguna fuente. La fuente puede ser un script de configuración generado por Autoconf u otro sistema de construcción. Los archivos de proyecto que no estén preprocesados por un sistema de construcción UTILIZARÍAN la variable Directories.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 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 Ejemplo;

Lugar del archivo

  • Los archivos 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}/%{nombre}.

  • 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 GPRinstall_flags para pasar los nombres de ruta correctos y otros parámetros a GPRinstall.