215 lines
5.5 KiB
C++
215 lines
5.5 KiB
C++
// (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__)
|
|
|
|
# if defined(__LP64__)
|
|
# define SIZEOF_LONG 8
|
|
# else
|
|
# define SIZEOF_LONG 4
|
|
# endif
|
|
|
|
|
|
# if PY_MAJOR_VERSION < 2 || PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION <= 2
|
|
|
|
typedef int pid_t;
|
|
|
|
# if defined(__LP64__)
|
|
# define WORD_BIT 64
|
|
# else
|
|
# define WORD_BIT 32
|
|
# endif
|
|
# 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
|