diff --git a/cmake/Python/FindPySide2.cmake b/cmake/Python/FindPySide2.cmake index c117932c..3599eaba 100644 --- a/cmake/Python/FindPySide2.cmake +++ b/cmake/Python/FindPySide2.cmake @@ -25,99 +25,123 @@ # # You can install PySide2 from Qt repository with # pip3 install --index-url=http://download.qt.io/snapshots/ci/pyside//latest/ pyside2 --trusted-host download.qt.io +find_package(PkgConfig REQUIRED) +pkg_check_modules(PYSIDE2_PRIV pyside2 QUIET) set(PYSIDE2_FOUND FALSE) -set(PYSIDE2_CUSTOM_PREFIX "/usr/" CACHE PATH "Extra path to look for PySide components.") -# extract python library basename -list(GET Python3_LIBRARIES 0 PYTHON_LIBRARY_FILENAME) -get_filename_component(PYTHON_LIBRARY_FILENAME ${PYTHON_LIBRARY_FILENAME} NAME) - -execute_process( - COMMAND ${Python3_EXECUTABLE} -c "if True: - import os, sys - try: - import PySide2.QtCore as QtCore - print(os.path.dirname(QtCore.__file__)) - except Exception as error: - print(error, file=sys.stderr) - exit() - " - OUTPUT_VARIABLE PYSIDE2_BASEDIR - OUTPUT_STRIP_TRAILING_WHITESPACE -) - -if(PYSIDE2_BASEDIR) - set(PYSIDE_BASEDIR ${PYSIDE2_BASEDIR} CACHE PATH "Top level install of PySide2" FORCE) - execute_process( - COMMAND ${Python3_EXECUTABLE} -c "if True: - import os - import PySide2.QtCore as QtCore - print(os.path.basename(QtCore.__file__).split('.', 1)[1]) - " - OUTPUT_VARIABLE PYSIDE2_SUFFIX - OUTPUT_STRIP_TRAILING_WHITESPACE +if(PYSIDE2_PRIV_FOUND) + set(PYSIDE2_FOUND TRUE) + message(STATUS "Using PySide2 found in the system!") + pkg_get_variable(SHIBOKEN_BINARY + pyside2 + generator_location ) + pkg_get_variable(PYSIDE2_BASEDIR + pyside2 + typesystemdir + ) + pkg_get_variable(PYSIDE_INCLUDE_DIR + pyside2 + includedir + ) + set(PYSIDE_TYPESYSTEMS ${PYSIDE2_BASEDIR}) + set(PYSIDE2_SO_VERSION ${PYSIDE2_PRIV_VERSION}) + set(PYSIDE_LIBRARY ${PYSIDE2_PRIV_LINK_LIBRARIES}) + list(GET PYSIDE_LIBRARY 0 PYSIDE_LIBRARY) +else() + # extract python library basename + list(GET Python3_LIBRARIES 0 PYTHON_LIBRARY_FILENAME) + get_filename_component(PYTHON_LIBRARY_FILENAME ${PYTHON_LIBRARY_FILENAME} NAME) execute_process( COMMAND ${Python3_EXECUTABLE} -c "if True: - import os - import PySide2.QtCore as QtCore - print(';'.join(map(str, QtCore.__version_info__))) + import os, sys + try: + import PySide2.QtCore as QtCore + print(os.path.dirname(QtCore.__file__)) + except Exception as error: + print(error, file=sys.stderr) + exit() " - OUTPUT_VARIABLE PYSIDE2_SO_VERSION + OUTPUT_VARIABLE PYSIDE2_BASEDIR OUTPUT_STRIP_TRAILING_WHITESPACE ) - list(GET PYSIDE2_SO_VERSION 0 PYSIDE2_SO_MACRO_VERSION) - list(GET PYSIDE2_SO_VERSION 1 PYSIDE2_SO_MICRO_VERSION) - list(GET PYSIDE2_SO_VERSION 2 PYSIDE2_SO_MINOR_VERSION) - string(REPLACE ";" "." PYSIDE2_SO_VERSION "${PYSIDE2_SO_VERSION}") - if(NOT APPLE) - set(PYSIDE2_SUFFIX "${PYSIDE2_SUFFIX}.${PYSIDE2_SO_MACRO_VERSION}.${PYSIDE2_SO_MICRO_VERSION}") - else() - string(REPLACE ".so" "" PYSIDE2_SUFFIX ${PYSIDE2_SUFFIX}) - set(PYSIDE2_SUFFIX "${PYSIDE2_SUFFIX}.${PYSIDE2_SO_MACRO_VERSION}.${PYSIDE2_SO_MICRO_VERSION}.dylib") + if(PYSIDE2_BASEDIR) + set(PYSIDE_BASEDIR ${PYSIDE2_BASEDIR} CACHE PATH "Top level install of PySide2" FORCE) + execute_process( + COMMAND ${Python3_EXECUTABLE} -c "if True: + import os + import PySide2.QtCore as QtCore + print(os.path.basename(QtCore.__file__).split('.', 1)[1]) + " + OUTPUT_VARIABLE PYSIDE2_SUFFIX + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + + execute_process( + COMMAND ${Python3_EXECUTABLE} -c "if True: + import os + import PySide2.QtCore as QtCore + print(';'.join(map(str, QtCore.__version_info__))) + " + OUTPUT_VARIABLE PYSIDE2_SO_VERSION + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + list(GET PYSIDE2_SO_VERSION 0 PYSIDE2_SO_MACRO_VERSION) + list(GET PYSIDE2_SO_VERSION 1 PYSIDE2_SO_MICRO_VERSION) + list(GET PYSIDE2_SO_VERSION 2 PYSIDE2_SO_MINOR_VERSION) + string(REPLACE ";" "." PYSIDE2_SO_VERSION "${PYSIDE2_SO_VERSION}") + + if(NOT APPLE) + set(PYSIDE2_SUFFIX "${PYSIDE2_SUFFIX}.${PYSIDE2_SO_MACRO_VERSION}.${PYSIDE2_SO_MICRO_VERSION}") + else() + string(REPLACE ".so" "" PYSIDE2_SUFFIX ${PYSIDE2_SUFFIX}) + set(PYSIDE2_SUFFIX "${PYSIDE2_SUFFIX}.${PYSIDE2_SO_MACRO_VERSION}.${PYSIDE2_SO_MICRO_VERSION}.dylib") + endif() + + set(PYSIDE2_FOUND TRUE) + message(STATUS "PySide2 base dir: ${PYSIDE2_BASEDIR}" ) + message(STATUS "PySide2 suffix: ${PYSIDE2_SUFFIX}") endif() - set(PYSIDE2_FOUND TRUE) - message(STATUS "PySide2 base dir: ${PYSIDE2_BASEDIR}" ) - message(STATUS "PySide2 version: ${PYSIDE2_SO_VERSION}") - message(STATUS "PySide2 suffix: ${PYSIDE2_SUFFIX}") + if (PYSIDE2_FOUND) + #PySide + #=============================================================================== + find_path(PYSIDE_INCLUDE_DIR + pyside.h + PATHS ${PYSIDE2_BASEDIR}/include ${PYSIDE2_CUSTOM_PREFIX}/include/PySide2 + NO_DEFAULT_PATH) + + # Platform specific library names + if(MSVC) + SET(PYSIDE_LIBRARY_BASENAMES "pyside2.abi3.lib") + elseif(CYGWIN) + SET(PYSIDE_LIBRARY_BASENAMES "") + elseif(WIN32) + SET(PYSIDE_LIBRARY_BASENAMES "libpyside2.${PYSIDE2_SUFFIX}") + else() + SET(PYSIDE_LIBRARY_BASENAMES "libpyside2.${PYSIDE2_SUFFIX}") + endif() + + find_file(PYSIDE_LIBRARY + ${PYSIDE_LIBRARY_BASENAMES} + PATHS ${PYSIDE2_BASEDIR} ${PYSIDE2_CUSTOM_PREFIX}/lib + NO_DEFAULT_PATH) + + find_path(PYSIDE_TYPESYSTEMS + typesystem_core.xml + PATHS ${PYSIDE2_BASEDIR}/typesystems ${PYSIDE2_CUSTOM_PREFIX}/share/PySide2/typesystems + NO_DEFAULT_PATH) + endif() endif() -if (PYSIDE2_FOUND) - #PySide - #=============================================================================== - find_path(PYSIDE_INCLUDE_DIR - pyside.h - PATHS ${PYSIDE2_BASEDIR}/include ${PYSIDE2_CUSTOM_PREFIX}/include/PySide2 - NO_DEFAULT_PATH) - - # Platform specific library names - if(MSVC) - SET(PYSIDE_LIBRARY_BASENAMES "pyside2.abi3.lib") - elseif(CYGWIN) - SET(PYSIDE_LIBRARY_BASENAMES "") - elseif(WIN32) - SET(PYSIDE_LIBRARY_BASENAMES "libpyside2.${PYSIDE2_SUFFIX}") - else() - SET(PYSIDE_LIBRARY_BASENAMES "libpyside2.${PYSIDE2_SUFFIX}") - endif() - - find_file(PYSIDE_LIBRARY - ${PYSIDE_LIBRARY_BASENAMES} - PATHS ${PYSIDE2_BASEDIR} ${PYSIDE2_CUSTOM_PREFIX}/lib - NO_DEFAULT_PATH) - - find_path(PYSIDE_TYPESYSTEMS - typesystem_core.xml - PATHS ${PYSIDE2_BASEDIR}/typesystems ${PYSIDE2_CUSTOM_PREFIX}/share/PySide2/typesystems - NO_DEFAULT_PATH) - +if(PYSIDE2_FOUND) message(STATUS "PySide include dir: ${PYSIDE_INCLUDE_DIR}") message(STATUS "PySide library: ${PYSIDE_LIBRARY}") message(STATUS "PySide typesystems: ${PYSIDE_TYPESYSTEMS}") + message(STATUS "PySide2 version: ${PYSIDE2_SO_VERSION}") # Create PySide2 target add_library(PySide2::pyside2 SHARED IMPORTED GLOBAL) @@ -137,6 +161,7 @@ if (PYSIDE2_FOUND) ) endif() + find_package_handle_standard_args(PySide2 REQUIRED_VARS PYSIDE2_BASEDIR PYSIDE_INCLUDE_DIR PYSIDE_LIBRARY PYSIDE_TYPESYSTEMS VERSION_VAR PYSIDE2_SO_VERSION diff --git a/cmake/Python/FindShiboken2.cmake b/cmake/Python/FindShiboken2.cmake index ce3de4c3..6f124026 100644 --- a/cmake/Python/FindShiboken2.cmake +++ b/cmake/Python/FindShiboken2.cmake @@ -25,119 +25,145 @@ # You can install Shiboken from Qt repository with # pip3 install --index-url=http://download.qt.io/snapshots/ci/pyside//latest/ shiboken2-generator --trusted-host download.qt.io +find_package(PkgConfig REQUIRED) +pkg_check_modules(SHIBOKEN2_PRIV shiboken2 QUIET) + set(SHIBOKEN_FOUND FALSE) -execute_process( - COMMAND ${Python3_EXECUTABLE} -c "if True: - import os - try: - import shiboken2_generator - print(shiboken2_generator.__path__[0]) - except: - exit() - " - OUTPUT_VARIABLE SHIBOKEN_GENERATOR_BASEDIR - OUTPUT_STRIP_TRAILING_WHITESPACE -) -execute_process( - COMMAND ${Python3_EXECUTABLE} -c "if True: - import os - try: - import shiboken2 - print(shiboken2.__path__[0]) - except: - exit() - " - OUTPUT_VARIABLE SHIBOKEN_BASEDIR - OUTPUT_STRIP_TRAILING_WHITESPACE -) -execute_process( - COMMAND ${Python3_EXECUTABLE} -c "if True: - import os - import shiboken2 - print(';'.join(filter(None, map(str, shiboken2.__version_info__)))) - " - OUTPUT_VARIABLE SHIBOKEN_VERSION - OUTPUT_STRIP_TRAILING_WHITESPACE -) -list(GET SHIBOKEN_VERSION 0 SHIBOKEN_MACRO_VERSION) -list(GET SHIBOKEN_VERSION 1 SHIBOKEN_MICRO_VERSION) -list(GET SHIBOKEN_VERSION 2 SHIBOKEN_MINOR_VERSION) -string(REPLACE ";" "." SHIBOKEN_VERSION "${SHIBOKEN_VERSION}") +if(SHIBOKEN2_PRIV_FOUND) + set(SHIBOKEN_FOUND TRUE) + message(STATUS "Using shiboken found in the system!") + pkg_get_variable(SHIBOKEN_BINARY + shiboken2 + generator_location + ) + pkg_get_variable(SHIBOKEN_BASEDIR + shiboken2 + libdir + ) + pkg_get_variable(SHIBOKEN_INCLUDE_DIR + shiboken2 + includedir + ) + set(SHIBOKEN_VERSION ${SHIBOKEN2_PRIV_VERSION}) + set(SHIBOKEN_LIBRARY ${SHIBOKEN2_PRIV_LINK_LIBRARIES}) +else() + execute_process( + COMMAND ${Python3_EXECUTABLE} -c "if True: + import os + try: + import shiboken2_generator + print(shiboken2_generator.__path__[0]) + except: + exit() + " + OUTPUT_VARIABLE SHIBOKEN_GENERATOR_BASEDIR + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + execute_process( + COMMAND ${Python3_EXECUTABLE} -c "if True: + import os + try: + import shiboken2 + print(shiboken2.__path__[0]) + except: + exit() + " + OUTPUT_VARIABLE SHIBOKEN_BASEDIR + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + execute_process( + COMMAND ${Python3_EXECUTABLE} -c "if True: + import os + import shiboken2 + print(';'.join(filter(None, map(str, shiboken2.__version_info__)))) + " + OUTPUT_VARIABLE SHIBOKEN_VERSION + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + list(GET SHIBOKEN_VERSION 0 SHIBOKEN_MACRO_VERSION) + list(GET SHIBOKEN_VERSION 1 SHIBOKEN_MICRO_VERSION) + list(GET SHIBOKEN_VERSION 2 SHIBOKEN_MINOR_VERSION) + string(REPLACE ";" "." SHIBOKEN_VERSION "${SHIBOKEN_VERSION}") -message(STATUS "ShibokenGenerator base dir: ${SHIBOKEN_GENERATOR_BASEDIR}") -message(STATUS "Shiboken base dir: ${SHIBOKEN_BASEDIR}") -message(STATUS "Shiboken version: ${SHIBOKEN_VERSION}") + message(STATUS "ShibokenGenerator base dir: ${SHIBOKEN_GENERATOR_BASEDIR}") + message(STATUS "Shiboken base dir: ${SHIBOKEN_BASEDIR}") + message(STATUS "Shiboken custom path: ${SHIBOKEN_CUSTOM_PATH}") -if(SHIBOKEN_BASEDIR) - find_path(SHIBOKEN_INCLUDE_DIR - shiboken.h - PATHS ${SHIBOKEN_GENERATOR_BASEDIR}/include - NO_DEFAULT_PATH) - if(MSVC) - SET(SHIBOKEN_LIBRARY_BASENAMES "shiboken2.abi3.lib") - elseif(CYGWIN) - SET(SHIBOKEN_LIBRARY_BASENAMES "") - elseif(WIN32) - SET(SHIBOKEN_LIBRARY_BASENAMES "libshiboken2.${PYSIDE2_SUFFIX}") - else() - SET(SHIBOKEN_LIBRARY_BASENAMES - libshiboken2.abi3.so - libshiboken2.abi3.so.${SHIBOKEN_MACRO_VERSION} - libshiboken2.abi3.so.${SHIBOKEN_MACRO_VERSION}.${SHIBOKEN_MICRO_VERSION} - libshiboken2.abi3.so.${SHIBOKEN_VERSION} + if(SHIBOKEN_BASEDIR) + find_path(SHIBOKEN_INCLUDE_DIR + shiboken.h + PATHS ${SHIBOKEN_CUSTOM_PATH} ${SHIBOKEN_GENERATOR_BASEDIR}/include + NO_DEFAULT_PATH) + if(MSVC) + SET(SHIBOKEN_LIBRARY_BASENAMES "shiboken2.abi3.lib") + elseif(CYGWIN) + SET(SHIBOKEN_LIBRARY_BASENAMES "") + elseif(WIN32) + SET(SHIBOKEN_LIBRARY_BASENAMES "libshiboken2.${PYSIDE2_SUFFIX}") + else() + SET(SHIBOKEN_LIBRARY_BASENAMES + libshiboken2.abi3.so + libshiboken2.abi3.so.${SHIBOKEN_MACRO_VERSION} + libshiboken2.abi3.so.${SHIBOKEN_MACRO_VERSION}.${SHIBOKEN_MICRO_VERSION} + libshiboken2.abi3.so.${SHIBOKEN_VERSION} + libshiboken2.abi3.so + ) + endif() + + if (NOT SHIBOKEN_INCLUDE_DIR) + return() + endif() + set(SHIBOKEN_SEARCH_PATHS ${SHIBOKEN_CUSTOM_PATH}) + list(APPEND SHIBOKEN_SEARCH_PATHS ${SHIBOKEN_BASEDIR}) + list(APPEND SHIBOKEN_SEARCH_PATHS ${SHIBOKEN_GENERATOR_BASEDIR}) + + find_file(SHIBOKEN_LIBRARY + ${SHIBOKEN_LIBRARY_BASENAMES} + PATHS ${SHIBOKEN_SEARCH_PATHS} + NO_DEFAULT_PATH) + + find_program(SHIBOKEN_BINARY + shiboken2 + PATHS ${SHIBOKEN_SEARCH_PATHS} + NO_DEFAULT_PATH ) endif() - - if (NOT SHIBOKEN_INCLUDE_DIR) - return() - endif() - - find_file(SHIBOKEN_LIBRARY - ${SHIBOKEN_LIBRARY_BASENAMES} - PATHS ${SHIBOKEN_BASEDIR} - NO_DEFAULT_PATH) - - find_program(SHIBOKEN_BINARY - shiboken2 - PATHS ${SHIBOKEN_GENERATOR_BASEDIR} - NO_DEFAULT_PATH - ) - - message(STATUS "Shiboken include dir: ${SHIBOKEN_INCLUDE_DIR}") - message(STATUS "Shiboken library: ${SHIBOKEN_LIBRARY}") - message(STATUS "Shiboken binary: ${SHIBOKEN_BINARY}") - if (SHIBOKEN_INCLUDE_DIR AND SHIBOKEN_LIBRARY AND SHIBOKEN_BINARY) set(SHIBOKEN_FOUND TRUE) endif() -else() - set(SHIBOKEN_FOUND FALSE) -endif() + if(SHIBOKEN_FOUND) + endif() -if(MSVC) - # On Windows we must link to python3.dll that is a small library that links against python3x.dll - # that allow us to choose any python3x.dll at runtime - execute_process( - COMMAND ${Python3_EXECUTABLE} -c "if True: - for lib in '${Python3_LIBRARIES}'.split(';'): - if '/' in lib: - prefix, py = lib.rsplit('/', 1) - if py.startswith('python3'): - print(prefix + '/python3.lib') - break - " - OUTPUT_VARIABLE PYTHON_LIMITED_LIBRARIES - OUTPUT_STRIP_TRAILING_WHITESPACE - ) -else() - # On Linux and MacOs our modules should not link with any python library - # that must be handled by the main process - set(PYTHON_LIMITED_LIBRARIES "") -endif() + if(MSVC) + # On Windows we must link to python3.dll that is a small library that links against python3x.dll + # that allow us to choose any python3x.dll at runtime + execute_process( + COMMAND ${Python3_EXECUTABLE} -c "if True: + for lib in '${Python3_LIBRARIES}'.split(';'): + if '/' in lib: + prefix, py = lib.rsplit('/', 1) + if py.startswith('python3'): + print(prefix + '/python3.lib') + break + " + OUTPUT_VARIABLE PYTHON_LIMITED_LIBRARIES + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + else() + # On Linux and MacOs our modules should not link with any python library + # that must be handled by the main process + set(PYTHON_LIMITED_LIBRARIES "") + endif() +endif() if (SHIBOKEN_FOUND) + message(STATUS "Shiboken include dir: ${SHIBOKEN_INCLUDE_DIR}") + message(STATUS "Shiboken library: ${SHIBOKEN_LIBRARY}") + message(STATUS "Shiboken binary: ${SHIBOKEN_BINARY}") + message(STATUS "Shiboken version: ${SHIBOKEN_VERSION}") + # Create shiboke2 target add_library(Shiboken2::libshiboken SHARED IMPORTED GLOBAL) if(MSVC) @@ -150,9 +176,15 @@ if (SHIBOKEN_FOUND) INTERFACE_INCLUDE_DIRECTORIES ${SHIBOKEN_INCLUDE_DIR} ${Python3_INCLUDE_DIRS}) set_property(TARGET Shiboken2::libshiboken APPEND PROPERTY INTERFACE_LINK_LIBRARIES ${PYTHON_LIMITED_LIBRARIES}) + + # Generator target + add_executable(Shiboken2::shiboken IMPORTED GLOBAL) + set_property(TARGET Shiboken2::shiboken PROPERTY + IMPORTED_LOCATION ${SHIBOKEN_BINARY}) endif() - + find_package_handle_standard_args(Shiboken2 REQUIRED_VARS SHIBOKEN_BASEDIR SHIBOKEN_INCLUDE_DIR SHIBOKEN_LIBRARY SHIBOKEN_BINARY VERSION_VAR SHIBOKEN_VERSION ) + diff --git a/cmake/Python/PySide2ModuleBuild.cmake b/cmake/Python/PySide2ModuleBuild.cmake index 776f3af2..755a7404 100644 --- a/cmake/Python/PySide2ModuleBuild.cmake +++ b/cmake/Python/PySide2ModuleBuild.cmake @@ -93,10 +93,9 @@ macro(CREATE_PYTHON_BINDINGS make_path(shiboken_framework_include_dirs ${shiboken_framework_include_dirs}) set(shiboken_framework_include_dirs_option "--framework-include-paths=${shiboken_framework_include_dirs}") endif() - set_property(SOURCE ${OUTPUT_SOURCES} PROPERTY SKIP_AUTOGEN ON) add_custom_command(OUTPUT ${OUTPUT_SOURCES} - COMMAND ${SHIBOKEN_BINARY} ${GENERATOR_EXTRA_FLAGS} + COMMAND $ ${GENERATOR_EXTRA_FLAGS} ${GLOBAL_INCLUDE} --include-paths=${shiboken_include_dirs} --typesystem-paths=${shiboken_typesystem_dirs}