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"])
<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]))
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'])
#define NDEBUG 1 #define HAVE_STRFTIME #undef HAVE_FOO #undef HAVE_BAR