| // (C) Copyright David Abrahams 2000. |
| // Distributed under the Boost Software License, Version 1.0. (See |
| // accompanying file LICENSE_1_0.txt or copy at |
| // http://www.boost.org/LICENSE_1_0.txt) |
| // |
| // The author gratefully acknowleges the support of Dragon Systems, Inc., in |
| // producing this work. |
| |
| // This file serves as a wrapper around <Python.h> which allows it to be |
| // compiled with GCC 2.95.2 under Win32 and which disables the default MSVC |
| // behavior so that a program may be compiled in debug mode without requiring a |
| // special debugging build of the Python library. |
| |
| |
| // To use the Python debugging library, #define BOOST_DEBUG_PYTHON on the |
| // compiler command-line. |
| |
| // Revision History: |
| // 05 Mar 01 Suppress warnings under Cygwin with Python 2.0 (Dave Abrahams) |
| // 04 Mar 01 Rolled in some changes from the Dragon fork (Dave Abrahams) |
| // 01 Mar 01 define PyObject_INIT() for Python 1.x (Dave Abrahams) |
| |
| #ifdef _DEBUG |
| # ifndef BOOST_DEBUG_PYTHON |
| # ifdef _MSC_VER |
| // VC8.0 will complain if system headers are #included both with |
| // and without _DEBUG defined, so we have to #include all the |
| // system headers used by pyconfig.h right here. |
| # include <stddef.h> |
| # include <stdarg.h> |
| # include <stdio.h> |
| # include <stdlib.h> |
| # include <assert.h> |
| # include <errno.h> |
| # include <ctype.h> |
| # include <wchar.h> |
| # include <basetsd.h> |
| # include <io.h> |
| # include <limits.h> |
| # include <float.h> |
| # include <string.h> |
| # include <math.h> |
| # include <time.h> |
| # endif |
| # undef _DEBUG // Don't let Python force the debug library just because we're debugging. |
| # define DEBUG_UNDEFINED_FROM_WRAP_PYTHON_H |
| # endif |
| #endif |
| |
| # include <pyconfig.h> |
| # if defined(_SGI_COMPILER_VERSION) && _SGI_COMPILER_VERSION >= 740 |
| # undef _POSIX_C_SOURCE |
| # undef _XOPEN_SOURCE |
| # undef HAVE_STDINT_H // undo Python 2.5.1 define |
| # endif |
| |
| // |
| // Python's LongObject.h helpfully #defines ULONGLONG_MAX for us, |
| // which confuses Boost's config |
| // |
| #include <limits.h> |
| #ifndef ULONG_MAX |
| # define BOOST_PYTHON_ULONG_MAX_UNDEFINED |
| #endif |
| #ifndef LONGLONG_MAX |
| # define BOOST_PYTHON_LONGLONG_MAX_UNDEFINED |
| #endif |
| #ifndef ULONGLONG_MAX |
| # define BOOST_PYTHON_ULONGLONG_MAX_UNDEFINED |
| #endif |
| |
| // |
| // Get ahold of Python's version number |
| // |
| #include <patchlevel.h> |
| |
| #if PY_MAJOR_VERSION<2 || PY_MAJOR_VERSION==2 && PY_MINOR_VERSION<2 |
| #error Python 2.2 or higher is required for this version of Boost.Python. |
| #endif |
| |
| // |
| // Some things we need in order to get Python.h to work with compilers other |
| // than MSVC on Win32 |
| // |
| #if defined(_WIN32) || defined(__CYGWIN__) |
| # if defined(__GNUC__) && defined(__CYGWIN__) |
| |
| # define SIZEOF_LONG 4 |
| |
| # if PY_MAJOR_VERSION < 2 || PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION <= 2 |
| |
| typedef int pid_t; |
| |
| # define WORD_BIT 32 |
| # define hypot _hypot |
| # include <stdio.h> |
| |
| # if PY_MAJOR_VERSION < 2 |
| # define HAVE_CLOCK |
| # define HAVE_STRFTIME |
| # define HAVE_STRERROR |
| # endif |
| |
| # define NT_THREADS |
| |
| # ifndef NETSCAPE_PI |
| # define USE_SOCKET |
| # endif |
| |
| # ifdef USE_DL_IMPORT |
| # define DL_IMPORT(RTYPE) __declspec(dllimport) RTYPE |
| # endif |
| |
| # ifdef USE_DL_EXPORT |
| # define DL_IMPORT(RTYPE) __declspec(dllexport) RTYPE |
| # define DL_EXPORT(RTYPE) __declspec(dllexport) RTYPE |
| # endif |
| |
| # define HAVE_LONG_LONG 1 |
| # define LONG_LONG long long |
| # endif |
| |
| # elif defined(__MWERKS__) |
| |
| # ifndef _MSC_VER |
| # define PY_MSC_VER_DEFINED_FROM_WRAP_PYTHON_H 1 |
| # define _MSC_VER 900 |
| # endif |
| |
| # undef hypot // undo the evil #define left by Python. |
| |
| # elif defined(__BORLANDC__) |
| # undef HAVE_HYPOT |
| # define HAVE_HYPOT 1 |
| # endif |
| |
| #endif // _WIN32 |
| |
| #if PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION == 2 && PY_MICRO_VERSION < 2 |
| # include <boost/python/detail/python22_fixed.h> |
| #else |
| # include <Python.h> |
| #endif |
| |
| #ifdef BOOST_PYTHON_ULONG_MAX_UNDEFINED |
| # undef ULONG_MAX |
| # undef BOOST_PYTHON_ULONG_MAX_UNDEFINED |
| #endif |
| |
| #ifdef BOOST_PYTHON_LONGLONG_MAX_UNDEFINED |
| # undef LONGLONG_MAX |
| # undef BOOST_PYTHON_LONGLONG_MAX_UNDEFINED |
| #endif |
| |
| #ifdef BOOST_PYTHON_ULONGLONG_MAX_UNDEFINED |
| # undef ULONGLONG_MAX |
| # undef BOOST_PYTHON_ULONGLONG_MAX_UNDEFINED |
| #endif |
| |
| #ifdef PY_MSC_VER_DEFINED_FROM_WRAP_PYTHON_H |
| # undef _MSC_VER |
| #endif |
| |
| #ifdef DEBUG_UNDEFINED_FROM_WRAP_PYTHON_H |
| # undef DEBUG_UNDEFINED_FROM_WRAP_PYTHON_H |
| # define _DEBUG |
| # ifdef _CRT_NOFORCE_MANIFEST_DEFINED_FROM_WRAP_PYTHON_H |
| # undef _CRT_NOFORCE_MANIFEST_DEFINED_FROM_WRAP_PYTHON_H |
| # undef _CRT_NOFORCE_MANIFEST |
| # endif |
| #endif |
| |
| #if !defined(PY_MAJOR_VERSION) || PY_MAJOR_VERSION < 2 |
| # define PyObject_INIT(op, typeobj) \ |
| ( (op)->ob_type = (typeobj), _Py_NewReference((PyObject *)(op)), (op) ) |
| #endif |
| |
| // Define Python 3 macros for Python 2.x |
| #if PY_VERSION_HEX < 0x02060000 |
| |
| # define Py_TYPE(o) (((PyObject*)(o))->ob_type) |
| # define Py_REFCNT(o) (((PyObject*)(o))->ob_refcnt) |
| # define Py_SIZE(o) (((PyVarObject*)(o))->ob_size) |
| |
| # define PyVarObject_HEAD_INIT(type, size) \ |
| PyObject_HEAD_INIT(type) size, |
| |
| #endif |
| |
| |
| #ifdef __MWERKS__ |
| # pragma warn_possunwant off |
| #elif _MSC_VER |
| # pragma warning(disable:4786) |
| #endif |
| |
| #if defined(HAVE_LONG_LONG) |
| # if defined(PY_LONG_LONG) |
| # define BOOST_PYTHON_LONG_LONG PY_LONG_LONG |
| # elif defined(LONG_LONG) |
| # define BOOST_PYTHON_LONG_LONG LONG_LONG |
| # else |
| # error "HAVE_LONG_LONG defined but not PY_LONG_LONG or LONG_LONG" |
| # endif |
| #endif |