Three optional arguments to Extension will help if you need to
specify include directories to search or preprocessor macros to
define/undefine: include_dirs, define_macros, and
undef_macros.
For example, if your extension requires header files in the
include directory under your distribution root, use the
include_dirs option:
Extension("foo", ["foo.c"], include_dirs=["include"])
You can specify absolute directories there; if you know that your extension will only be built on Unix systems with X11R6 installed to /usr, you can get away with
Extension("foo", ["foo.c"], include_dirs=["/usr/include/X11"])
<X11/Xlib.h>.
If you need to include header files from some other Python extension,
you can take advantage of the fact that the Distutils install extension
header files in a consistent way. For example, the Numerical Python
header files are installed (on a standard Unix installation) to
/usr/local/include/python1.5/Numerical. (The exact location will
differ according to your platform and Python installation.) Since the
Python include directory--/usr/local/include/python1.5 in this
case--is always included in the search path when building Python
extensions, the best approach is to include (e.g.)
<Numerical/arrayobject.h>. If you insist on putting the
Numerical include directory right into your header search path,
though, you can find that directory using the Distutils
sysconfig module:
from distutils.sysconfig import get_python_inc
incdir = os.path.join(get_python_inc(plat_specific=1), "Numerical")
setup(...,
Extension(..., include_dirs=[incdir]))
You can define and undefine pre-processor macros with the
define_macros and undef_macros options.
define_macros takes a list of (name, value) tuples, where
name is the name of the macro to define (a string) and
value is its value: either a string or None. (Defining a
macro FOO to None is the equivalent of a bare
#define FOO in your C source: with most compilers, this sets
FOO to the string 1.) undef_macros is just
a list of macros to undefine.
For example:
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