[Cython] Windows Debug build improvement

WL tds333 at gmail.com
Thu Jul 25 21:11:00 CEST 2013


On 25.07.2013 18:01, Robert Bradshaw wrote:
> On Thu, Jul 18, 2013 at 6:24 AM, Wolfgang <tds333 at gmail.com> wrote:
>> Hi,
>>
>> I tried to submit a improvement for the Windows build but the tracker is not
>> accessible without a login.
> This is to prevent spam.
>
>> On Windows if someone does a Debug build of an extension the flag _DEBUG is
>> set and so the Python Interpreter sets Py_DEBUG and for all extension modules
>> "_d" is appended to load the debug version of a module.
>> This is not really practical because then all modules and the Python
>> Interpreter must be build in Debug mode. For some modules this is even not
>> possible for Windows. :-(
>>
>> To do a debug build for a Cython generated extension with a normal Python
>> Interpreter (none Debug) I have to patch the pyconfig.h file and undef _DEBUG
>> or I must patch the generated c file from Cython to undef _DEBUG before
>> pyconfig.h or Python.h is included. (and enable it afterwards)
>>
>> Is it possible to add a flag to Cython to generate code that does this ?
>>
>> Something like described in Boost.Python:
>> http://hepunx.rl.ac.uk/BFROOT/dist/releases/26.0.0/boost/libs/python/doc/building.html
>>
>> It is enough to have a new Preprocessor Flag, if set, then surround the
>> Python.h inclusion with a disabled _DEBUG.
>>
>> My workarround is to disable it before pyconfig.h (Python.h) include:
>>
>> #ifdef _DEBUG
>> #undef _DEBUG
>> #define _RESTORE
>> #endif
>>
>> and enable it afterwards
>>
>> #ifdef _RESTORE
>> #define _DEBUG
>> #undef _RESTORE
>> #endif
> Seems like a fairly global change. At the very least it should be
> guarded with an #if [windows/msvc/?], and _RESTORE probably named
> __PYX_RESTORE_DEBUG or something less likely to clash. But it'd be
> really helpful for someone who uses and knows windows well to comment
> on the possible implications of this, as I don't even have a way to
> try it out.

Yes it should be guarded with special naming and only enabled if a new 
special option is set.
If this new flag is not set everything is as now. A check for Windows is 
not needed, but don't bother.

Something like:

#ifdef __PYX_WIN_DEBUG
#  ifdef _DEBUG
#    undef _DEBUG
#    define __PYX_DEBUG_RESTORE
#  endif
#endif

...

Or test at code generation time for the flag __PYX_WIN_DEBUG and only 
then generate this surrounding code.


Regards,

Wolfgang


More information about the cython-devel mailing list