Skip to content

Commit 771f1b5

Browse files
committed
Update following cmake_common changes. Make sip.h dependency private.
1 parent eb1f021 commit 771f1b5

File tree

10 files changed

+87
-41
lines changed

10 files changed

+87
-41
lines changed

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ add_custom_target(PyQt6)
1717
mo2_python_pip_install(PyQt6
1818
DIRECTORY ${CMAKE_BINARY_DIR}/pylibs/
1919
PACKAGES
20-
PyQt${Qt_VERSION_MAJOR}==${Qt_VERSION}
20+
PyQt${MO2_QT_VERSION_MAJOR}==${MO2_QT_VERSION}
2121
sip==6.8.5)
2222

2323
# useful for naming DLL, zip, etc. (3.10 -> 310)

src/mobase/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ find_package(Qt6 COMPONENTS Core)
44
find_package(mo2-uibase CONFIG REQUIRED)
55

66
pybind11_add_module(mobase MODULE)
7-
mo2_configure_library(mobase
7+
mo2_configure_target(mobase
88
SOURCE_TREE
99
WARNINGS 4
1010
EXTERNAL_WARNINGS 4

src/proxy/CMakeLists.txt

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,13 @@ mo2_configure_plugin(proxy
1515
${CMAKE_CURRENT_SOURCE_DIR}/../pybind11-qt)
1616
target_link_libraries(proxy PRIVATE runner mo2::uibase)
1717
set_target_properties(proxy PROPERTIES OUTPUT_NAME ${PLUGIN_NAME})
18-
mo2_install_target(proxy FOLDER)
18+
mo2_install_plugin(proxy FOLDER)
1919

2020
set(PLUGIN_PYTHON_DIR bin/plugins/${PLUGIN_NAME})
2121

2222
# install runner
2323
target_link_options(proxy PRIVATE "/DELAYLOAD:runner.dll")
24-
mo2_install_target(runner INSTALLDIR ${PLUGIN_PYTHON_DIR}/dlls)
24+
install(FILES $<TARGET_FILE:runner> DESTINATION ${PLUGIN_PYTHON_DIR}/dlls)
2525

2626
# translations (custom location)
2727
mo2_add_translations(proxy
@@ -58,11 +58,8 @@ install(FILES ${pythoncore_zip} DESTINATION ${PYLIB_DIR})
5858
install(TARGETS mobase DESTINATION ${PYLIB_DIR})
5959

6060
# install PyQt6
61-
# set(PYQT_LIB_DIR ${CMAKE_BINARY_DIR}/pylibs/PyQt${Qt_VERSION_MAJOR})
62-
# set(PYQT_TARGET_DIR ${PYLIB_DIR}/PyQt${Qt_VERSION_MAJOR})
63-
# file(GLOB pyqt_files ${PYQT_LIB_DIR}/*.py ${PYQT_LIB_DIR}/*.pyd ${PYQT_LIB_DIR}/*.pyi)
6461
install(
65-
DIRECTORY ${CMAKE_BINARY_DIR}/pylibs/PyQt${Qt_VERSION_MAJOR}
62+
DIRECTORY ${CMAKE_BINARY_DIR}/pylibs/PyQt${MO2_QT_VERSION_MAJOR}
6663
DESTINATION ${PYLIB_DIR}
6764
PATTERN "*.pyd"
6865
PATTERN "*.pyi"

src/pybind11-qt/CMakeLists.txt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ find_package(Qt6 REQUIRED COMPONENTS Core Widgets)
55
mo2_find_python_executable(PYTHON_EXE)
66

77
add_library(pybind11-qt STATIC)
8-
mo2_configure_library(pybind11-qt
8+
mo2_configure_target(pybind11-qt
99
SOURCE_TREE
1010
WARNINGS 4
1111
EXTERNAL_WARNINGS 4
@@ -25,12 +25,12 @@ add_custom_command(
2525
COMMAND
2626
${CMAKE_COMMAND} -E env PYTHONPATH=${CMAKE_BINARY_DIR}/pylibs
2727
${CMAKE_BINARY_DIR}/pylibs/bin/sip-module.exe
28-
--sip-h PyQt${Qt_VERSION_MAJOR}.sip
28+
--sip-h PyQt${MO2_QT_VERSION_MAJOR}.sip
2929
--target-dir ${CMAKE_CURRENT_BINARY_DIR}
3030
)
31-
target_sources(pybind11-qt PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/sip.h")
3231
add_dependencies(PyQt6-siph PyQt6)
33-
3432
add_dependencies(pybind11-qt PyQt6-siph)
3533

34+
target_include_directories(pybind11-qt PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
35+
3636
add_library(pybind11::qt ALIAS pybind11-qt)

src/pybind11-qt/include/pybind11_qt/details/pybind11_qt_sip.h

Lines changed: 31 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,37 @@
44
#include <type_traits>
55

66
#include <pybind11/pybind11.h>
7-
#include <sip.h>
87

98
#include <iostream>
109
#include <pybind11/iostream.h>
1110

1211
#include "../pybind11_qt_holder.h"
1312

13+
struct _sipTypeDef;
14+
typedef struct _sipTypeDef sipTypeDef;
15+
16+
struct _sipSimpleWrapper;
17+
typedef struct _sipSimpleWrapper sipSimpleWrapper;
18+
19+
struct _sipWrapper;
20+
typedef struct _sipWrapper sipWrapper;
21+
1422
namespace pybind11::detail::qt {
1523

16-
/**
17-
* @brief Retrieve the SIP api.
18-
*
19-
* @return const sipAPIDef*
20-
*/
21-
const sipAPIDef* sipAPI();
24+
// helper functions to avoid bringing <sip.h> in this header
25+
namespace sip {
26+
27+
// extract the underlying data if present from the equivalent PyQt object
28+
void* extract_data(PyObject*);
29+
30+
const sipTypeDef* api_find_type(const char* type);
31+
int api_can_convert_to_type(PyObject* pyObj, const sipTypeDef* td, int flags);
32+
33+
void api_transfer_to(PyObject* self, PyObject* owner);
34+
void api_transfer_back(PyObject* self);
35+
PyObject* api_convert_from_type(void* cpp, const sipTypeDef* td,
36+
PyObject* transferObj);
37+
} // namespace sip
2238

2339
template <typename T, class = void>
2440
struct MetaData;
@@ -91,12 +107,11 @@ namespace pybind11::detail::qt {
91107
}
92108
}
93109

94-
const sipTypeDef* type =
95-
qt::sipAPI()->api_find_type(MetaData<QClass>::class_name);
110+
const auto* type = sip::api_find_type(MetaData<QClass>::class_name);
96111
if (type == nullptr) {
97112
return false;
98113
}
99-
if (!qt::sipAPI()->api_can_convert_to_type(src.ptr(), type, 0)) {
114+
if (!sip::api_can_convert_to_type(src.ptr(), type, 0)) {
100115
return false;
101116
}
102117

@@ -107,20 +122,14 @@ namespace pybind11::detail::qt {
107122
//
108123
// sipAPI()->api_transfer_to(objPtr, Py_None);
109124
//
110-
void* data = nullptr;
111-
if (PyObject_TypeCheck(src.ptr(), qt::sipAPI()->api_simplewrapper_type)) {
112-
data = reinterpret_cast<sipSimpleWrapper*>(src.ptr())->data;
113-
}
114-
else if (PyObject_TypeCheck(src.ptr(), qt::sipAPI()->api_wrapper_type)) {
115-
data = reinterpret_cast<sipWrapper*>(src.ptr())->super.data;
116-
}
125+
void* const data = sip::extract_data(src.ptr());
117126

118127
if (data) {
119128
if constexpr (is_pointer) {
120129
value = reinterpret_cast<QClass>(data);
121130

122131
// transfer ownership
123-
sipAPI()->api_transfer_to(src.ptr(), Py_None);
132+
sip::api_transfer_to(src.ptr(), Py_None);
124133

125134
// tie the py::object to the C++ one
126135
new pybind11::detail::qt::qobject_holder_impl(value);
@@ -164,8 +173,7 @@ namespace pybind11::detail::qt {
164173
}
165174
}
166175

167-
const sipTypeDef* type =
168-
qt::sipAPI()->api_find_type(MetaData<QClass>::class_name);
176+
const sipTypeDef* type = sip::api_find_type(MetaData<QClass>::class_name);
169177
if (type == nullptr) {
170178
return Py_None;
171179
}
@@ -188,19 +196,19 @@ namespace pybind11::detail::qt {
188196
sipData = &src;
189197
}
190198

191-
sipObj = qt::sipAPI()->api_convert_from_type(sipData, type, 0);
199+
sipObj = sip::api_convert_from_type(sipData, type, 0);
192200

193201
if (sipObj == nullptr) {
194202
return Py_None;
195203
}
196204

197205
// ensure Python deletes the C++ component
198206
if constexpr (!is_pointer) {
199-
qt::sipAPI()->api_transfer_back(sipObj);
207+
sip::api_transfer_back(sipObj);
200208
}
201209
else {
202210
if (policy == return_value_policy::take_ownership) {
203-
qt::sipAPI()->api_transfer_back(sipObj);
211+
sip::api_transfer_back(sipObj);
204212
}
205213
}
206214

src/pybind11-qt/pybind11_qt_sip.cpp

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
#include <QString>
66

7+
#include <sip.h>
8+
79
namespace py = pybind11;
810

911
namespace pybind11::detail::qt {
@@ -61,4 +63,43 @@ namespace pybind11::detail::qt {
6163
return sipApi;
6264
}
6365

66+
namespace sip {
67+
const sipTypeDef* api_find_type(const char* type)
68+
{
69+
return sipAPI()->api_find_type(type);
70+
}
71+
72+
int api_can_convert_to_type(PyObject* pyObj, const sipTypeDef* td, int flags)
73+
{
74+
return sipAPI()->api_can_convert_to_type(pyObj, td, flags);
75+
}
76+
77+
void api_transfer_to(PyObject* self, PyObject* owner)
78+
{
79+
sipAPI()->api_transfer_to(self, owner);
80+
}
81+
82+
void api_transfer_back(PyObject* self)
83+
{
84+
sipAPI()->api_transfer_back(self);
85+
}
86+
87+
PyObject* api_convert_from_type(void* cpp, const sipTypeDef* td, PyObject*)
88+
{
89+
return sipAPI()->api_convert_from_type(cpp, td, 0);
90+
}
91+
92+
void* extract_data(PyObject* ptr)
93+
{
94+
if (PyObject_TypeCheck(ptr, sipAPI()->api_simplewrapper_type)) {
95+
return reinterpret_cast<sipSimpleWrapper*>(ptr)->data;
96+
}
97+
else if (PyObject_TypeCheck(ptr, sipAPI()->api_wrapper_type)) {
98+
return reinterpret_cast<sipWrapper*>(ptr)->super.data;
99+
}
100+
return nullptr;
101+
}
102+
103+
} // namespace sip
104+
64105
} // namespace pybind11::detail::qt

src/pybind11-utils/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
cmake_minimum_required(VERSION 3.16)
22

33
add_library(pybind11-utils STATIC)
4-
mo2_configure_library(pybind11-utils
4+
mo2_configure_target(pybind11-utils
55
SOURCE_TREE
66
WARNINGS 4
77
EXTERNAL_WARNINGS 4

src/runner/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ cmake_minimum_required(VERSION 3.16)
33
find_package(mo2-uibase CONFIG REQUIRED)
44

55
add_library(runner SHARED)
6-
mo2_configure_library(runner
6+
mo2_configure_target(runner
77
SOURCE_TREE
88
WARNINGS 4
99
EXTERNAL_WARNINGS 4

tests/python/CMakeLists.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ UIBASE_PATH=set:${UIBASE_PATH}"
2727
mo2_python_pip_install(python-tests
2828
DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/pylibs
2929
PACKAGES pytest
30-
PyQt${Qt_VERSION_MAJOR}==${Qt_VERSION}
31-
PyQt${Qt_VERSION_MAJOR}-Qt${Qt_VERSION_MAJOR}==${Qt_VERSION})
30+
PyQt${MO2_QT_VERSION_MAJOR}==${MO2_QT_VERSION}
31+
PyQt${MO2_QT_VERSION_MAJOR}-Qt${MO2_QT_VERSION_MAJOR}==${MO2_QT_VERSION})
3232
add_dependencies(python-tests mobase)
3333
set_target_properties(python-tests PROPERTIES FOLDER tests/python)
3434

tests/runner/CMakeLists.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ mo2_python_pip_install(runner-tests
2727
DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/pylibs
2828
PACKAGES
2929
pytest
30-
PyQt${Qt_VERSION_MAJOR}==${Qt_VERSION}
31-
PyQt${Qt_VERSION_MAJOR}-Qt${Qt_VERSION_MAJOR}==${Qt_VERSION})
30+
PyQt${MO2_QT_VERSION_MAJOR}==${MO2_QT_VERSION}
31+
PyQt${MO2_QT_VERSION_MAJOR}-Qt${MO2_QT_VERSION_MAJOR}==${MO2_QT_VERSION})
3232

3333
add_dependencies(runner-tests mobase)
3434

0 commit comments

Comments
 (0)