Skip to content

[BUG]: Not detecting the SUFFIX and DEBUG_POSTFIX for cmake correctly #4699

@lpapp-foundry

Description

@lpapp-foundry

Required prerequisites

What version (or hash if on master) of pybind11 are you using?

2.10.4

Problem description

pybind11 uses this to figure out the SUFFIX (extension) for cmake.

COMMAND
"${${_Python}_EXECUTABLE}" "-c"
"import sys, importlib; s = importlib.import_module('distutils.sysconfig' if sys.version_info < (3, 10) else 'sysconfig'); print(s.get_config_var('EXT_SUFFIX') or s.get_config_var('SO'))"

This is problematic because this can also contain the debug postfix ("_d" on Windows in debug mode) because of this:

https://github.com/python/cpython/blob/a8d69fe92c65d636fc454cfb1825c357eb2e6325/Python/dynload_win.c#L18

What should be done instead is splitting the result into SUFFIX and DEBUG_POSTFIX.

At the moment, we are trying to use pybind11 with a Python that sets the DEBUG_POSTFIX _d when it needs. This is great for all python libraries.

However, cmake combines DEBUG_POSTFIX and SUFFIX, so we end up with double _d, so we _d_d which then crashes since Windows in debug mode is looking for a single _d.

At the moment, as a consumer of pybind11, we have no easy solution to fix this, only to avoid using pybind11_add_module, but then we would need to reinvent quite a bit of boilerplate, which does not look sustainable.

So, the issue is that our Python package sets the DEBUG_POSTFIX and pybind11 sets the SUFFIX. These two get combined in debug mode. They do not overwrite each other.

pybind11_extension sets SUFFIX to _d.something and we set DEBUG_POSTFIX to _d.

_d + _d.something = _d_d.something

Reproducible example code

Call pybind11_add_module() from a consumer cmake extension module in the CMakeLists.txt file on Windows in debug mode.

Is this a regression? Put the last known working version here if it is.

Not a regression

Metadata

Metadata

Assignees

No one assigned

    Labels

    triageNew bug, unverified

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions