diff --git a/examples/foomodulegen.py b/examples/foomodulegen.py index 52bd98b..a5abb24 100755 --- a/examples/foomodulegen.py +++ b/examples/foomodulegen.py @@ -2,12 +2,14 @@ import sys +import pybindgen from pybindgen import (ReturnValue, Parameter, Module, Function, FileCodeSink) from pybindgen import (CppMethod, CppConstructor, CppClass) def my_module_gen(out_file): - print >> out_file, "#include " + pybindgen.write_preamble(FileCodeSink(out_file)) + print >> out_file, "#include \"foo.h\"" mod = Module('foo') diff --git a/pybindgen/__init__.py b/pybindgen/__init__.py index a1f78d2..2ad1370 100644 --- a/pybindgen/__init__.py +++ b/pybindgen/__init__.py @@ -2,6 +2,35 @@ from typehandlers.base import ReturnValue, Parameter from module import Module from function import Function -from typehandlers.codesink import FileCodeSink +from typehandlers.codesink import CodeSink, FileCodeSink from cppclass import CppMethod, CppClass, CppConstructor +def write_preamble(code_sink, min_python_version=(2, 3)): + """ + Write a preamble, containing includes, #define's and typedef's + necessary to correctly compile the code with the given minimum python + version. + """ + + assert isinstance(code_sink, CodeSink) + assert isinstance(min_python_version, tuple) + + code_sink.writeln(''' +#define PY_SSIZE_T_CLEAN +#include +''') + + if min_python_version < (2, 5): + code_sink.writeln(''' + +#if PY_VERSION_HEX < 0x02050000 +typedef int Py_ssize_t; +# define PY_SSIZE_T_MAX INT_MAX +# define PY_SSIZE_T_MIN INT_MIN +typedef inquiry lenfunc; +typedef intargfunc ssizeargfunc; +typedef intobjargproc ssizeobjargproc; +#endif + +''') + diff --git a/tests/test-generation.py b/tests/test-generation.py index 44265f8..5a11e29 100755 --- a/tests/test-generation.py +++ b/tests/test-generation.py @@ -2,7 +2,7 @@ import sys - +import pybindgen from pybindgen import typehandlers from pybindgen.typehandlers import codesink from pybindgen.typehandlers.base import Parameter, ReturnValue @@ -21,7 +21,8 @@ class MyReverseWrapper(typehandlers.base.ReverseWrapperBase): def test(): - print "#include " + pybindgen.write_preamble(codesink.FileCodeSink(sys.stdout)) + print print "#include " print