Warning, /frameworks/extra-cmake-modules/find-modules/FindPythonModuleGeneration.cmake is written in an unsupported language. File is not indexed.
0001 # SPDX-FileCopyrightText: 2016 Stephen Kelly <steveire@gmail.com>
0002 #
0003 # SPDX-License-Identifier: BSD-3-Clause
0004
0005 #[=======================================================================[.rst:
0006 FindPythonModuleGeneration
0007 --------------------------
0008
0009 This module is experimental and internal. The interface will likely
0010 change in the coming releases.
0011
0012 Tools and macros for generating python bindings
0013
0014 This will define the following public function:
0015
0016 ecm_generate_python_binding(TARGET <target>
0017 PYTHONNAMESPACE <namespace>
0018 MODULENAME <modulename>
0019 RULES_FILE <rulesfile>
0020 SIP_DEPENDS <dependencies>
0021 SIP_INCLUDES <includes>
0022 HEADERS <headers>)
0023
0024 Invoking the function will create bindings for the <target> for python 2 and 3,
0025 if available. The bindings will be put in the namespace <namespace> in python,
0026 and will be available from the module <modulename>.
0027
0028 The optional rules file specifies the rules for creating the bindings
0029
0030 A simple invocation would be:
0031
0032 ecm_generate_python_binding(TARGET KMyTarget
0033 PYTHONNAMESPACE PyKF5
0034 MODULENAME MyTarget
0035 SIP_DEPENDS QtCore/QtCoremod.sip
0036 HEADERS ${myTargetHeaders}
0037 )
0038
0039 which can then be used from python as
0040
0041 import PyKF5.MyTarget
0042
0043 Inclusion of this module defines the following variables:
0044
0045 ``KDE_INSTALL_PYTHON2DIR``, ``KDE_INSTALL_PYTHON3DIR``
0046 destination for generated bindings
0047 ``KDE_INSTALL_FULL_PYTHON2DIR``, ``KDE_INSTALL_FULL_PYTHON3DIR``
0048 corresponding absolute path
0049
0050 If ``KDE_INSTALL_USE_PYTHON2_SYS_PATHS`` is set to TRUE before including this
0051 module, the default value for ``KDE_INSTALL_PYTHON2DIR`` is instead queried from
0052 pythons distutil.sysconfig.get_python_lib().
0053 If not set, it will default to TRUE if pythons ``sysconfig.PREFIX`` is the same
0054 as ``CMAKE_INSTALL_PREFIX``, otherwise it defaults to FALSE.
0055 This variable should NOT be set from within CMakeLists.txt files, instead it
0056 is intended to be set manually when configuring a project which uses this
0057 module (e.g. by packagers).
0058
0059 Likewise for ``KDE_INSTALL_USE_PYTHON3_SYS_PATHS`` and ``KDE_INSTALL_PYTHON3DIR``.
0060 #]=======================================================================]
0061
0062 macro(_find_python version minor_version)
0063 set(_CURRENT_VERSION ${version}.${minor_version})
0064 find_library(GPB_PYTHON${version}_LIBRARY
0065 NAMES
0066 python${_CURRENT_VERSION}mu
0067 python${_CURRENT_VERSION}m
0068 python${_CURRENT_VERSION}u
0069 python${_CURRENT_VERSION}
0070 PATHS
0071 [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_CURRENT_VERSION}\\InstallPath]/libs
0072 [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_CURRENT_VERSION}\\InstallPath]/libs
0073 # Avoid finding the .dll in the PATH. We want the .lib.
0074 NO_SYSTEM_ENVIRONMENT_PATH
0075 )
0076
0077 if(GPB_PYTHON${version}_LIBRARY)
0078 # Use the library's install prefix as a hint
0079 set(_Python_INCLUDE_PATH_HINT)
0080 get_filename_component(_Python_PREFIX ${GPB_PYTHON${version}_LIBRARY} PATH)
0081 get_filename_component(_Python_PREFIX ${_Python_PREFIX} PATH)
0082 if(_Python_PREFIX)
0083 set(_Python_INCLUDE_PATH_HINT ${_Python_PREFIX}/include)
0084 endif()
0085 unset(_Python_PREFIX)
0086
0087 find_path(GPB_PYTHON${version}_INCLUDE_DIR
0088 NAMES Python.h
0089 HINTS
0090 ${_Python_INCLUDE_PATH_HINT}
0091 PATHS
0092 [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_CURRENT_VERSION}\\InstallPath]/include
0093 [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_CURRENT_VERSION}\\InstallPath]/include
0094 PATH_SUFFIXES
0095 python${_CURRENT_VERSION}mu
0096 python${_CURRENT_VERSION}m
0097 python${_CURRENT_VERSION}u
0098 python${_CURRENT_VERSION}
0099 )
0100 # sip.h is version agnostic, it may be located in the version specific path
0101 # or one of the default locations
0102 find_path(GPB_PYTHON${version}_SIP_DIR
0103 NAMES sip.h
0104 PATHS
0105 ${GPB_PYTHON${version}_INCLUDE_DIR}
0106 )
0107 endif()
0108
0109 find_program(GPB_PYTHON${version}_COMMAND python${version})
0110 endmacro()
0111
0112 macro(_create_imported_python_target version)
0113 if(GPB_PYTHON${version}_LIBRARY AND GPB_PYTHON${version}_INCLUDE_DIR AND
0114 EXISTS "${GPB_PYTHON${version}_INCLUDE_DIR}/patchlevel.h" AND
0115 EXISTS "${GPB_PYTHON${version}_SIP_DIR}/sip.h")
0116 list(APPEND _pyversions ${version})
0117
0118 file(STRINGS "${GPB_PYTHON${version}_INCLUDE_DIR}/patchlevel.h" python_version_define
0119 REGEX "^#define[ \t]+PY_MINOR_VERSION[ \t]+[0-9]+")
0120 string(REGEX REPLACE "^#define[ \t]+PY_MINOR_VERSION[ \t]+([0-9]+)" "\\1"
0121 min_ver "${python_version_define}")
0122 unset(python_version_define)
0123
0124 set(pyversion${version}_maj_min ${version}.${min_ver})
0125
0126 add_library(Python::Libs${version} UNKNOWN IMPORTED)
0127 set_property(TARGET Python::Libs${version} PROPERTY IMPORTED_LOCATION ${GPB_PYTHON${version}_LIBRARY})
0128 set_property(TARGET Python::Libs${version} PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${GPB_PYTHON${version}_INCLUDE_DIR})
0129
0130 set(_default_KDE_INSTALL_USE_PYTHON${version}_SYS_PATHS OFF)
0131 if(NOT DEFINED KDE_INSTALL_USE_PYTHON${version}_SYS_PATHS)
0132 execute_process (
0133 COMMAND "${GPB_PYTHON${version}_COMMAND}" -c "import sys; from distutils import sysconfig;sys.stdout.write(sysconfig.PREFIX)"
0134 OUTPUT_VARIABLE gpb_python${version}_prefix
0135 )
0136 if(gpb_python${version}_prefix STREQUAL "${CMAKE_INSTALL_PREFIX}")
0137 message(STATUS "Installing in the same prefix as Python${version}, adopting their path scheme.")
0138 set(_default_KDE_INSTALL_USE_PYTHON${version}_SYS_PATHS ON)
0139 else()
0140 message(STATUS "NOT installing in the same prefix as Python${version}.")
0141 endif()
0142 endif()
0143
0144 endif()
0145 endmacro()
0146
0147 macro(_report_NOT_FOUND message)
0148 if(NOT ${CMAKE_FIND_PACKAGE_NAME}_FIND_QUIETLY)
0149 set(_GPB_MESSAGE_TYPE STATUS)
0150 if(${CMAKE_FIND_PACKAGE_NAME}_FIND_REQUIRED)
0151 set(_GPB_MESSAGE_TYPE FATAL_ERROR)
0152 endif()
0153 message(${_GPB_MESSAGE_TYPE} ${message})
0154 endif()
0155 set(PythonModuleGeneration_FOUND FALSE)
0156 return()
0157 endmacro()
0158
0159 if (NOT Qt5Core_FOUND)
0160 _report_NOT_FOUND("Qt 5 must be found before finding ${CMAKE_FIND_PACKAGE_NAME}.")
0161 endif()
0162
0163 if (NOT GPB_PYTHON3_LIBRARY)
0164 set(_PYTHON3_MIN_VERSION 4)
0165
0166 # This value is safe to increment over time, it is used only as a reasonable
0167 # upper bound to start searching from
0168 set(_PYTHON3_MAX_VERSION 50)
0169
0170 _find_python(3 ${_PYTHON3_MAX_VERSION})
0171
0172 if (GPB_PYTHON3_LIBRARY)
0173 message(FATAL_ERROR "The max python version in ${CMAKE_FIND_PACKAGE_NAME} must be updated.")
0174 endif()
0175
0176 # Look for the highest supported version of Python 3 by looking for a minor
0177 # version that doesn't exist and decrementing until we find a match.
0178 set(_PYTHON3_FIND_VERSION ${_PYTHON3_MAX_VERSION})
0179
0180 while(NOT GPB_PYTHON3_LIBRARY
0181 AND NOT GPB_PYTHON3_INCLUDE_DIR
0182 AND NOT EXISTS "${GPB_PYTHON3_INCLUDE_DIR}/patchlevel.h"
0183 AND NOT _PYTHON3_FIND_VERSION EQUAL ${_PYTHON3_MIN_VERSION})
0184 math(EXPR _PYTHON3_FIND_VERSION "${_PYTHON3_FIND_VERSION} - 1")
0185 _find_python(3 ${_PYTHON3_FIND_VERSION})
0186 endwhile()
0187 endif()
0188 _create_imported_python_target(3)
0189
0190 _find_python(2 7)
0191 _create_imported_python_target(2)
0192
0193 option (KDE_INSTALL_USE_PYTHON3_SYS_PATHS "Install Python3 bindings to the Python3 install dir"
0194 "${_default_KDE_INSTALL_USE_PYTHON3_SYS_PATHS}")
0195 option (KDE_INSTALL_USE_PYTHON2_SYS_PATHS "Install Python2 bindings to the Python2 install dir"
0196 "${_default_KDE_INSTALL_USE_PYTHON2_SYS_PATHS}")
0197
0198 if (NOT _pyversions)
0199 _report_NOT_FOUND("At least one python version must be available to use ${CMAKE_FIND_PACKAGE_NAME}.")
0200 endif()
0201
0202 foreach(pyversion ${_pyversions})
0203
0204 if(KDE_INSTALL_PYTHON${pyversion}DIR)
0205 # Use dir from command line
0206
0207 elseif(KDE_INSTALL_USE_PYTHON${pyversion}_SYS_PATHS)
0208 execute_process (
0209 COMMAND "${GPB_PYTHON${pyversion}_COMMAND}" -c "import sys; from distutils import sysconfig;sys.stdout.write(sysconfig.get_python_lib(plat_specific=True,standard_lib=False))"
0210 OUTPUT_VARIABLE KDE_INSTALL_PYTHON${pyversion}DIR
0211 )
0212
0213 else()
0214 set(KDE_INSTALL_PYTHON${pyversion}DIR lib/python${pyversion${pyversion}_maj_min}/site-packages)
0215 endif()
0216
0217 if(NOT IS_ABSOLUTE ${KDE_INSTALL_PYTHON${pyversion}DIR})
0218 set(KDE_INSTALL_FULL_PYTHON${pyversion}DIR
0219 "${CMAKE_INSTALL_PREFIX}/${KDE_INSTALL_PYTHON${pyversion}DIR}")
0220 else()
0221 set(KDE_INSTALL_FULL_PYTHON${pyversion}DIR "${KDE_INSTALL_PYTHON${pyversion}DIR}")
0222 endif()
0223
0224 endforeach()
0225
0226 find_program(GBP_SIP_COMMAND sip)
0227
0228 if (NOT GBP_SIP_COMMAND)
0229 _report_NOT_FOUND("The sip executable must be available to use ${CMAKE_FIND_PACKAGE_NAME}.")
0230 endif()
0231
0232 if (NOT libclang_LIBRARY)
0233 set(_LIBCLANG_MAX_MAJOR_VERSION 7)
0234 set(_LIBCLANG_MIN_MAJOR_VERSION 5)
0235
0236 find_library(libclang_LIBRARY clang-${_LIBCLANG_MAX_MAJOR_VERSION}.0)
0237
0238 if (libclang_LIBRARY)
0239 message(FATAL_ERROR "The max libclang version in ${CMAKE_FIND_PACKAGE_NAME} must be updated.")
0240 endif()
0241
0242 set(_LIBCLANG_FIND_VERSION ${_LIBCLANG_MAX_MAJOR_VERSION})
0243 while(NOT libclang_LIBRARY AND NOT _LIBCLANG_FIND_VERSION EQUAL _LIBCLANG_MIN_MAJOR_VERSION)
0244 math(EXPR _LIBCLANG_FIND_VERSION "${_LIBCLANG_FIND_VERSION} - 1")
0245 set(_GPB_CLANG_SUFFIX ${_LIBCLANG_FIND_VERSION}.0)
0246 find_library(libclang_LIBRARY clang-${_LIBCLANG_FIND_VERSION}.0)
0247 endwhile()
0248
0249 if (NOT libclang_LIBRARY)
0250 find_library(libclang_LIBRARY clang)
0251 endif()
0252 else()
0253 string(REGEX MATCH ".*clang-([0-9]+\\.[0-9]+).*" _GPB_CLANG_SUFFIX ${libclang_LIBRARY})
0254 set(_GPB_CLANG_SUFFIX ${CMAKE_MATCH_1})
0255 endif()
0256
0257 if (NOT libclang_LIBRARY)
0258 _report_NOT_FOUND("Could not find libclang version 5.0 or greater.")
0259 else()
0260 message(STATUS "Found ${libclang_LIBRARY}")
0261 endif()
0262
0263 foreach (pyversion "3" "2")
0264 set(GPB_PYTHON_COMMAND ${GPB_PYTHON${pyversion}_COMMAND})
0265 if (NOT GPB_PYTHON_COMMAND)
0266 continue()
0267 endif()
0268 message(STATUS "Testing if ${GPB_PYTHON_COMMAND} can be used to run sip_generator")
0269
0270 execute_process(
0271 COMMAND ${GPB_PYTHON_COMMAND} ${CMAKE_CURRENT_LIST_DIR}/sip_generator.py --self-check ${libclang_LIBRARY}
0272 RESULT_VARIABLE selfCheckErrors
0273 ERROR_QUIET
0274 )
0275
0276 if (selfCheckErrors)
0277 message(STATUS "sip_generator self-check for ${GPB_PYTHON_COMMAND} failed")
0278 unset(GPB_PYTHON_COMMAND)
0279 else()
0280 message(STATUS "Self-check passed, Using ${GPB_PYTHON_COMMAND} to generate bindings")
0281 break()
0282 endif()
0283 endforeach()
0284
0285 if (NOT GPB_PYTHON_COMMAND)
0286 _report_NOT_FOUND("No usable python version found to run sip_generator for the ${CMAKE_FIND_PACKAGE_NAME} Module.")
0287 endif()
0288
0289 get_filename_component(libclang_file "${libclang_file}" REALPATH)
0290
0291 find_file(SIP_Qt5Core_Mod_FILE
0292 NAMES QtCoremod.sip
0293 HINTS ${KDE_INSTALL_PYTHON3DIR}/PyQt5/bindings/QtCore
0294 PATH_SUFFIXES share/sip/PyQt5/QtCore
0295 )
0296
0297 if(NOT SIP_Qt5Core_Mod_FILE)
0298 _report_NOT_FOUND("PyQt module files not found for the ${CMAKE_FIND_PACKAGE_NAME} Module.")
0299 endif()
0300
0301 set(PythonModuleGeneration_FOUND TRUE)
0302
0303 set(GPB_MODULE_DIR ${CMAKE_CURRENT_LIST_DIR})
0304
0305 function(_compute_implicit_include_dirs)
0306 find_program(_GBP_CLANG_CXX_DRIVER_PATH NAMES clang++-${_GPB_CLANG_SUFFIX} clang++)
0307 if (NOT _GBP_CLANG_CXX_DRIVER_PATH)
0308 message(FATAL_ERROR "Failed to find clang driver corresponding to ${libclang_LIBRARY}")
0309 endif()
0310 execute_process(COMMAND ${_GBP_CLANG_CXX_DRIVER_PATH} -v -E -x c++ -
0311 ERROR_VARIABLE _compilerOutput
0312 OUTPUT_VARIABLE _compilerStdout
0313 INPUT_FILE /dev/null)
0314
0315 if( "${_compilerOutput}" MATCHES "> search starts here[^\n]+\n *(.+ *\n) *End of (search) list" )
0316
0317 # split the output into lines and then remove leading and trailing spaces from each of them:
0318 string(REGEX MATCHALL "[^\n]+\n" _includeLines "${CMAKE_MATCH_1}")
0319 foreach(nextLine ${_includeLines})
0320 # on OSX, gcc says things like this: "/System/Library/Frameworks (framework directory)", strip the last part
0321 string(REGEX REPLACE "\\(framework directory\\)" "" nextLineNoFramework "${nextLine}")
0322 # strip spaces at the beginning and the end
0323 string(STRIP "${nextLineNoFramework}" _includePath)
0324 list(APPEND _resultIncludeDirs "${_includePath}")
0325 endforeach()
0326 endif()
0327
0328 set(_GPB_IMPLICIT_INCLUDE_DIRS ${_resultIncludeDirs} PARENT_SCOPE)
0329 endfunction()
0330
0331 function(ecm_generate_python_binding)
0332
0333 set(oneValueArgs TARGET PYTHONNAMESPACE MODULENAME RULES_FILE)
0334 set(multiValueArgs SIP_DEPENDS SIP_INCLUDES HEADERS)
0335
0336 cmake_parse_arguments(GPB "" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
0337
0338 file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/sip/${GPB_PYTHONNAMESPACE}/${GPB_MODULENAME}/${GPB_MODULENAME}mod.sip"
0339 "
0340 %Module ${GPB_PYTHONNAMESPACE}.${GPB_MODULENAME}
0341
0342 %ModuleHeaderCode
0343 #pragma GCC visibility push(default)
0344 %End\n\n")
0345
0346 set(generator_depends "${GPB_MODULE_DIR}/sip_generator.py"
0347 "${GPB_MODULE_DIR}/rules_engine.py"
0348 "${GPB_MODULE_DIR}/FindPythonModuleGeneration.cmake"
0349 )
0350
0351 if (NOT _GPB_IMPLICIT_INCLUDE_DIRS)
0352 _compute_implicit_include_dirs()
0353 endif()
0354
0355 foreach(dep ${GPB_SIP_DEPENDS})
0356 if (IS_ABSOLUTE ${dep})
0357 list(APPEND generator_depends "${dep}")
0358 endif()
0359 file(APPEND "${CMAKE_CURRENT_BINARY_DIR}/sip/${GPB_PYTHONNAMESPACE}/${GPB_MODULENAME}/${GPB_MODULENAME}mod.sip"
0360 "%Import ${dep}\n\n")
0361 endforeach()
0362
0363 set(sip_files)
0364 set(commands)
0365
0366 if (NOT GPB_RULES_FILE)
0367 set(GPB_RULES_FILE "${GPB_MODULE_DIR}/Qt5Ruleset.py")
0368 endif()
0369
0370 list(APPEND generator_depends ${GPB_RULES_FILE})
0371
0372 foreach(hdr ${GPB_HEADERS})
0373
0374 get_filename_component(hdr_file ${hdr} ABSOLUTE)
0375
0376 get_filename_component(hdr ${hdr} NAME_WE)
0377 string(TOLOWER ${hdr}.h hdr_filename)
0378
0379 if (NOT EXISTS "${hdr_file}")
0380 message(FATAL_ERROR "File not found: ${hdr_file}")
0381 endif()
0382
0383 set(sip_file "${CMAKE_CURRENT_BINARY_DIR}/sip/${GPB_PYTHONNAMESPACE}/${GPB_MODULENAME}/${hdr}.sip")
0384 list(APPEND sip_files ${sip_file})
0385
0386 set(inc_dirs "-I$<JOIN:$<TARGET_PROPERTY:${GPB_TARGET},INTERFACE_INCLUDE_DIRECTORIES>,;-I>")
0387 set(sys_inc_dirs)
0388 foreach(d ${_GPB_IMPLICIT_INCLUDE_DIRS})
0389 list(APPEND sys_inc_dirs "-isystem" "${d}")
0390 endforeach()
0391 set(comp_defs "-D$<JOIN:$<TARGET_PROPERTY:${GPB_TARGET},INTERFACE_COMPILE_DEFINITIONS>,;-D>")
0392
0393 # We might like to use $<TARGET_PROPERTY:${GPB_TARGET},CXX_STANDARD>, but
0394 # unfortunately CMake does not populate that property as a side-effect of evaluating
0395 # COMPILE_FEATURES (Qt specifies feature requirements in its INTERFACE_COMPILE_FEATURES, and
0396 # those are consumed to set the CXX_STANDARD internally in CMake, but evidently too late)
0397 set(stdFlag "-std=gnu++14")
0398
0399 set(comp_flags "$<JOIN:$<TARGET_PROPERTY:${GPB_TARGET},INTERFACE_COMPILE_OPTIONS>;${stdFlag},;>")
0400
0401 add_custom_command(OUTPUT ${sip_file}
0402 COMMAND ${GPB_PYTHON_COMMAND} ${GPB_MODULE_DIR}/sip_generator.py
0403 --flags " ${inc_dirs};${sys_inc_dirs};${comp_defs};${comp_flags}"
0404 --include_filename "${hdr_filename}"
0405 ${libclang_LIBRARY}
0406 ${GPB_RULES_FILE}
0407 "${hdr_file}"
0408 "${sip_file}"
0409 DEPENDS ${hdr_file} ${generator_depends}
0410 VERBATIM
0411 )
0412
0413 file(APPEND "${CMAKE_CURRENT_BINARY_DIR}/sip/${GPB_PYTHONNAMESPACE}/${GPB_MODULENAME}/${GPB_MODULENAME}mod.sip"
0414 "%Include ${hdr}.sip\n")
0415 endforeach()
0416
0417 file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/pybuild/${GPB_PYTHONNAMESPACE}/${GPB_MODULENAME}/module.sbf"
0418 "
0419 target = ${GPB_MODULENAME}
0420 sources = sip${GPB_MODULENAME}cmodule.cpp
0421 headers = sipAPI${GPB_MODULENAME}
0422 "
0423 )
0424
0425 get_filename_component(SIP_PYQT5_DIR ${SIP_Qt5Core_Mod_FILE} PATH)
0426 get_filename_component(SIP_PYQT5_DIR ${SIP_PYQT5_DIR} PATH)
0427
0428 set(sip_includes -I "${SIP_PYQT5_DIR}")
0429 if (GPB_SIP_INCLUDES)
0430 list(APPEND sip_includes -I "$<JOIN:${GPB_SIP_INCLUDES},-I>")
0431 endif()
0432 foreach(path ${CMAKE_PREFIX_PATH} ${CMAKE_INSTALL_PREFIX})
0433 if (EXISTS ${path}/share/sip)
0434 list(APPEND sip_includes -I "${path}/share/sip")
0435 endif()
0436 endforeach()
0437
0438 add_custom_target(generate_${GPB_MODULENAME}_sip_files ALL DEPENDS ${sip_files})
0439
0440 add_custom_command(OUTPUT
0441 "${CMAKE_CURRENT_BINARY_DIR}/pybuild/${GPB_PYTHONNAMESPACE}/${GPB_MODULENAME}/unified${GPB_MODULENAME}.cpp"
0442 COMMAND ${GPB_PYTHON_COMMAND} "${GPB_MODULE_DIR}/run-sip.py" --sip ${GBP_SIP_COMMAND}
0443 --unify "${CMAKE_CURRENT_BINARY_DIR}/pybuild/${GPB_PYTHONNAMESPACE}/${GPB_MODULENAME}/unified${GPB_MODULENAME}.cpp"
0444 --module-name "${GPB_MODULENAME}"
0445 -c "${CMAKE_CURRENT_BINARY_DIR}/pybuild/${GPB_PYTHONNAMESPACE}/${GPB_MODULENAME}"
0446 -b "${CMAKE_CURRENT_BINARY_DIR}/pybuild/${GPB_PYTHONNAMESPACE}/${GPB_MODULENAME}/module.sbf"
0447
0448 -x VendorID -x Py_v3
0449
0450 -I "${CMAKE_CURRENT_BINARY_DIR}/sip/${GPB_PYTHONNAMESPACE}/${GPB_MODULENAME}"
0451 ${sip_includes}
0452 "${CMAKE_CURRENT_BINARY_DIR}/sip/${GPB_PYTHONNAMESPACE}/${GPB_MODULENAME}/${GPB_MODULENAME}mod.sip"
0453 DEPENDS generate_${GPB_MODULENAME}_sip_files "${GPB_MODULE_DIR}/run-sip.py" ${generator_depends}
0454 )
0455
0456 add_custom_target(sip_generated_${GPB_MODULENAME}_files ALL
0457 DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/pybuild/${GPB_PYTHONNAMESPACE}/${GPB_MODULENAME}/unified${GPB_MODULENAME}.cpp")
0458
0459 file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/sip/${GPB_PYTHONNAMESPACE}/${GPB_MODULENAME}"
0460 "${CMAKE_CURRENT_BINARY_DIR}/pybuild/${GPB_PYTHONNAMESPACE}/${GPB_MODULENAME}")
0461
0462 foreach(pyversion ${_pyversions})
0463 message(STATUS "Found dependencies for python${pyversion}, generating bindings")
0464 message(STATUS "Python${pyversion} install dir: ${KDE_INSTALL_FULL_PYTHON${pyversion}DIR}")
0465
0466 execute_process(COMMAND "${CMAKE_COMMAND}"
0467 "-DPYTHON_UMBRELLA_MODULE_FILE=${CMAKE_BINARY_DIR}/py${pyversion}/${GPB_PYTHONNAMESPACE}/__init__.py"
0468 -P "${GPB_MODULE_DIR}/GeneratePythonBindingUmbrellaModule.cmake"
0469 )
0470
0471 add_library(Py${pyversion}KF5${GPB_MODULENAME} MODULE
0472 "${CMAKE_CURRENT_BINARY_DIR}/pybuild/${GPB_PYTHONNAMESPACE}/${GPB_MODULENAME}/unified${GPB_MODULENAME}.cpp"
0473 )
0474 add_dependencies(Py${pyversion}KF5${GPB_MODULENAME} sip_generated_${GPB_MODULENAME}_files)
0475 target_link_libraries(Py${pyversion}KF5${GPB_MODULENAME} PRIVATE ${GPB_TARGET} Python::Libs${pyversion})
0476
0477 target_compile_options(Py${pyversion}KF5${GPB_MODULENAME} PRIVATE -fstack-protector-strong -Wno-deprecated-declarations -Wno-overloaded-virtual)
0478 target_include_directories(Py${pyversion}KF5${GPB_MODULENAME} PRIVATE ${GPB_SIP_INCLUDES})
0479 target_link_libraries(Py${pyversion}KF5${GPB_MODULENAME} PRIVATE -Wl,-Bsymbolic-functions -Wl,-z,relro)
0480
0481 set_property(TARGET Py${pyversion}KF5${GPB_MODULENAME} PROPERTY AUTOMOC OFF)
0482 set_property(TARGET Py${pyversion}KF5${GPB_MODULENAME} PROPERTY PREFIX "")
0483 set_property(TARGET Py${pyversion}KF5${GPB_MODULENAME} PROPERTY LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/py${pyversion}/${GPB_PYTHONNAMESPACE}")
0484 set_property(TARGET Py${pyversion}KF5${GPB_MODULENAME} PROPERTY
0485 OUTPUT_NAME "${GPB_MODULENAME}")
0486
0487 if (GPB_SIP_DEPENDS MATCHES PyKF5)
0488 set(_kf5_python_prefix ${KDE_INSTALL_FULL_PYTHON${pyversion}DIR})
0489 else()
0490 set(_kf5_python_prefix ${CMAKE_BINARY_DIR}/py${pyversion})
0491 endif()
0492 add_test(NAME Py${pyversion}Test${GPB_MODULENAME} COMMAND
0493 ${GPB_PYTHON${pyversion}_COMMAND} "${CMAKE_SOURCE_DIR}/autotests/pythontest.py"
0494 ${_kf5_python_prefix}
0495 )
0496
0497 install(DIRECTORY ${CMAKE_BINARY_DIR}/py${pyversion}/${GPB_PYTHONNAMESPACE}
0498 DESTINATION ${KDE_INSTALL_PYTHON${pyversion}DIR})
0499 install(FILES ${sip_files} "${CMAKE_CURRENT_BINARY_DIR}/sip/${GPB_PYTHONNAMESPACE}/${GPB_MODULENAME}/${GPB_MODULENAME}mod.sip"
0500 DESTINATION share/sip/${GPB_PYTHONNAMESPACE}/${GPB_MODULENAME}
0501 )
0502 endforeach()
0503 endfunction()