aboutsummaryrefslogtreecommitdiffstats
path: root/sources/pyside6/cmake/Macros/PySideModules.cmake
diff options
context:
space:
mode:
Diffstat (limited to 'sources/pyside6/cmake/Macros/PySideModules.cmake')
-rw-r--r--sources/pyside6/cmake/Macros/PySideModules.cmake190
1 files changed, 147 insertions, 43 deletions
diff --git a/sources/pyside6/cmake/Macros/PySideModules.cmake b/sources/pyside6/cmake/Macros/PySideModules.cmake
index 96fa33a99..1e434f9f6 100644
--- a/sources/pyside6/cmake/Macros/PySideModules.cmake
+++ b/sources/pyside6/cmake/Macros/PySideModules.cmake
@@ -1,3 +1,6 @@
+# Copyright (C) 2023 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
include(CMakeParseArguments)
# A version of cmake_parse_arguments that makes sure all arguments are processed and errors out
@@ -18,6 +21,34 @@ macro(unmake_path varname)
string(REPLACE "${PATH_SEP}" ";" ${varname} "${ARGN}")
endmacro()
+# Check for presence of QtOpenGL and modify module variables
+# accordingly
+macro(check_qt_opengl module include_var deps_var dropped_entries_var)
+ if (Qt${QT_MAJOR_VERSION}OpenGL_FOUND)
+ message(STATUS "Qt${QT_MAJOR_VERSION}${module}: Building with OpenGL")
+ list(APPEND ${include_var} ${Qt${QT_MAJOR_VERSION}OpenGL_INCLUDE_DIRS}
+ ${QtOpenGL_GEN_DIR})
+ list(APPEND ${deps_var} QtOpenGL)
+ else()
+ message(STATUS "Qt${QT_MAJOR_VERSION}${module}: Dropping OpenGL")
+ # This is a dummy entry creating a conditional typesystem keyword
+ list(APPEND ${dropped_entries_var} "QtOpenGL")
+ endif()
+endmacro()
+
+# set size optimization flags for pyside6
+macro(append_size_optimization_flags _module_name)
+ if(NOT QFP_NO_OVERRIDE_OPTIMIZATION_FLAGS)
+ if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
+ target_compile_options(${_module_name} PRIVATE /Gy /Gw /EHsc)
+ target_link_options(${_module_name} PRIVATE LINKER:/OPT:REF)
+ elseif ("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU|CLANG")
+ target_compile_options(${_module_name} PRIVATE -ffunction-sections -fdata-sections -fno-exceptions)
+ target_link_options(${_module_name} PRIVATE LINKER:--gc-sections)
+ endif()
+ endif()
+endmacro()
+
# Sample usage
# create_pyside_module(NAME QtGui
# INCLUDE_DIRS QtGui_include_dirs
@@ -35,7 +66,7 @@ macro(create_pyside_module)
"create_pyside_module" # Macro name
"" # Flags
"NAME;TYPESYSTEM_PATH;TYPESYSTEM_NAME" # Single value
- "INCLUDE_DIRS;LIBRARIES;DEPS;SOURCES;STATIC_SOURCES;DROPPED_ENTRIES;GLUE_SOURCES" # Multival
+ "INCLUDE_DIRS;LIBRARIES;DEPS;SOURCES;STATIC_SOURCES;DROPPED_ENTRIES;GLUE_SOURCES;ADDITIONAL_INCLUDE_DIRS" # Multival
${ARGN} # Number of arguments given when the macros is called
)
@@ -55,12 +86,6 @@ macro(create_pyside_module)
string(TOLOWER ${module_NAME} _module)
string(REGEX REPLACE ^qt "" _module ${_module})
- if(${module_DROPPED_ENTRIES})
- string(REPLACE ";" "\\;" dropped_entries "${${module_DROPPED_ENTRIES}}")
- else()
- set (dropped_entries "")
- endif()
-
if(${module_GLUE_SOURCES})
set (module_GLUE_SOURCES "${${module_GLUE_SOURCES}}")
else()
@@ -90,20 +115,53 @@ macro(create_pyside_module)
# Remove any possible duplicates.
list(REMOVE_DUPLICATES total_type_system_files)
- # Contains include directories to pass to shiboken's preprocessor.
- # Workaround: Added ${QT_INCLUDE_DIR}/QtCore until
- # qtdeclarative/8d560d1bf0a747bf62f73fad6b6774095442d9d2 has reached qt5.git
- string(REPLACE ";" ${PATH_SEP} core_includes "${Qt${QT_MAJOR_VERSION}Core_INCLUDE_DIRS}")
- set(shiboken_include_dirs ${pyside6_SOURCE_DIR}${PATH_SEP}${QT_INCLUDE_DIR}${PATH_SEP}${core_includes})
- set(shiboken_framework_include_dirs_option "")
- if(CMAKE_HOST_APPLE)
- set(shiboken_framework_include_dirs "${QT_FRAMEWORK_INCLUDE_DIR}")
- make_path(shiboken_framework_include_dirs ${shiboken_framework_include_dirs})
- set(shiboken_framework_include_dirs_option "--framework-include-paths=${shiboken_framework_include_dirs}")
+ # Contains include directories to pass to shiboken's preprocessor (mkspec / global)
+ get_target_property(qt_platform_includes Qt${QT_MAJOR_VERSION}::Platform
+ INTERFACE_INCLUDE_DIRECTORIES)
+ # Add QtCore since include conventions are sometimes violated for its classes
+ get_target_property(qt_core_includes Qt${QT_MAJOR_VERSION}::Core
+ INTERFACE_INCLUDE_DIRECTORIES)
+ set(shiboken_include_dir_list ${pyside6_SOURCE_DIR} ${qt_platform_includes}
+ ${qt_core_includes})
+ if(module_ADDITIONAL_INCLUDE_DIRS)
+ list(APPEND shiboken_include_dir_list ${${module_ADDITIONAL_INCLUDE_DIRS}})
endif()
# Transform the path separators into something shiboken understands.
- make_path(shiboken_include_dirs ${shiboken_include_dirs})
+ make_path(shiboken_include_dirs ${shiboken_include_dir_list})
+
+ set(force_process_system_include_paths_list "")
+ # When building against system Qt (as it happens with yocto / Boot2Qt), the Qt headers are
+ # considered system headers by clang_Location_isInSystemHeader, and thus shiboken will not
+ # process them.
+ #
+ # We do want to process them.
+ #
+ # Tell shiboken to consider them as special typesystem system include paths, which ensures
+ # the types are processed and extracted.
+ #
+ # This option is opt-in because it might cause problems if there are other system headers
+ # installed in the same location as the Qt ones, resulting in processing more non-Qt system
+ # types that might not be supported by shiboken.
+ if(PYSIDE_TREAT_QT_INCLUDE_DIRS_AS_NON_SYSTEM)
+ list(APPEND force_process_system_include_paths_list
+ ${qt_platform_includes}
+ ${qt_core_includes})
+ endif()
+
+ # Allow passing extra non system inlcude dirs.
+ if(SHIBOKEN_FORCE_PROCESS_SYSTEM_INCLUDE_PATHS)
+ list(APPEND force_process_system_include_paths_list
+ ${SHIBOKEN_FORCE_PROCESS_SYSTEM_INCLUDE_PATHS})
+ endif()
+
+ # Transform the path separators into something shiboken understands.
+ make_path(force_process_system_include_paths ${force_process_system_include_paths_list})
+
+ if(force_process_system_include_paths)
+ set(force_process_system_include_paths
+ "--force-process-system-include-paths=${force_process_system_include_paths}")
+ endif()
get_filename_component(pyside_binary_dir ${CMAKE_CURRENT_BINARY_DIR} DIRECTORY)
@@ -122,18 +180,37 @@ macro(create_pyside_module)
install(FILES ${module_GLUE_SOURCES} DESTINATION share/PySide6${pyside6_SUFFIX}/typesystems/glue)
endif()
+ shiboken_get_tool_shell_wrapper(shiboken tool_wrapper)
+
+ set(shiboken_command
+ ${tool_wrapper}
+ $<TARGET_FILE:Shiboken6::shiboken6>
+ ${GENERATOR_EXTRA_FLAGS}
+ "--include-paths=${shiboken_include_dirs}"
+ "${force_process_system_include_paths}"
+ "--typesystem-paths=${pyside_binary_dir}${PATH_SEP}${pyside6_SOURCE_DIR}${PATH_SEP}${${module_TYPESYSTEM_PATH}}"
+ --output-directory=${CMAKE_CURRENT_BINARY_DIR}
+ --license-file=${CMAKE_CURRENT_SOURCE_DIR}/../licensecomment.txt
+ --lean-headers
+ --api-version=${SUPPORTED_QT_VERSION})
+
+ if(CMAKE_HOST_APPLE)
+ set(shiboken_framework_include_dir_list ${QT_FRAMEWORK_INCLUDE_DIR})
+ make_path(shiboken_framework_include_dirs ${shiboken_framework_include_dir_list})
+ list(APPEND shiboken_command "--framework-include-paths=${shiboken_framework_include_dirs}")
+ endif()
+
+ if(${module_DROPPED_ENTRIES})
+ list(JOIN ${module_DROPPED_ENTRIES} "\;" dropped_entries)
+ list(APPEND shiboken_command "\"--drop-type-entries=${dropped_entries}\"")
+ endif()
+
+ list(APPEND shiboken_command "${pyside6_BINARY_DIR}/${module_NAME}_global.h"
+ ${typesystem_path})
+
add_custom_command( OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/mjb_rejected_classes.log"
BYPRODUCTS ${${module_SOURCES}}
- COMMAND Shiboken6::shiboken6 ${GENERATOR_EXTRA_FLAGS}
- "${pyside6_BINARY_DIR}/${module_NAME}_global.h"
- --include-paths=${shiboken_include_dirs}
- ${shiboken_framework_include_dirs_option}
- --typesystem-paths=${pyside_binary_dir}${PATH_SEP}${pyside6_SOURCE_DIR}${PATH_SEP}${${module_TYPESYSTEM_PATH}}
- --output-directory=${CMAKE_CURRENT_BINARY_DIR}
- --license-file=${CMAKE_CURRENT_SOURCE_DIR}/../licensecomment.txt
- ${typesystem_path}
- --api-version=${SUPPORTED_QT_VERSION}
- --drop-type-entries="${dropped_entries}"
+ COMMAND ${shiboken_command}
DEPENDS ${total_type_system_files}
${module_GLUE_SOURCES}
${${module_NAME}_glue_dependency}
@@ -143,6 +220,11 @@ macro(create_pyside_module)
include_directories(${module_NAME} ${${module_INCLUDE_DIRS}} ${pyside6_SOURCE_DIR})
add_library(${module_NAME} MODULE ${${module_SOURCES}}
${${module_STATIC_SOURCES}})
+
+ append_size_optimization_flags(${module_NAME})
+
+ target_compile_definitions(${module_NAME} PRIVATE -DQT_LEAN_HEADERS=1)
+
set_target_properties(${module_NAME} PROPERTIES
PREFIX ""
OUTPUT_NAME "${module_NAME}${SHIBOKEN_PYTHON_EXTENSION_SUFFIX}"
@@ -171,7 +253,17 @@ macro(create_pyside_module)
else()
set(ld_prefix_var_name "LD_LIBRARY_PATH")
endif()
- set(ld_prefix "${ld_prefix_var_name}=${pysidebindings_BINARY_DIR}/libpyside${PATH_SEP}${SHIBOKEN_SHARED_LIBRARY_DIR}")
+
+ set(ld_prefix_list "")
+ list(APPEND ld_prefix_list "${pysidebindings_BINARY_DIR}/libpyside")
+ list(APPEND ld_prefix_list "${pysidebindings_BINARY_DIR}/libpysideqml")
+ list(APPEND ld_prefix_list "${SHIBOKEN_SHARED_LIBRARY_DIR}")
+ if(WIN32)
+ list(APPEND ld_prefix_list "${QT6_INSTALL_PREFIX}/${QT6_INSTALL_BINS}")
+ endif()
+
+ list(JOIN ld_prefix_list "${PATH_SEP}" ld_prefix_values_string)
+ set(ld_prefix "${ld_prefix_var_name}=${ld_prefix_values_string}")
# Append any existing ld_prefix values, so existing PATH, LD_LIBRARY_PATH, etc.
# On Windows it is needed because pyside modules import Qt,
@@ -196,26 +288,38 @@ macro(create_pyside_module)
string(APPEND ld_prefix ":${env_value}")
endif()
endif()
- set(generate_pyi_options ${module_NAME} --sys-path
- "${pysidebindings_BINARY_DIR}"
- "${SHIBOKEN_PYTHON_MODULE_DIR}/..") # use the layer above shiboken6
- if (QUIET_BUILD)
- list(APPEND generate_pyi_options "--quiet")
- endif()
+
+ qfp_strip_library("${module_NAME}")
# Add target to generate pyi file, which depends on the module target.
- add_custom_target("${module_NAME}_pyi" ALL
- COMMAND ${CMAKE_COMMAND} -E env ${ld_prefix}
- "${SHIBOKEN_PYTHON_INTERPRETER}"
- "${CMAKE_CURRENT_SOURCE_DIR}/../support/generate_pyi.py" ${generate_pyi_options})
- add_dependencies("${module_NAME}_pyi" ${module_NAME})
+ # Don't generate the files when cross-building because the target python can not be executed
+ # on the host machine (usually, unless you use some userspace qemu based mechanism).
+ # TODO: Can we do something better here to still get pyi files?
+ if(NOT (PYSIDE_IS_CROSS_BUILD OR DISABLE_PYI))
+ set(generate_pyi_options ${module_NAME} --sys-path
+ "${pysidebindings_BINARY_DIR}"
+ "${SHIBOKEN_PYTHON_MODULE_DIR}/..") # use the layer above shiboken6
+ if (QUIET_BUILD)
+ list(APPEND generate_pyi_options "--quiet")
+ endif()
+
+ add_custom_target("${module_NAME}_pyi" ALL
+ COMMAND
+ ${CMAKE_COMMAND} -E env ${ld_prefix}
+ "${SHIBOKEN_PYTHON_INTERPRETER}"
+ "${CMAKE_CURRENT_SOURCE_DIR}/../support/generate_pyi.py"
+ ${generate_pyi_options})
+ add_dependencies("${module_NAME}_pyi" ${module_NAME})
+
+ install(FILES "${CMAKE_CURRENT_BINARY_DIR}/../${module_NAME}.pyi"
+ DESTINATION "${PYTHON_SITE_PACKAGES}/PySide6")
+ endif()
+
# install
install(TARGETS ${module_NAME} LIBRARY DESTINATION "${PYTHON_SITE_PACKAGES}/PySide6")
- file(GLOB hinting_stub_files RELATIVE "${CMAKE_CURRENT_BINARY_DIR}/PySide6" "${CMAKE_CURRENT_BINARY_DIR}/PySide6/*.pyi")
- install(FILES ${hinting_stub_files}
- DESTINATION "${PYTHON_SITE_PACKAGES}/PySide6")
+
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/PySide6/${module_NAME}/pyside6_${lower_module_name}_python.h
DESTINATION include/PySide6${pyside6_SUFFIX}/${module_NAME}/)