3.3. Organización del código según la plataforma

En la sección Distribución de los ficheros se ha explicado por encima los directorios y ficheros de pDI-Tools. En esta sección entraremos en detalles sobre la organización de directorios del código fuente y sus ficheros.

Aunque la distribución del código fuente de pDI-Tools se ve claramente influenciada por las herramientas Autoconf y Automake, en realidad esta distribución está marcada por el objetivo de la portabilidad.

La primera decisión tomada es sobre la longitud de los nombres de ficheros. Esta aplicación no está pensada para sistemas MS-DOS, por lo tanto no se establece la dura limitación de nombres de fichero de 8 carácteres. No obstante no todos los sistemas operativos Unix™ son tremendamente generosos en este aspecto. Aún podemos encontrar sistemas donde exista una limitación de 32 carácteres en el nombre de archivo. Por ello siempre se procura usar nombres de ficheros de menos de 16 carácteres para garantizar que no habrán problemas

Por último siempre se escriben los nombres de archivo en minúscula. Sólo existirá la excepción de los ficheros con la extensión .S (fichero en ensamblador que debe ser procesado por el preprocesador de C).

El código fuente se distribuye en dos directorios principales: el directorio ./include/ y el directorio ./src/.

En las dos siguientes secciones comentamos cada uno de estos directorios. El primero, ./include/ se comenta en la sección "Ficheros de cabecera de pDI-Tools" y el otro, ./src/, en la sección "Código fuente de pDI-Tools".

3.3.1. Ficheros de cabecera de pDI-Tools

El directorio ./include/ contiene todos los archivos de cabecera que se instalarán en el sistema para poder desarrollar "backends" y aplicaciones que usen la API ofrecida por pDI-Tools.

Este directorio a su vez contiene otros directorios. Estos directorios contienen ficheros de cabecera específicos para determinados sistemas operativos. Por ejemplo tendremos el directorio ./include/linux/, ./include/solaris/, etc.

Los ficheros específicos de una arquitectura nunca deben usarse directamente, sino a través de ficheros de cabecera no dependientes de la arquitectura. De hecho los ficheros de estos subdirectorios están para complementar los ficheros de cabecera en el directorio ./include/.

Los principales ficheros del directorio ./include/ son los siguientes:

Dentro de un directorio específico a una arquitectura encontramos fundamentalmente dos ficheros imprescindibles: types.h y exports.h.

El primero, types.h, declara todas las constantes y estructuras de datos específicas para la arquitectura.

El segundo, exports.h, exporta todas las funciones dependientes de la arquitectura que pDI-Tools requiere para completar su cometido. Además le asigna a cada función un alias para poder referirnos a ellas de forma única desde el código portable. Por ejemplo, a la función de GNU/Linux _pdi_linux_initObjectList() y a la función de Irix _pdi_irix_initObjectList() se les asigna el mismo alias: _pdi_arch_initObjectList().

Como los ficheros contenidos en el directorio ./include/ son esenciales para poder seguir desarrollando una vez instalada la aplicación, los ficheros contenidos en él también son instalados.

No obstante, respecto a los ficheros de cabecera sólo se instalarán los ficheros específicos para el sistema operativo que hemos compilado. Es decir, si estamos instalando una versión de pDI-Tools para Solaris no se instalarán los ficheros de cabecera para GNU/Linux.

3.3.2. Código fuente de pDI-Tools

El directorio ./src/ contiene tanto ficheros de código como de cabecera que son necesarios para construir los binarios de pDI-Tools. No obstante este código sólo es necesario para construir los binarios de pDI-Tools, no para programar luego sobre el mismo.

Así aislamos en ./src/ todo el código fuente que no intervendrá en la instalación.

En este directorio nos encontramos un directorio por cada binario que se vaya a crear, a parte de un directorio especial tests/ donde encontramos programas que testean el buen funcionamiento de los componentes de pDI-Tools.

El directorio más importante es ./src/link/ que genera la librería libpdi.so que implementa el mecanismo de interposición de código.

Dentro de ./src/link/ encontramos fundamentalmente dos tipos de elementos: ficheros de código C y subdirectorios con más código en C y ensamblador.

En el primer nivel (directamente dentro de ./src/link/ encontramos todo el código independiente de la arquitectura, y por lo tanto común para todos los sistemas.

En cambio los subdirectorios reciben el nombre de la plataforma a la cual va destinado el código que contienen. Así encontramos directorios como linux/, solaris/, etc.

Los ficheros de código de estos directorios van precedidos todos por un prefijo de dos letras y un guión. En GNU/Linux el prefijo es lx-, en Irix es ix-, etc.

Este prefijo nos permite ver rápidamente a que arquitectura pertenece un fichero (si depende de la arquitectura) y además evita colisiones de nombres con ficheros de otras arquitecturas. Esto simplifica el control de versiones y les da un nombre único a cada fichero, al menos dentro de la misma aplicación. Esto último muy práctico a la hora de imprimir mensajes de log y/o depuración.