3.3.3 Opciones del preprocesador

Hay tres argumentos opcionales de Extension que resultarán prácticos si hay que incluir directorios de búsqueda o macros del preprocesador para definir/indefinir: include_dirs, define_macros y undef_macros.

Por ejemplo, si la extensión necesita ficheros de cabecera en el directorio include de la raíz de la instalación, usa la opción include_dirs:

Extension("foo", ["foo.c"], include_dirs=["include"])

Es posible especificar directorios absolutos. Si te consta que la extensión sólo se va a compilar en sistemas Unix con X11R6 instalado en /usr, vale con poner

Extension("foo", ["foo.c"], include_dirs=["/usr/include/X11"])
Se debe evitar este tipo de uso no-portable si esperar distribuir el código. Sería mejor incluir (p. ej.) <X11/Xlib.h>.

Si hay que incluir cabeceras de otra extensión de Python, puedes aprovecharte de que las Distutils instalan las cabeceras de Python de manera consistente. Por ejemplo, las cabeceras de Numerical Python están instaladas (en una instalación estándar de Unix) en /usr/local/include/python1.5/Numerical (la ubicación exacta dependerá de la plataforma y de la instalación de Python). Como el directorio de cabeceras C de Python --/usr/local/include/python1.5 en este caso-- siempre está incluido en el camino de búsqueda al compilar extensiones de Python, lo mejor es incluir (para este ejemplo) <Numerical/arrayobject.h>. Si te empeñas en poner el directorio Numerical en tu camino de búsqueda de cabeceras, puedes encontrar el directorio usando el módulo sysconfig de las Distutils:

from distutils.sysconfig import get_python_inc
incdir = os.path.join(get_python_inc(plat_specific=1), "Numerical")
setup(...,
      Extension(..., include_dirs=[incdir]))
Aunque esto resulte bastante portable (funcionará en cualquier instalación de de Python, independientemente de la plataforma) es probable que resulte más sencillo escribir el código C de una manera más coherente.

Se pueden definir e indefinir macros del preprocesador con las opciones define_macros y undef_macros. define_macros toma una lista de tuplas (name, value), donde name es el nombre de la macro para definir (una cadena) y value es su valor: una cadena o None. Definir una macro FOO a None equivale a una línea #define FOO el el fuente C. La mayoría de los compiladores pondrán FOO al valor cadena 1.) undef_macros es una lista de macros a indefinir.

Por ejemplo:

Extension(...,
          define_macros=[('NDEBUG', '1')],
                         ('HAVE_STRFTIME', None),
          undef_macros=['HAVE_FOO', 'HAVE_BAR'])
equivale a poner esto al principio de cada fichero fuente C:
#define NDEBUG 1
#define HAVE_STRFTIME
#undef HAVE_FOO
#undef HAVE_BAR


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