@@ -2,6 +2,15 @@ cmake_minimum_required(VERSION 3.10)
22
33set (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
615if (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
1524set (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." )
1625set (PYBIND11_NONLIMITEDAPI_LIBRARY_OUTPUT_DIR "" CACHE PATH "Replaces the library installation path for the shim." )
1726
27+ include (GNUInstallDirs)
28+
1829set (PYBIND11_NONLIMITEDAPI_INSTALL_LIBDIR_STUBS "${CMAKE_INSTALL_LIBDIR} " CACHE PATH "Where to install the stub library." )
1930set (PYBIND11_NONLIMITEDAPI_INSTALL_LIBDIR_SHIMS "${CMAKE_INSTALL_LIBDIR} " CACHE PATH "Where to install the shim library." )
2031
21- include (GNUInstallDirs)
22-
2332if (${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 ()
3962endif ()
4063
@@ -43,23 +66,30 @@ if (PYBIND11_NONLIMITEDAPI_PYTHON_MIN_VERSION_HEX STREQUAL "")
4366else ()
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+ )
6595endif ()
0 commit comments