Skip to content

Commit 5e8bd30

Browse files
Windoes CMake compatibility.
1 parent 711a003 commit 5e8bd30

File tree

2 files changed

+49
-19
lines changed

2 files changed

+49
-19
lines changed

source/non_limited_api/CMakeLists.txt

Lines changed: 46 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,15 @@ cmake_minimum_required(VERSION 3.10)
22

33
set (CMAKE_CXX_STANDARD 17) # For `std::filesystem::weakly_canonical()`.
44

5+
# Attempt to add link library "Python::Python" to target "pybind11nonlimitedapi_3.X" which is not built in this directory.
6+
# This is allowed only when policy CMP0079 is set to NEW.
7+
cmake_policy(SET CMP0079 NEW)
8+
9+
if (MSVC)
10+
# Don't assume that extern C functions don't throw exceptions, because ours do throw.
11+
# The default flag is `/EHsc`, while we want only `/EHs`, so we remove the `c` part with this `/EHc-`.
12+
add_compile_options( /EHc- )
13+
endif()
514

615
if (DEFINED PYBIND11_NONLIMITEDAPI_PYTHON_HEADERS_VERSION)
716
find_package(Python ${PYBIND11_NONLIMITEDAPI_PYTHON_HEADERS_VERSION} EXACT REQUIRED COMPONENTS Interpreter Development)
@@ -15,26 +24,40 @@ set(PYBIND11_NONLIMITEDAPI_PYTHON_MIN_VERSION_HEX "" CACHE STRING "A hex Python
1524
set(PYBIND11_NONLIMITEDAPI_SUFFIX "" CACHE STRING "A custom suffix to append to the built library name. Should normally be `[_AppName][_X.Y]`, where X,Y is the Python version.")
1625
set(PYBIND11_NONLIMITEDAPI_LIBRARY_OUTPUT_DIR "" CACHE PATH "Replaces the library installation path for the shim.")
1726

27+
include(GNUInstallDirs)
28+
1829
set(PYBIND11_NONLIMITEDAPI_INSTALL_LIBDIR_STUBS "${CMAKE_INSTALL_LIBDIR}" CACHE PATH "Where to install the stub library.")
1930
set(PYBIND11_NONLIMITEDAPI_INSTALL_LIBDIR_SHIMS "${CMAKE_INSTALL_LIBDIR}" CACHE PATH "Where to install the shim library.")
2031

21-
include(GNUInstallDirs)
22-
2332
if (${PYBIND11_NONLIMITEDAPI_BUILD_STUBS})
2433
project(pybind11nonlimitedapi_stubs)
25-
add_library(pybind11nonlimitedapi_stubs SHARED non_limited_api_stubs.cpp)
26-
target_include_directories(pybind11nonlimitedapi_stubs PUBLIC ../../include)
27-
target_include_directories(pybind11nonlimitedapi_stubs PUBLIC ${Python_INCLUDE_DIRS})
28-
target_compile_definitions(pybind11nonlimitedapi_stubs PUBLIC PYBIND11_NONLIMITEDAPI_LIB_SUFFIX_FOR_MODULE=\"${PYBIND11_NONLIMITEDAPI_SUFFIX}\")
34+
add_library(${PROJECT_NAME} SHARED non_limited_api_stubs.cpp)
2935

30-
install(TARGETS pybind11nonlimitedapi_stubs
36+
# Probably not the smartest move to mark this directory private, but it's easier than figuring out the proper way.
37+
target_include_directories(${PROJECT_NAME} PRIVATE ../../include)
38+
target_include_directories(${PROJECT_NAME} PUBLIC ${Python_INCLUDE_DIRS})
39+
target_compile_definitions(${PROJECT_NAME} PUBLIC PYBIND11_NONLIMITEDAPI_LIB_SUFFIX_FOR_MODULE=\"${PYBIND11_NONLIMITEDAPI_SUFFIX}\")
40+
41+
# We don't link the entire `Python::Python` here because that's minor-version-dependent. It's not entirely clear to me what's the stable-ABI equivalent.
42+
# On Mac and Linux, not linking anything at all seems to work so far. But on Windows the Python header forces `python3.lib` (in this case,
43+
# but in generaldepends on `Py_LIMITED_API` and some other things), so we need the correct library directories to be set.
44+
if (MSVC)
45+
target_link_directories(${PROJECT_NAME} PUBLIC ${Python_LIBRARY_DIRS})
46+
endif()
47+
48+
install(TARGETS ${PROJECT_NAME} EXPORT ${PROJECT_NAME}
3149
ARCHIVE DESTINATION ${PYBIND11_NONLIMITEDAPI_INSTALL_LIBDIR_STUBS}
3250
LIBRARY DESTINATION ${PYBIND11_NONLIMITEDAPI_INSTALL_LIBDIR_STUBS}
3351
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
3452
)
53+
install(
54+
EXPORT ${PROJECT_NAME}
55+
NAMESPACE pybind11nonlimitedapi::
56+
DESTINATION ${CMAKE_INSTALL_LIBDIR}/pybind11nonlimitedapi/cmake
57+
)
3558

3659
if (APPLE)
37-
target_link_options(pybind11nonlimitedapi_stubs PRIVATE -undefined dynamic_lookup)
60+
target_link_options(${PROJECT_NAME} PRIVATE -undefined dynamic_lookup)
3861
endif()
3962
endif()
4063

@@ -43,23 +66,30 @@ if (PYBIND11_NONLIMITEDAPI_PYTHON_MIN_VERSION_HEX STREQUAL "")
4366
else()
4467
set(PYBIND11_NONLIMITEDAPI_LIBNAME "pybind11nonlimitedapi${PYBIND11_NONLIMITEDAPI_SUFFIX}_${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}")
4568
project(${PYBIND11_NONLIMITEDAPI_LIBNAME})
46-
add_library(${PYBIND11_NONLIMITEDAPI_LIBNAME} SHARED non_limited_api.cpp)
47-
target_include_directories(${PYBIND11_NONLIMITEDAPI_LIBNAME} PUBLIC ../../include)
48-
target_include_directories(${PYBIND11_NONLIMITEDAPI_LIBNAME} PUBLIC ${Python_INCLUDE_DIRS})
49-
target_link_libraries(${PYBIND11_NONLIMITEDAPI_LIBNAME} PUBLIC pybind11nonlimitedapi_stubs)
50-
target_link_libraries(${PYBIND11_NONLIMITEDAPI_LIBNAME} PUBLIC Python::Python)
69+
add_library(${PROJECT_NAME} SHARED non_limited_api.cpp)
70+
71+
# Probably not the smartest move to mark this directory private, but it's easier than figuring out the proper way.
72+
target_include_directories(${PROJECT_NAME} PRIVATE ../../include)
73+
target_include_directories(${PROJECT_NAME} PUBLIC ${Python_INCLUDE_DIRS})
74+
target_link_libraries(${PROJECT_NAME} PUBLIC pybind11nonlimitedapi_stubs)
75+
target_link_libraries(${PROJECT_NAME} PUBLIC Python::Python)
5176

5277
if (APPLE)
53-
target_link_options(${PYBIND11_NONLIMITEDAPI_LIBNAME} PRIVATE -undefined dynamic_lookup)
78+
target_link_options(${PROJECT_NAME} PRIVATE -undefined dynamic_lookup)
5479
endif()
5580

5681
if (NOT("${PYBIND11_NONLIMITEDAPI_LIBRARY_OUTPUT_DIR}" STREQUAL ""))
57-
set_target_properties(${PYBIND11_NONLIMITEDAPI_LIBNAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${PYBIND11_NONLIMITEDAPI_LIBRARY_OUTPUT_DIR})
82+
set_target_properties(${PROJECT_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${PYBIND11_NONLIMITEDAPI_LIBRARY_OUTPUT_DIR})
5883
endif()
5984

60-
install(TARGETS ${PYBIND11_NONLIMITEDAPI_LIBNAME}
85+
install(TARGETS ${PROJECT_NAME} EXPORT ${PROJECT_NAME}
6186
ARCHIVE DESTINATION ${PYBIND11_NONLIMITEDAPI_INSTALL_LIBDIR_SHIMS}
6287
LIBRARY DESTINATION ${PYBIND11_NONLIMITEDAPI_INSTALL_LIBDIR_SHIMS}
6388
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
6489
)
90+
install(
91+
EXPORT ${PROJECT_NAME}
92+
NAMESPACE pybind11nonlimitedapi::
93+
DESTINATION ${CMAKE_INSTALL_LIBDIR}/pybind11nonlimitedapi/cmake
94+
)
6595
endif()

source/non_limited_api/non_limited_api.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1335,11 +1335,11 @@ void pybind11::non_limited_api::pybind11NLA_cpp_function_initialize_generic(cpp_
13351335
detail::function_record *chain = nullptr, *chain_start = rec;
13361336
if (rec->sibling) {
13371337
if (PyCFunction_Check(rec->sibling.ptr())) {
1338-
auto *self = PyCFunction_GET_SELF(rec->sibling.ptr());
1339-
if (!isinstance<capsule>(self)) {
1338+
auto *self_ = PyCFunction_GET_SELF(rec->sibling.ptr());
1339+
if (!isinstance<capsule>(self_)) {
13401340
chain = nullptr;
13411341
} else {
1342-
auto rec_capsule = reinterpret_borrow<capsule>(self);
1342+
auto rec_capsule = reinterpret_borrow<capsule>(self_);
13431343
if (detail::is_function_record_capsule(rec_capsule)) {
13441344
chain = rec_capsule.get_pointer<detail::function_record>();
13451345
/* Never append a method to an overload chain of a parent class;

0 commit comments

Comments
 (0)