aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--build_scripts/platforms/unix.py17
-rw-r--r--build_scripts/platforms/windows_desktop.py31
-rw-r--r--build_scripts/utils.py6
-rw-r--r--sources/pyside6/cmake/PySideHelpers.cmake1
-rw-r--r--sources/pyside6/libpyside/pysidevariantutils.cpp8
-rw-r--r--sources/shiboken6/data/Shiboken6ToolsConfig.cmake.in14
-rw-r--r--sources/shiboken6/data/Shiboken6ToolsMacros.cmake187
-rw-r--r--sources/shiboken6/generator/CMakeLists.txt28
8 files changed, 276 insertions, 16 deletions
diff --git a/build_scripts/platforms/unix.py b/build_scripts/platforms/unix.py
index 54aa265db..59c63fda3 100644
--- a/build_scripts/platforms/unix.py
+++ b/build_scripts/platforms/unix.py
@@ -257,10 +257,23 @@ def prepare_packages_posix(pyside_build, _vars, cross_build=False):
pyside_build.prepare_standalone_clang(is_win=False)
# Copy CMake config files
- if config.is_internal_shiboken_module_build() or config.is_internal_pyside_build():
+ if config.is_internal_shiboken_generator_build():
+ # Copy Shiboken6Tools CMake package for generator
+ copy_cmake_config_dirs(
+ _vars["install_dir"], _vars["st_build_dir"],
+ _vars["st_package_name"], "Shiboken6Tools"
+ )
+ elif config.is_internal_shiboken_module_build():
+ # Copy Shiboken6 CMake package for module
+ copy_cmake_config_dirs(
+ _vars["install_dir"], _vars["st_build_dir"],
+ _vars["st_package_name"], "Shiboken6"
+ )
+ elif config.is_internal_pyside_build():
+ # Copy PySide6 CMake package
copy_cmake_config_dirs(
_vars["install_dir"], _vars["st_build_dir"],
- _vars["st_package_name"], _vars["cmake_package_name"]
+ _vars["st_package_name"], "PySide6"
)
# Update rpath to $ORIGIN
diff --git a/build_scripts/platforms/windows_desktop.py b/build_scripts/platforms/windows_desktop.py
index 7d3febea1..e023ff003 100644
--- a/build_scripts/platforms/windows_desktop.py
+++ b/build_scripts/platforms/windows_desktop.py
@@ -201,6 +201,8 @@ def prepare_packages_win32(pyside_build, _vars):
copy_qt_artifacts(pyside_build, destination_qt_dir, copy_pdbs, _vars)
download_qt_dependency_dlls(_vars, destination_dir, msvc_redist)
+ copy_cmake_packages(_vars)
+
# MSVC redistributable file list.
msvc_redist = [
@@ -440,9 +442,32 @@ def copy_qt_artifacts(pyside_build, destination_qt_dir, copy_pdbs, _vars):
# Qt CI is using dynamic libclang with arm config.
pyside_build.prepare_standalone_clang(is_win=True)
- # Copy CMake config files
- if config.is_internal_shiboken_module_build() or config.is_internal_pyside_build():
+
+def copy_cmake_packages(_vars):
+ if config.is_internal_shiboken_generator_build():
+ print("copy_cmake_config_dirs called for Shiboken6Tools with:",
+ "_vars['install_dir'] =", _vars["install_dir"],
+ "_vars['st_build_dir'] =", _vars["st_build_dir"],
+ "_vars['st_package_name'] =", _vars["st_package_name"])
+ copy_cmake_config_dirs(
+ _vars["install_dir"], _vars["st_build_dir"],
+ _vars["st_package_name"], "Shiboken6Tools"
+ )
+ elif config.is_internal_shiboken_module_build():
+ print("copy_cmake_config_dirs called for Shiboken6 with:",
+ "_vars['install_dir'] =", _vars["install_dir"],
+ "_vars['st_build_dir'] =", _vars["st_build_dir"],
+ "_vars['st_package_name'] =", _vars["st_package_name"])
+ copy_cmake_config_dirs(
+ _vars["install_dir"], _vars["st_build_dir"],
+ _vars["st_package_name"], "Shiboken6"
+ )
+ elif config.is_internal_pyside_build():
+ print("copy_cmake_config_dirs called for PySide6 with:",
+ "_vars['install_dir'] =", _vars["install_dir"],
+ "_vars['st_build_dir'] =", _vars["st_build_dir"],
+ "_vars['st_package_name'] =", _vars["st_package_name"])
copy_cmake_config_dirs(
_vars["install_dir"], _vars["st_build_dir"],
- _vars["st_package_name"], _vars["cmake_package_name"]
+ _vars["st_package_name"], "PySide6"
)
diff --git a/build_scripts/utils.py b/build_scripts/utils.py
index eac8fdf53..3cb7ade0f 100644
--- a/build_scripts/utils.py
+++ b/build_scripts/utils.py
@@ -1153,7 +1153,7 @@ def copy_cmake_config_dirs(install_dir, st_build_dir, st_package_name, cmake_pac
dst_cmake_dir.mkdir(parents=True, exist_ok=True)
for src_path in src_cmake_dir.iterdir():
- if src_path.is_dir() and src_path.name.lower().startswith(cmake_package_name.lower()):
+ if src_path.is_dir() and (src_path.name.lower() == cmake_package_name.lower()):
dst_path = dst_cmake_dir / src_path.name
if dst_path.exists():
shutil.rmtree(dst_path)
@@ -1166,7 +1166,7 @@ def copy_cmake_config_dirs(install_dir, st_build_dir, st_package_name, cmake_pac
for item in wheel_path.iterdir():
if item.is_file() and re.search(r"Targets(-.*)?\.cmake$", item.name):
base_name = item.name.split('Targets')[0]
- if base_name in ("PySide6", "Shiboken6"):
+ if base_name in ("PySide6", "Shiboken6", "Shiboken6Tools"):
wheel_targets_exist[base_name] = True
# Copy wheel target file
shutil.copy2(str(item), str(dst_path / item.name))
@@ -1177,7 +1177,7 @@ def copy_cmake_config_dirs(install_dir, st_build_dir, st_package_name, cmake_pac
skip_file = False
if re.search(r"Targets(-.*)?\.cmake$", item.name):
base_name = item.name.split('Targets')[0]
- is_pyside_shiboken = base_name in ("PySide6", "Shiboken6")
+ is_pyside_shiboken = base_name in ("PySide6", "Shiboken6", "Shiboken6Tools")
if is_pyside_shiboken and base_name in wheel_targets_exist:
skip_file = True
diff --git a/sources/pyside6/cmake/PySideHelpers.cmake b/sources/pyside6/cmake/PySideHelpers.cmake
index b8a3c0c2b..46a1e6d64 100644
--- a/sources/pyside6/cmake/PySideHelpers.cmake
+++ b/sources/pyside6/cmake/PySideHelpers.cmake
@@ -50,6 +50,7 @@ function(pyside_internal_find_host_shiboken_tools)
list(APPEND "REQUIRED")
endif()
+ set(SHIBOKEN6TOOLS_SKIP_FIND_DEPENDENCIES TRUE)
find_package(
Shiboken6Tools 6 CONFIG
${find_package_extra_args}
diff --git a/sources/pyside6/libpyside/pysidevariantutils.cpp b/sources/pyside6/libpyside/pysidevariantutils.cpp
index 729557919..558d32e00 100644
--- a/sources/pyside6/libpyside/pysidevariantutils.cpp
+++ b/sources/pyside6/libpyside/pysidevariantutils.cpp
@@ -127,9 +127,11 @@ QMetaType resolveMetaType(PyTypeObject *type)
// QGraphicsItem::itemChange() to work.
if (qstrcmp(typeName, "QGraphicsObject*") == 0 && size > 1) {
auto *firstBaseType = reinterpret_cast<PyTypeObject *>(PyTuple_GetItem(type->tp_bases, 0));
- const char *firstBaseTypeName = Shiboken::ObjectType::getOriginalName(firstBaseType);
- if (firstBaseTypeName != nullptr && qstrcmp(firstBaseTypeName, "QObject*") == 0)
- ++i;
+ if (SbkObjectType_Check(firstBaseType)) {
+ const char *firstBaseTypeName = Shiboken::ObjectType::getOriginalName(firstBaseType);
+ if (firstBaseTypeName != nullptr && qstrcmp(firstBaseTypeName, "QObject*") == 0)
+ ++i;
+ }
}
for ( ; i < size; ++i) {
auto baseType = reinterpret_cast<PyTypeObject *>(PyTuple_GetItem(type->tp_bases, i));
diff --git a/sources/shiboken6/data/Shiboken6ToolsConfig.cmake.in b/sources/shiboken6/data/Shiboken6ToolsConfig.cmake.in
index 438b5c651..944c49db8 100644
--- a/sources/shiboken6/data/Shiboken6ToolsConfig.cmake.in
+++ b/sources/shiboken6/data/Shiboken6ToolsConfig.cmake.in
@@ -2,6 +2,20 @@
cmake_minimum_required(VERSION 3.18)
+include(CMakeFindDependencyMacro)
+find_dependency(Python COMPONENTS Interpreter Development)
+
+if(NOT SHIBOKEN6TOOLS_SKIP_FIND_DEPENDENCIES)
+ list(APPEND CMAKE_PREFIX_PATH
+ "${Python_SITELIB}/shiboken6/lib/cmake"
+ "${Python_SITELIB}/PySide6/lib/cmake"
+ )
+ find_dependency(Shiboken6 REQUIRED)
+ find_dependency(PySide6 REQUIRED)
+endif()
+
if(NOT TARGET Shiboken6::shiboken6)
include("${CMAKE_CURRENT_LIST_DIR}/Shiboken6ToolsTargets.cmake")
endif()
+
+include("${CMAKE_CURRENT_LIST_DIR}/Shiboken6ToolsMacros.cmake")
diff --git a/sources/shiboken6/data/Shiboken6ToolsMacros.cmake b/sources/shiboken6/data/Shiboken6ToolsMacros.cmake
new file mode 100644
index 000000000..b570e73c8
--- /dev/null
+++ b/sources/shiboken6/data/Shiboken6ToolsMacros.cmake
@@ -0,0 +1,187 @@
+# Function to configure a binding project
+function(shiboken_generator_create_binding)
+ set(options FORCE_LIMITED_API)
+ set(one_value_args
+ EXTENSION_TARGET
+ TYPESYSTEM_FILE
+ LIBRARY_TARGET)
+ set(multi_value_args
+ GENERATED_SOURCES
+ HEADERS
+ QT_MODULES
+ SHIBOKEN_EXTRA_OPTIONS)
+
+ cmake_parse_arguments(PARSE_ARGV 0 arg
+ "${options}"
+ "${one_value_args}"
+ "${multi_value_args}")
+
+ # Validate required arguments
+ foreach(req EXTENSION_TARGET GENERATED_SOURCES HEADERS TYPESYSTEM_FILE LIBRARY_TARGET)
+ if(NOT DEFINED arg_${req})
+ message(FATAL_ERROR "shiboken_generator_create_binding: ${req} is required")
+ endif()
+ endforeach()
+
+ get_target_property(shiboken_include_dirs Shiboken6::libshiboken INTERFACE_INCLUDE_DIRECTORIES)
+
+ # Get Shiboken path based on build type
+ if(CMAKE_BUILD_TYPE STREQUAL "Debug")
+ get_target_property(shiboken_path Shiboken6::shiboken6 IMPORTED_LOCATION_DEBUG)
+ else()
+ get_target_property(shiboken_path Shiboken6::shiboken6 IMPORTED_LOCATION_RELEASE)
+ endif()
+
+ # Basic shiboken options
+ set(shiboken_options
+ --generator-set=shiboken
+ --enable-parent-ctor-heuristic
+ --enable-return-value-heuristic
+ --use-isnull-as-nb_nonzero
+ --avoid-protected-hack
+ -I${CMAKE_CURRENT_SOURCE_DIR}
+ -T${CMAKE_CURRENT_SOURCE_DIR}
+ --output-directory=${CMAKE_CURRENT_BINARY_DIR})
+
+ # Add extra options if specified
+ if(arg_SHIBOKEN_EXTRA_OPTIONS)
+ list(APPEND shiboken_options ${arg_SHIBOKEN_EXTRA_OPTIONS})
+ endif()
+
+ # Add Qt/PySide specific configurations only if Qt modules are specified
+ if(arg_QT_MODULES)
+ # Get Qt include directories
+ set(qt_include_dirs "")
+ foreach(module ${arg_QT_MODULES})
+ get_property(module_includes TARGET Qt6::${module} PROPERTY
+ INTERFACE_INCLUDE_DIRECTORIES)
+ list(APPEND qt_include_dirs ${module_includes})
+
+ # Check each module for framework on macOS
+ if(APPLE)
+ get_target_property(is_framework Qt6::${module} FRAMEWORK)
+ if(is_framework)
+ get_target_property(lib_location Qt6::${module} LOCATION)
+ get_filename_component(lib_dir "${lib_location}" DIRECTORY)
+ get_filename_component(framework_dir "${lib_dir}/../" ABSOLUTE)
+ list(APPEND shiboken_options "--framework-include-paths=${framework_dir}")
+ endif()
+ endif()
+
+ # Add include paths to shiboken options
+ foreach(include_dir ${module_includes})
+ list(APPEND shiboken_options "-I${include_dir}")
+ endforeach()
+ endforeach()
+
+ get_target_property(pyside_include_dir PySide6::pyside6 INTERFACE_INCLUDE_DIRECTORIES)
+
+ # Add PySide typesystems path
+ list(APPEND shiboken_options "-T${PYSIDE_TYPESYSTEMS}")
+
+ # Enable PySide extensions
+ list(APPEND shiboken_options "--enable-pyside-extensions")
+ endif()
+
+ # Generate binding sources
+ add_custom_command(
+ OUTPUT ${arg_GENERATED_SOURCES}
+ COMMAND "${shiboken_path}"
+ ${shiboken_options} ${arg_HEADERS} "${arg_TYPESYSTEM_FILE}"
+ DEPENDS ${arg_HEADERS} ${arg_TYPESYSTEM_FILE}
+ IMPLICIT_DEPENDS CXX ${arg_HEADERS}
+ WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
+ COMMENT "Generating bindings for ${arg_EXTENSION_TARGET}"
+ )
+
+ # Create binding library
+ add_library(${arg_EXTENSION_TARGET} MODULE ${arg_GENERATED_SOURCES})
+
+ # set limited API
+ if(arg_FORCE_LIMITED_API OR FORCE_LIMITED_API)
+ target_compile_definitions(${arg_EXTENSION_TARGET} PRIVATE -DPy_LIMITED_API=0x03090000)
+ endif()
+
+
+ # Configure include paths
+ target_include_directories(
+ ${arg_EXTENSION_TARGET} PRIVATE
+ ${SHIBOKEN_PYTHON_INCLUDE_DIRS}
+ ${shiboken_include_dirs}
+ ${CMAKE_CURRENT_SOURCE_DIR}
+ )
+
+ # Link with Python, Shiboken and C++ library
+ target_link_libraries(
+ ${arg_EXTENSION_TARGET} PRIVATE
+ Shiboken6::libshiboken
+ ${arg_LIBRARY_TARGET}
+ )
+
+ if(arg_QT_MODULES)
+ # Add Qt and PySide includes
+ target_include_directories(
+ ${arg_EXTENSION_TARGET} PRIVATE ${qt_include_dirs}
+ )
+ target_include_directories(
+ ${arg_EXTENSION_TARGET} PRIVATE ${pyside_include_dir}
+ )
+
+ # Add PySide Qt module-specific includes and link libraries
+ foreach(module ${arg_QT_MODULES})
+ target_include_directories(
+ ${arg_EXTENSION_TARGET} PRIVATE "${pyside_include_dir}/Qt${module}"
+ )
+ target_link_libraries(
+ ${arg_EXTENSION_TARGET} PRIVATE Qt6::${module}
+ )
+ endforeach()
+
+ # Link base PySide6 library
+ target_link_libraries(
+ ${arg_EXTENSION_TARGET} PRIVATE PySide6::pyside6
+ )
+
+ # Link PySide6 QML library if Qml module is used
+ if("Qml" IN_LIST arg_QT_MODULES)
+ target_link_libraries(
+ ${arg_EXTENSION_TARGET} PRIVATE PySide6::pyside6qml
+ )
+ endif()
+ endif()
+
+ # Configure target properties
+ set_target_properties(
+ ${arg_EXTENSION_TARGET} PROPERTIES
+ PREFIX ""
+ OUTPUT_NAME "${arg_EXTENSION_TARGET}${SHIBOKEN_PYTHON_EXTENSION_SUFFIX}"
+ )
+
+ # Platform specific settings
+ if(WIN32)
+ # Add Python libraries only on Windows
+ get_property(SHIBOKEN_PYTHON_LIBRARIES GLOBAL PROPERTY shiboken_python_libraries)
+
+ target_link_libraries(
+ ${arg_EXTENSION_TARGET} PRIVATE "${SHIBOKEN_PYTHON_LIBRARIES}"
+ )
+
+ # Set Windows-specific suffix
+ if(CMAKE_BUILD_TYPE STREQUAL "Debug")
+ set_property(
+ TARGET ${arg_EXTENSION_TARGET} PROPERTY SUFFIX "_d.pyd"
+ )
+ else()
+ set_property(
+ TARGET ${arg_EXTENSION_TARGET} PROPERTY SUFFIX ".pyd"
+ )
+ endif()
+ endif()
+
+ if(APPLE)
+ set_target_properties(
+ ${arg_EXTENSION_TARGET} PROPERTIES
+ LINK_FLAGS "-undefined dynamic_lookup"
+ )
+ endif()
+endfunction()
diff --git a/sources/shiboken6/generator/CMakeLists.txt b/sources/shiboken6/generator/CMakeLists.txt
index 454e9cf7f..997468f02 100644
--- a/sources/shiboken6/generator/CMakeLists.txt
+++ b/sources/shiboken6/generator/CMakeLists.txt
@@ -69,6 +69,18 @@ install(EXPORT "${package_name}Targets"
NAMESPACE "Shiboken6::"
DESTINATION ${LIB_INSTALL_DIR}/cmake/${package_name})
+# Add wheel specific installation
+if(NOT is_pyside6_superproject_build)
+ install(TARGETS shiboken6
+ EXPORT "${package_name}WheelTargets"
+ DESTINATION "shiboken6_generator")
+
+ install(EXPORT "${package_name}WheelTargets"
+ NAMESPACE "Shiboken6::"
+ DESTINATION "${LIB_INSTALL_DIR}/wheels/cmake/${package_name}"
+ FILE "${package_name}Targets.cmake")
+endif()
+
set(shiboken_generator_package_name "shiboken6_generator")
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/_config.py.in"
@@ -101,6 +113,11 @@ install(FILES "${CMAKE_CURRENT_BINARY_DIR}/_git_shiboken_generator_version.py"
include(CMakePackageConfigHelpers)
+# Copy macros file to build tree
+configure_file("${CMAKE_CURRENT_SOURCE_DIR}/../data/${package_name}Macros.cmake"
+ "${CMAKE_CURRENT_BINARY_DIR}/${package_name}Macros.cmake"
+ COPYONLY)
+
# Single build-tree and install-tree Config file. There's no need for separate ones because we
# don't specify any PATH_VARS, so the relative path of PACKAGE_PREFIX_DIR does not really matter.
configure_package_config_file(
@@ -115,8 +132,9 @@ write_basic_package_version_file(
ARCH_INDEPENDENT
)
-install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${package_name}Config.cmake"
- DESTINATION "${LIB_INSTALL_DIR}/cmake/${package_name}")
-
-install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${package_name}ConfigVersion.cmake"
- DESTINATION "${LIB_INSTALL_DIR}/cmake/${package_name}")
+# Install the config files
+install(FILES
+ "${CMAKE_CURRENT_BINARY_DIR}/${package_name}Config.cmake"
+ "${CMAKE_CURRENT_BINARY_DIR}/${package_name}ConfigVersion.cmake"
+ "${CMAKE_CURRENT_BINARY_DIR}/${package_name}Macros.cmake"
+ DESTINATION "${LIB_INSTALL_DIR}/cmake/${package_name}")