Parcourir la source

Add shiboken build function to findpyside script.

Signed-off-by: sphrose <[email protected]>
sphrose il y a 2 ans
Parent
commit
8d1043bc0b

+ 138 - 3
package-system/pyside2/Findpyside2.cmake.Linux

@@ -11,7 +11,7 @@ if (TARGET ${TARGET_WITH_NAMESPACE})
     return()
 endif()
 
-add_library(${TARGET_WITH_NAMESPACE} INTERFACE IMPORTED GLOBAL)
+add_library(${TARGET_WITH_NAMESPACE} SHARED IMPORTED GLOBAL)
 
 set(PYSIDE_BASE_PATH ${CMAKE_CURRENT_LIST_DIR}/pyside2)
 
@@ -25,11 +25,38 @@ set(${MY_NAME}_RUNTIME_DEPENDENCIES
     ${PYSIDE_BASE_PATH}/lib/libshiboken2.abi3.so.5.15
     ${PYSIDE_BASE_PATH}/lib/libshiboken2.abi3.so
 )
+
 ly_add_target_files(TARGETS ${TARGET_WITH_NAMESPACE} FILES ${${MY_NAME}_RUNTIME_DEPENDENCIES})
 
 # In addition to the libraries, create a Pyside2::Tools library that handles the shiboken and pyside2-lupdate executables that are part o
 # of the pyside2 package
 set(${MY_NAME}_BIN_DIR ${CMAKE_CURRENT_LIST_DIR}/pyside2/bin)
+set(${MY_NAME}_LIB_DIR ${CMAKE_CURRENT_LIST_DIR}/pyside2/lib)
+set(${MY_NAME}_INCLUDE_DIR ${CMAKE_CURRENT_LIST_DIR}/pyside2/include)
+
+ly_target_include_system_directories(TARGET ${TARGET_WITH_NAMESPACE}
+    INTERFACE 
+        ${${MY_NAME}_INCLUDE_DIR}
+        ${${MY_NAME}_INCLUDE_DIR}/PySide2
+        ${${MY_NAME}_INCLUDE_DIR}/PySide2/QtConcurrent
+        ${${MY_NAME}_INCLUDE_DIR}/PySide2/QtCore
+        ${${MY_NAME}_INCLUDE_DIR}/PySide2/QtGui
+        ${${MY_NAME}_INCLUDE_DIR}/PySide2/QtHelp
+        ${${MY_NAME}_INCLUDE_DIR}/PySide2/QtNetwork
+        ${${MY_NAME}_INCLUDE_DIR}/PySide2/QtOpenGL
+        ${${MY_NAME}_INCLUDE_DIR}/PySide2/QtOpenGLFunctions
+        ${${MY_NAME}_INCLUDE_DIR}/PySide2/QtPrintSupport
+        ${${MY_NAME}_INCLUDE_DIR}/PySide2/QtSql
+        ${${MY_NAME}_INCLUDE_DIR}/PySide2/QtSvg
+        ${${MY_NAME}_INCLUDE_DIR}/PySide2/QtWidgets
+        ${${MY_NAME}_INCLUDE_DIR}/PySide2/QtXml
+)
+
+set_target_properties(${TARGET_WITH_NAMESPACE} PROPERTIES 
+    ${MY_NAME}_SHARE_DIR ${CMAKE_CURRENT_LIST_DIR}/pyside2/share
+    IMPORTED_LOCATION "${${MY_NAME}_LIB_DIR}/libpyside2.abi3.so"
+    IMPORTED_LOCATION_DEBUG "${${MY_NAME}_LIB_DIR}/libpyside2.abi3.so"
+)
 
 set(${MY_NAME}_TOOLS_BINARIES
     ${${MY_NAME}_BIN_DIR}/pyside2-lupdate${CMAKE_EXECUTABLE_SUFFIX}
@@ -45,7 +72,7 @@ set(${MY_NAME}_TOOLS_DEPENDENCIES
     ${${MY_NAME}_BIN_DIR}/libclang.so.13
 )
 
-add_library(${MY_NAME}::Tools INTERFACE IMPORTED GLOBAL)
+add_library(${MY_NAME}::Tools SHARED IMPORTED GLOBAL)
 
 ly_add_target_files(TARGETS ${MY_NAME}::Tools FILES
     ${${MY_NAME}_TOOLS_BINARIES}
@@ -53,7 +80,115 @@ ly_add_target_files(TARGETS ${MY_NAME}::Tools FILES
     ${${MY_NAME}_TOOLS_PYTHON_SCRIPTS}
 )
 
+ly_target_include_system_directories(TARGET ${MY_NAME}::Tools
+    INTERFACE ${${MY_NAME}_INCLUDE_DIR}/shiboken2
+)
+
+set_target_properties(${MY_NAME}::Tools PROPERTIES  
+    IMPORTED_LOCATION "${${MY_NAME}_LIB_DIR}/libshiboken2.abi3${CMAKE_SHARED_LIBRARY_SUFFIX}"
+    IMPORTED_LOCATION_DEBUG "${${MY_NAME}_LIB_DIR}/libshiboken2.abi3${CMAKE_SHARED_LIBRARY_SUFFIX}"
+)
+
 add_library(${TARGET_WITH_NAMESPACE}::Tools ALIAS ${MY_NAME}::Tools)
 
-set(${MY_NAME}_FOUND True)
+# Add shiboken generator exe tool.
+add_executable(${MY_NAME}::ShibokenTool IMPORTED GLOBAL)
+set_target_properties(${MY_NAME}::ShibokenTool PROPERTIES IMPORTED_LOCATION "${${MY_NAME}_BIN_DIR}/shiboken2${CMAKE_EXECUTABLE_SUFFIX}")
+add_executable(${TARGET_WITH_NAMESPACE}::ShibokenTool ALIAS ${MY_NAME}::ShibokenTool)
+
+function(add_shiboken_project)
+    set(oneValueArgs NAMESPACE NAME WRAPPED_HEADER TYPESYSTEM_FILE GENERATED_FILES LICENSE_HEADER)
+    set(multiValueArgs INCLUDE_DIRS DEPENDENCIES)
+    cmake_parse_arguments(add_shiboken_project "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} )
+    
+    # Validate arguments
+    if(NOT add_shiboken_project_WRAPPED_HEADER)
+        message(FATAL_ERROR "You must provide a header file containing all headers to be reflected.")
+    endif()
+    
+    if(NOT add_shiboken_project_TYPESYSTEM_FILE)
+        message(FATAL_ERROR "You must provide a typesystem file containing all items to be reflected.")
+    endif()
+    
+    if(NOT add_shiboken_project_GENERATED_FILES)
+        message(FATAL_ERROR "You must provide a cmake file containing all the cpp files that will be generated.")
+    endif()
+    
+    # Include generated_files: this should define the GENERATED_FILES list.
+    include(${add_shiboken_project_GENERATED_FILES})
+    if(NOT GENERATED_FILES)
+        message(FATAL_ERROR "You must provide a GENERATED_FILES list.")
+    endif()
+    
+    # Reformat the include dirs array to add in "-I" to each entry, or shiboken won't work.
+    list(TRANSFORM add_shiboken_project_INCLUDE_DIRS PREPEND "-I")                    
+    
+    # Reformat the generated files list to prepend the containing folder.
+    list(TRANSFORM GENERATED_FILES PREPEND "${CMAKE_CURRENT_BINARY_DIR}/${add_shiboken_project_NAME}/")
+    
+    get_property(SHARE_DIR TARGET 3rdParty::pyside2 PROPERTY pyside2_SHARE_DIR)
+        
+    # Allow AUTOMOC/AUTOUIC on generated files.
+    if(POLICY CMP0071)
+      cmake_policy(SET CMP0071 NEW)
+    endif()
+    set(CMAKE_AUTOMOC ON)
+    
+    set(shiboken_options --generator-set=shiboken --enable-parent-ctor-heuristic
+        --enable-pyside-extensions --enable-return-value-heuristic --use-isnull-as-nb_nonzero
+        --avoid-protected-hack --language-level=c++17 --debug-level=full
+        --license-file=${add_shiboken_project_LICENSE_HEADER}
+        ${add_shiboken_project_INCLUDE_DIRS}
+        -T${SHARE_DIR}/PySide2
+        -T${SHARE_DIR}/PySide2/typesystems
+        --output-directory=${CMAKE_CURRENT_BINARY_DIR}
+    )
+    
+    set(generated_sources_dependencies ${add_shiboken_project_WRAPPED_HEADER} ${add_shiboken_project_TYPESYSTEM_FILE})
+    
+    # Custom shiboken command to generate wrapped files.
+    add_custom_command(
+        OUTPUT ${GENERATED_FILES}
+        COMMAND 3rdParty::pyside2::ShibokenTool ${shiboken_options} ${add_shiboken_project_WRAPPED_HEADER} ${add_shiboken_project_TYPESYSTEM_FILE}
+        DEPENDS ${generated_sources_dependencies} 3rdParty::pyside2
+        COMMENT "Running generator for ${add_shiboken_project_TYPESYSTEM_FILE}."
+        VERBATIM
+    )
+    
+    # Set up the project for building the code generated by shiboken.
+    ly_add_target(
+        NAME ${add_shiboken_project_NAME}.Editor MODULE
+        NAMESPACE add_shiboken_project_NAMESPACE
+        OUTPUT_NAME ${add_shiboken_project_NAME}
+        # We need to provide a FILES_CMAKE, but as the files do not yet exist, project creation would fail if it actually 
+        # had a FILES list. The files are actually added in by the following TARGET_SOURCES step.
+        FILES_CMAKE
+            ${add_shiboken_project_GENERATED_FILES}
+        BUILD_DEPENDENCIES
+            PUBLIC
+                3rdParty::pyside2
+                Qt5::Widgets
+                Qt5::Core
+                Qt5::Widgets
+                Qt5::Gui
+                ${add_shiboken_project_DEPENDENCIES}
+            PRIVATE
+                3rdParty::pyside2::Tools
+    )
+        
+    ly_create_alias(NAME ${add_shiboken_project_NAME}.Builders NAMESPACE add_shiboken_project_NAMESPACE TARGETS ${add_shiboken_project_NAME}.Editor)
+    ly_create_alias(NAME ${add_shiboken_project_NAME}.Tools NAMESPACE add_shiboken_project_NAMESPACE TARGETS ${add_shiboken_project_NAME}.Builders)
+    
+    target_sources(${add_shiboken_project_NAME}.Editor PRIVATE ${GENERATED_FILES})
+
+    # Building the wrapper files will not work with a unity build.
+    set_target_properties(${add_shiboken_project_NAME}.Editor PROPERTIES UNITY_BUILD OFF)
 
+    # Fix the name of the module.
+    set_property(TARGET ${add_shiboken_project_NAME}.Editor PROPERTY PREFIX "")
+    set_property(TARGET ${add_shiboken_project_NAME}.Editor PROPERTY SUFFIX ".pyd")
+
+    set_target_properties(${add_shiboken_project_NAME}.Editor PROPERTIES LINK_FLAGS "${python_additional_link_flags}")
+endfunction()
+
+set(${MY_NAME}_FOUND True)

+ 152 - 2
package-system/pyside2/Findpyside2.cmake.Windows

@@ -12,13 +12,40 @@ if (TARGET ${TARGET_WITH_NAMESPACE})
 endif()
 
 # Install the pyside2 site-packages into Python
-add_library(${TARGET_WITH_NAMESPACE} INTERFACE IMPORTED GLOBAL)
+add_library(${TARGET_WITH_NAMESPACE} SHARED IMPORTED GLOBAL)
 
 ly_pip_install_local_package_editable(${CMAKE_CURRENT_LIST_DIR}/pyside2/lib/site-packages pyside2)
 
 # In addition to the libraries, create a Pyside2::Tools library that handles the shiboken and pyside2-lupdate executables that are part o
 # of the pyside2 package
 set(${MY_NAME}_BIN_DIR ${CMAKE_CURRENT_LIST_DIR}/pyside2/bin)
+set(${MY_NAME}_LIB_DIR ${CMAKE_CURRENT_LIST_DIR}/pyside2/lib)
+set(${MY_NAME}_INCLUDE_DIR ${CMAKE_CURRENT_LIST_DIR}/pyside2/include)
+
+ly_target_include_system_directories(TARGET ${TARGET_WITH_NAMESPACE}
+    INTERFACE 
+        ${${MY_NAME}_INCLUDE_DIR}
+        ${${MY_NAME}_INCLUDE_DIR}/PySide2
+        ${${MY_NAME}_INCLUDE_DIR}/PySide2/QtConcurrent
+        ${${MY_NAME}_INCLUDE_DIR}/PySide2/QtCore
+        ${${MY_NAME}_INCLUDE_DIR}/PySide2/QtGui
+        ${${MY_NAME}_INCLUDE_DIR}/PySide2/QtNetwork
+        ${${MY_NAME}_INCLUDE_DIR}/PySide2/QtOpenGL
+        ${${MY_NAME}_INCLUDE_DIR}/PySide2/QtOpenGLFunctions
+        ${${MY_NAME}_INCLUDE_DIR}/PySide2/QtPrintSupport
+        ${${MY_NAME}_INCLUDE_DIR}/PySide2/QtSql
+        ${${MY_NAME}_INCLUDE_DIR}/PySide2/QtSvg
+        ${${MY_NAME}_INCLUDE_DIR}/PySide2/QtTest
+        ${${MY_NAME}_INCLUDE_DIR}/PySide2/QtUiTools
+        ${${MY_NAME}_INCLUDE_DIR}/PySide2/QtWidgets
+        ${${MY_NAME}_INCLUDE_DIR}/PySide2/QtWinExtras
+        ${${MY_NAME}_INCLUDE_DIR}/PySide2/QtXml
+)
+
+set_target_properties(${TARGET_WITH_NAMESPACE} PROPERTIES 
+    ${MY_NAME}_SHARE_DIR ${CMAKE_CURRENT_LIST_DIR}/pyside2/share
+    IMPORTED_LOCATION ${SHIBOKEN_SHARED_LIBRARIES} "${${MY_NAME}_LIB_DIR}/libshiboken2.abi3.so"
+)
 
 set(${MY_NAME}_TOOLS_BINARIES
     ${${MY_NAME}_BIN_DIR}/pyside2-lupdate${CMAKE_EXECUTABLE_SUFFIX}
@@ -34,7 +61,7 @@ set(${MY_NAME}_TOOLS_DEPENDENCIES
     ${${MY_NAME}_BIN_DIR}/libclang.dll
 )
 
-add_library(${MY_NAME}::Tools INTERFACE IMPORTED GLOBAL)
+add_library(${MY_NAME}::Tools SHARED IMPORTED GLOBAL)
 
 ly_add_target_files(TARGETS ${MY_NAME}::Tools FILES
     ${${MY_NAME}_TOOLS_BINARIES}
@@ -42,6 +69,129 @@ ly_add_target_files(TARGETS ${MY_NAME}::Tools FILES
     ${${MY_NAME}_TOOLS_PYTHON_SCRIPTS}
 )
 
+ly_target_include_system_directories(TARGET ${MY_NAME}::Tools
+    INTERFACE ${${MY_NAME}_INCLUDE_DIR}/shiboken2
+)
+
+set_target_properties(${MY_NAME}::Tools PROPERTIES  
+    IMPORTED_IMPLIB "${${MY_NAME}_LIB_DIR}/site-packages/shiboken2/shiboken2.abi3${CMAKE_STATIC_LIBRARY_SUFFIX}"
+    IMPORTED_LOCATION "${${MY_NAME}_LIB_DIR}/site-packages/shiboken2/shiboken2.abi3${CMAKE_SHARED_LIBRARY_SUFFIX}"
+    IMPORTED_IMPLIB_DEBUG "${${MY_NAME}_LIB_DIR}/site-packages/shiboken2/shiboken2_d.cp310-win_amd64${CMAKE_STATIC_LIBRARY_SUFFIX}"
+    IMPORTED_LOCATION_DEBUG "${${MY_NAME}_LIB_DIR}/site-packages/shiboken2/shiboken2_d.cp310-win_amd64${CMAKE_SHARED_LIBRARY_SUFFIX}"
+)
+
 add_library(${TARGET_WITH_NAMESPACE}::Tools ALIAS ${MY_NAME}::Tools)
 
+# Add shiboken generator exe tool.
+add_executable(${MY_NAME}::ShibokenTool IMPORTED GLOBAL)
+set_target_properties(${MY_NAME}::ShibokenTool PROPERTIES IMPORTED_LOCATION "${${MY_NAME}_BIN_DIR}/shiboken2${CMAKE_EXECUTABLE_SUFFIX}")
+add_executable(${TARGET_WITH_NAMESPACE}::ShibokenTool ALIAS ${MY_NAME}::ShibokenTool)
+
+function(add_shiboken_project)
+    set(oneValueArgs NAMESPACE NAME WRAPPED_HEADER TYPESYSTEM_FILE GENERATED_FILES LICENSE_HEADER)
+    set(multiValueArgs INCLUDE_DIRS DEPENDENCIES)
+    cmake_parse_arguments(add_shiboken_project "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} )
+    
+    # Validate arguments
+    if(NOT add_shiboken_project_WRAPPED_HEADER)
+        message(FATAL_ERROR "You must provide a header file containing all headers to be reflected.")
+    endif()
+    
+    if(NOT add_shiboken_project_TYPESYSTEM_FILE)
+        message(FATAL_ERROR "You must provide a typesystem file containing all items to be reflected.")
+    endif()
+    
+    if(NOT add_shiboken_project_GENERATED_FILES)
+        message(FATAL_ERROR "You must provide a cmake file containing all the cpp files that will be generated.")
+    endif()
+    
+    # Include generated_files: this should define the GENERATED_FILES list.
+    include(${add_shiboken_project_GENERATED_FILES})
+    if(NOT GENERATED_FILES)
+        message(FATAL_ERROR "You must provide a GENERATED_FILES list.")
+    endif()
+    
+    # Reformat the include dirs array to add in "-I" to each entry, or shiboken won't work.
+    list(TRANSFORM add_shiboken_project_INCLUDE_DIRS PREPEND "-I")                    
+    
+    # Reformat the generated files list to prepend the containing folder.
+    list(TRANSFORM GENERATED_FILES PREPEND "${CMAKE_CURRENT_BINARY_DIR}/${add_shiboken_project_NAME}/")
+    
+    get_property(SHARE_DIR TARGET 3rdParty::pyside2 PROPERTY pyside2_SHARE_DIR)
+        
+    # Allow AUTOMOC/AUTOUIC on generated files.
+    if(POLICY CMP0071)
+      cmake_policy(SET CMP0071 NEW)
+    endif()
+    set(CMAKE_AUTOMOC ON)
+    
+    set(shiboken_options --generator-set=shiboken --enable-parent-ctor-heuristic
+        --enable-pyside-extensions --enable-return-value-heuristic --use-isnull-as-nb_nonzero
+        --avoid-protected-hack --language-level=c++17 --debug-level=full
+        --license-file=${add_shiboken_project_LICENSE_HEADER}
+        ${add_shiboken_project_INCLUDE_DIRS}
+        -T${SHARE_DIR}/PySide2
+        -T${SHARE_DIR}/PySide2/typesystems
+        --output-directory=${CMAKE_CURRENT_BINARY_DIR}
+    )
+    
+    set(generated_sources_dependencies ${add_shiboken_project_WRAPPED_HEADER} ${add_shiboken_project_TYPESYSTEM_FILE})
+    
+    # Custom shiboken command to generate wrapped files.
+    add_custom_command(
+        OUTPUT ${GENERATED_FILES}
+        COMMAND 3rdParty::pyside2::ShibokenTool ${shiboken_options} ${add_shiboken_project_WRAPPED_HEADER} ${add_shiboken_project_TYPESYSTEM_FILE}
+        DEPENDS ${generated_sources_dependencies} 3rdParty::pyside2
+        COMMENT "Running generator for ${add_shiboken_project_TYPESYSTEM_FILE}."
+        VERBATIM
+    )
+    
+    # Set up the project for building the code generated by shiboken.
+    ly_add_target(
+        NAME ${add_shiboken_project_NAME}.Editor MODULE
+        NAMESPACE add_shiboken_project_NAMESPACE
+        OUTPUT_NAME ${add_shiboken_project_NAME}
+        # We need to provide a FILES_CMAKE, but as the files do not yet exist, project creation would fail if it actually 
+        # had a FILES list. The files are actually added in by the following TARGET_SOURCES step.
+        FILES_CMAKE
+            ${add_shiboken_project_GENERATED_FILES}
+        BUILD_DEPENDENCIES
+            PUBLIC
+                3rdParty::pyside2
+                Qt5::Widgets
+                Qt5::Core
+                Qt5::Widgets
+                Qt5::Gui
+                ${add_shiboken_project_DEPENDENCIES}
+            PRIVATE
+                3rdParty::pyside2::Tools
+    )
+        
+    ly_create_alias(NAME ${add_shiboken_project_NAME}.Builders NAMESPACE add_shiboken_project_NAMESPACE TARGETS ${add_shiboken_project_NAME}.Editor)
+    ly_create_alias(NAME ${add_shiboken_project_NAME}.Tools NAMESPACE add_shiboken_project_NAMESPACE TARGETS ${add_shiboken_project_NAME}.Builders)
+    
+    target_sources(${add_shiboken_project_NAME}.Editor PRIVATE ${GENERATED_FILES})
+
+    # Building the wrapper files will not work with a unity build.
+    set_target_properties(${add_shiboken_project_NAME}.Editor PROPERTIES UNITY_BUILD OFF)
+
+    # Append _d to the module name in a debug build.
+    set_target_properties(${add_shiboken_project_NAME}.Editor PROPERTIES DEBUG_POSTFIX "_d")
+
+    if (PAL_PLATFORM_NAME STREQUAL "Windows")
+        # Disable various warnings in shiboken generated wrapper code.
+        #"conditional expression is constant"
+        #"unreferenced formal parameter"
+        #"declaration of 'x' hides previous local declaration."
+        #"declaration of 'x' hides class member."
+        target_compile_options(${add_shiboken_project_NAME}.Editor PRIVATE /wd4127 /wd4100 /wd4456 /wd4458)
+    endif()
+
+    # Fix the name of the module.
+    set_property(TARGET ${add_shiboken_project_NAME}.Editor PROPERTY PREFIX "")
+    set_property(TARGET ${add_shiboken_project_NAME}.Editor PROPERTY SUFFIX ".pyd")
+
+    set_target_properties(${add_shiboken_project_NAME}.Editor PROPERTIES LINK_FLAGS "${python_additional_link_flags}")
+endfunction()
+
 set(${MY_NAME}_FOUND True)

+ 1 - 1
package-system/pyside2/build_config.json

@@ -2,7 +2,7 @@
     "git_url": "https://code.qt.io/cgit/pyside/pyside-setup.git",
     "git_tag": "v5.15.2.1",
     "package_name": "pyside2",
-    "package_version": "5.15.2.1-py3.10-rev3",
+    "package_version": "5.15.2.1-py3.10-rev4",
     "package_url": "https://code.qt.io/cgit/pyside/pyside-setup.git",
     "package_license": "custom",
     "package_license_file": "pyside2/LICENSE.LGPLv3",