2. Construcción de extensiones en C y C++ en Unix

Empezando por Python 1.4, Python proporciona un ``makefile'' especial para generar makefiles para generar extensiones de carga dinámica e intérpretes a medida. Este fichero especial genera makefiles que reflejan diversas variables del sistema determinadas mediante el programa ``configure'' en el momento de construir el intérprete de Python, para que los que vayan a generar módulos no tenga que volver a proporcionar estos valores. Esto simplifica sobremanera el proceso de generación de extensiones e intérpretes a medida en sistemas Unix.

El makefile especial se distribuye en el fichero Misc/Makefile.pre.in en la distribución de fuentes de Python. El primer paso en la generación de extensiones e intérpretes a medida es copiar este makefile al directorio de desarrollo que contiene los fuentes del módulo de extensión.

El makefile especial, Makefile.pre.in usa metadatos proporcionados por el fichero Setup. El formato del fichero Setup es el mismo que el del fichero Setup (o Setup.in) del directorio Modules/ de la distribución de fuentes de Python. Setup contiene definiciones de variables:

EC=/projects/ExtensionClass

y líneas de descripción del modulo. Puede contener también líneas en blanco y comentarios que empiecen por "#".

Una línea de descripción de módulo incluye un nombre de módulo, ficheros fuente opciones, referencias a variables y otros ficheros de entrada, como bibliotecas o ficheros objeto. Considérese el siguiente ejemplo mínimo:

ExtensionClass ExtensionClass.c

Ésta es la forma más simple de línea de definición de módulo. Define un módulo, ExtensionClass, con un solo fichero fuente, ExtensionClass.c.

Este ejemplo, ligeramente más complejo, utiliza una opción -I para especificar un directorio de ficheros incluidos:

EC=/projects/ExtensionClass
cPersistence cPersistence.c -I$(EC)

Este ejemplo también ilustra el formato de las referencias a variables.

En los sistemas que tienen soporte de enlace dinámico, el fichero Setup debería comenzar por

*shared*

para indicar que los módulos definidos en Setup han de ser generados como módulos de enlace dinámico. Se puede usar una línea que contenga sólo "*static*" para indicar que los módulos que sigan deben compilarse estáticamente.

He aquí un fichero Setup completo para construir el módulo cPersistent:

# Fichero de configuración para generar el módulo cPersistence. 
# Es importante que el texto comience en la primera columna.
*shared*

# Necesitamos la ruta hasta el directorio que contiene los ficheros
# de inclusión de ExtensionClass.
EC=/projects/ExtensionClass
cPersistence cPersistence.c -I$(EC)

Tras crear el fichero Setup, se ejecuta Makefile.pre.in con "boot" como objetivo para generar el makefile:

make -f Makefile.pre.in boot

Con lo que se genera el fichero Makefile. Para generar las extensiones, basta con ejecutar make con el Makefile creado, que se utiliza por omisión:

make

No es necesario volver a ejecutar Makefile.pre.in si cambia Setup. El makefile se reconstruye automáticamente si cambia el fichero Setup.


Subsecciones

Ver Sobre este documento... para obtener información sobre sugerencias.