Merge pull request #6779 from alalek:python_dynamic_lookup
This commit is contained in:
		| @@ -75,10 +75,10 @@ if(NOT ${found}) | |||||||
|  |  | ||||||
|     if(NOT ANDROID AND NOT APPLE_FRAMEWORK) |     if(NOT ANDROID AND NOT APPLE_FRAMEWORK) | ||||||
|       ocv_check_environment_variables(${library_env} ${include_dir_env}) |       ocv_check_environment_variables(${library_env} ${include_dir_env}) | ||||||
|       if(NOT ${${library_env}} EQUAL "") |       if(NOT ${${library_env}} STREQUAL "") | ||||||
|           set(PYTHON_LIBRARY "${${library_env}}") |           set(PYTHON_LIBRARY "${${library_env}}") | ||||||
|       endif() |       endif() | ||||||
|       if(NOT ${${include_dir_env}} EQUAL "") |       if(NOT ${${include_dir_env}} STREQUAL "") | ||||||
|           set(PYTHON_INCLUDE_DIR "${${include_dir_env}}") |           set(PYTHON_INCLUDE_DIR "${${include_dir_env}}") | ||||||
|       endif() |       endif() | ||||||
|  |  | ||||||
| @@ -162,10 +162,10 @@ if(NOT ${found}) | |||||||
|           message(STATUS "Cannot probe for Python/Numpy support (because we are cross-compiling OpenCV)") |           message(STATUS "Cannot probe for Python/Numpy support (because we are cross-compiling OpenCV)") | ||||||
|           message(STATUS "If you want to enable Python/Numpy support, set the following variables:") |           message(STATUS "If you want to enable Python/Numpy support, set the following variables:") | ||||||
|           message(STATUS "  PYTHON2_INCLUDE_PATH") |           message(STATUS "  PYTHON2_INCLUDE_PATH") | ||||||
|           message(STATUS "  PYTHON2_LIBRARIES") |           message(STATUS "  PYTHON2_LIBRARIES (optional on Unix-like systems)") | ||||||
|           message(STATUS "  PYTHON2_NUMPY_INCLUDE_DIRS") |           message(STATUS "  PYTHON2_NUMPY_INCLUDE_DIRS") | ||||||
|           message(STATUS "  PYTHON3_INCLUDE_PATH") |           message(STATUS "  PYTHON3_INCLUDE_PATH") | ||||||
|           message(STATUS "  PYTHON3_LIBRARIES") |           message(STATUS "  PYTHON3_LIBRARIES (optional on Unix-like systems)") | ||||||
|           message(STATUS "  PYTHON3_NUMPY_INCLUDE_DIRS") |           message(STATUS "  PYTHON3_NUMPY_INCLUDE_DIRS") | ||||||
|         else() |         else() | ||||||
|           # Attempt to discover the NumPy include directory. If this succeeds, then build python API with NumPy |           # Attempt to discover the NumPy include directory. If this succeeds, then build python API with NumPy | ||||||
|   | |||||||
| @@ -1,11 +1,15 @@ | |||||||
| # This file is included from a subdirectory | # This file is included from a subdirectory | ||||||
| set(PYTHON_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../") | set(PYTHON_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../") | ||||||
|  |  | ||||||
|  | # try to use dynamic symbols linking with libpython.so | ||||||
|  | set(OPENCV_FORCE_PYTHON_LIBS OFF CACHE BOOL "") | ||||||
|  | string(REPLACE "-Wl,--no-undefined" "" CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS}") | ||||||
|  |  | ||||||
| ocv_add_module(${MODULE_NAME} BINDINGS) | ocv_add_module(${MODULE_NAME} BINDINGS) | ||||||
|  |  | ||||||
| ocv_module_include_directories( | ocv_module_include_directories( | ||||||
|     "${PYTHON_INCLUDE_PATH}" |     "${${PYTHON}_INCLUDE_PATH}" | ||||||
|     ${PYTHON_NUMPY_INCLUDE_DIRS} |     ${${PYTHON}_NUMPY_INCLUDE_DIRS} | ||||||
|     "${PYTHON_SOURCE_DIR}/src2" |     "${PYTHON_SOURCE_DIR}/src2" | ||||||
|     ) |     ) | ||||||
|  |  | ||||||
| @@ -42,7 +46,7 @@ set(cv2_generated_hdrs | |||||||
| file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/headers.txt" "${opencv_hdrs}") | file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/headers.txt" "${opencv_hdrs}") | ||||||
| add_custom_command( | add_custom_command( | ||||||
|    OUTPUT ${cv2_generated_hdrs} |    OUTPUT ${cv2_generated_hdrs} | ||||||
|    COMMAND ${PYTHON_EXECUTABLE} "${PYTHON_SOURCE_DIR}/src2/gen2.py" ${CMAKE_CURRENT_BINARY_DIR} "${CMAKE_CURRENT_BINARY_DIR}/headers.txt" |    COMMAND ${PYTHON_DEFAULT_EXECUTABLE} "${PYTHON_SOURCE_DIR}/src2/gen2.py" ${CMAKE_CURRENT_BINARY_DIR} "${CMAKE_CURRENT_BINARY_DIR}/headers.txt" "${PYTHON}" | ||||||
|    DEPENDS ${PYTHON_SOURCE_DIR}/src2/gen2.py |    DEPENDS ${PYTHON_SOURCE_DIR}/src2/gen2.py | ||||||
|    DEPENDS ${PYTHON_SOURCE_DIR}/src2/hdr_parser.py |    DEPENDS ${PYTHON_SOURCE_DIR}/src2/hdr_parser.py | ||||||
|    DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/headers.txt |    DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/headers.txt | ||||||
| @@ -50,21 +54,28 @@ add_custom_command( | |||||||
|  |  | ||||||
| ocv_add_library(${the_module} MODULE ${PYTHON_SOURCE_DIR}/src2/cv2.cpp ${cv2_generated_hdrs}) | ocv_add_library(${the_module} MODULE ${PYTHON_SOURCE_DIR}/src2/cv2.cpp ${cv2_generated_hdrs}) | ||||||
|  |  | ||||||
| if(PYTHON_DEBUG_LIBRARIES AND NOT PYTHON_LIBRARIES MATCHES "optimized.*debug") |  | ||||||
|   ocv_target_link_libraries(${the_module} debug ${PYTHON_DEBUG_LIBRARIES} optimized ${PYTHON_LIBRARIES}) |  | ||||||
| else() |  | ||||||
| if(APPLE) | if(APPLE) | ||||||
|   set_target_properties(${the_module} PROPERTIES LINK_FLAGS "-undefined dynamic_lookup") |   set_target_properties(${the_module} PROPERTIES LINK_FLAGS "-undefined dynamic_lookup") | ||||||
|  | elseif(WIN32 OR OPENCV_FORCE_PYTHON_LIBS) | ||||||
|  |   if(${PYTHON}_DEBUG_LIBRARIES AND NOT ${PYTHON}_LIBRARIES MATCHES "optimized.*debug") | ||||||
|  |     ocv_target_link_libraries(${the_module} debug ${${PYTHON}_DEBUG_LIBRARIES} optimized ${${PYTHON}_LIBRARIES}) | ||||||
|   else() |   else() | ||||||
|     ocv_target_link_libraries(${the_module} ${PYTHON_LIBRARIES}) |     ocv_target_link_libraries(${the_module} ${${PYTHON}_LIBRARIES}) | ||||||
|   endif() |   endif() | ||||||
| endif() | endif() | ||||||
| ocv_target_link_libraries(${the_module} ${OPENCV_MODULE_${the_module}_DEPS}) | ocv_target_link_libraries(${the_module} ${OPENCV_MODULE_${the_module}_DEPS}) | ||||||
|  |  | ||||||
| execute_process(COMMAND ${PYTHON_EXECUTABLE} -c "import distutils.sysconfig; print(distutils.sysconfig.get_config_var('SO'))" | if(DEFINED ${PYTHON}_CVPY_SUFFIX) | ||||||
|  |   set(CVPY_SUFFIX "${${PYTHON}_CVPY_SUFFIX}") | ||||||
|  | else() | ||||||
|  |   execute_process(COMMAND ${${PYTHON}_EXECUTABLE} -c "import distutils.sysconfig; print(distutils.sysconfig.get_config_var('SO'))" | ||||||
|                   RESULT_VARIABLE PYTHON_CVPY_PROCESS |                   RESULT_VARIABLE PYTHON_CVPY_PROCESS | ||||||
|                   OUTPUT_VARIABLE CVPY_SUFFIX |                   OUTPUT_VARIABLE CVPY_SUFFIX | ||||||
|                   OUTPUT_STRIP_TRAILING_WHITESPACE) |                   OUTPUT_STRIP_TRAILING_WHITESPACE) | ||||||
|  |   if(NOT PYTHON_CVPY_PROCESS EQUAL 0) | ||||||
|  |     set(CVPY_SUFFIX ".so") | ||||||
|  |   endif() | ||||||
|  | endif() | ||||||
|  |  | ||||||
| set_target_properties(${the_module} PROPERTIES | set_target_properties(${the_module} PROPERTIES | ||||||
|                       LIBRARY_OUTPUT_DIRECTORY  "${LIBRARY_OUTPUT_PATH}/${MODULE_INSTALL_SUBDIR}" |                       LIBRARY_OUTPUT_DIRECTORY  "${LIBRARY_OUTPUT_PATH}/${MODULE_INSTALL_SUBDIR}" | ||||||
| @@ -96,7 +107,7 @@ if(MSVC AND NOT BUILD_SHARED_LIBS) | |||||||
|   set_target_properties(${the_module} PROPERTIES LINK_FLAGS "/NODEFAULTLIB:atlthunk.lib /NODEFAULTLIB:atlsd.lib /DEBUG") |   set_target_properties(${the_module} PROPERTIES LINK_FLAGS "/NODEFAULTLIB:atlthunk.lib /NODEFAULTLIB:atlsd.lib /DEBUG") | ||||||
| endif() | endif() | ||||||
|  |  | ||||||
| if(MSVC AND NOT PYTHON_DEBUG_LIBRARIES) | if(MSVC AND NOT ${PYTHON}_DEBUG_LIBRARIES) | ||||||
|   set(PYTHON_INSTALL_CONFIGURATIONS CONFIGURATIONS Release) |   set(PYTHON_INSTALL_CONFIGURATIONS CONFIGURATIONS Release) | ||||||
| else() | else() | ||||||
|   set(PYTHON_INSTALL_CONFIGURATIONS "") |   set(PYTHON_INSTALL_CONFIGURATIONS "") | ||||||
| @@ -105,19 +116,22 @@ endif() | |||||||
| if(WIN32) | if(WIN32) | ||||||
|   set(PYTHON_INSTALL_ARCHIVE "") |   set(PYTHON_INSTALL_ARCHIVE "") | ||||||
| else() | else() | ||||||
|   set(PYTHON_INSTALL_ARCHIVE ARCHIVE DESTINATION ${PYTHON_PACKAGES_PATH} COMPONENT python) |   set(PYTHON_INSTALL_ARCHIVE ARCHIVE DESTINATION ${${PYTHON}_PACKAGES_PATH} COMPONENT python) | ||||||
| endif() | endif() | ||||||
|  |  | ||||||
| if(NOT INSTALL_CREATE_DISTRIB) | if(NOT INSTALL_CREATE_DISTRIB AND DEFINED ${PYTHON}_PACKAGES_PATH) | ||||||
|  |   set(__dst "${${PYTHON}_PACKAGES_PATH}") | ||||||
|   install(TARGETS ${the_module} OPTIONAL |   install(TARGETS ${the_module} OPTIONAL | ||||||
|           ${PYTHON_INSTALL_CONFIGURATIONS} |           ${PYTHON_INSTALL_CONFIGURATIONS} | ||||||
|           RUNTIME DESTINATION ${PYTHON_PACKAGES_PATH} COMPONENT python |           RUNTIME DESTINATION "${__dst}" COMPONENT python | ||||||
|           LIBRARY DESTINATION ${PYTHON_PACKAGES_PATH} COMPONENT python |           LIBRARY DESTINATION "${__dst}" COMPONENT python | ||||||
|           ${PYTHON_INSTALL_ARCHIVE} |           ${PYTHON_INSTALL_ARCHIVE} | ||||||
|           ) |           ) | ||||||
| else() | else() | ||||||
|   if(DEFINED PYTHON_VERSION_MAJOR) |   if(DEFINED ${PYTHON}_VERSION_MAJOR) | ||||||
|     set(__ver "${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}") |     set(__ver "${${PYTHON}_VERSION_MAJOR}.${${PYTHON}_VERSION_MINOR}") | ||||||
|  |   elseif(DEFINED ${PYTHON}_VERSION_STRING) | ||||||
|  |     set(__ver "${${PYTHON}_VERSION_STRING}") | ||||||
|   else() |   else() | ||||||
|     set(__ver "unknown") |     set(__ver "unknown") | ||||||
|   endif() |   endif() | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| if(NOT PYTHON2LIBS_FOUND OR NOT PYTHON2_NUMPY_INCLUDE_DIRS) | if(NOT PYTHON2_INCLUDE_PATH OR NOT PYTHON2_NUMPY_INCLUDE_DIRS) | ||||||
|   ocv_module_disable(python2) |   ocv_module_disable(python2) | ||||||
| endif() | endif() | ||||||
|  |  | ||||||
| @@ -7,24 +7,9 @@ set(MODULE_NAME python2) | |||||||
| # Buildbot requires Python 2 to be in root lib dir | # Buildbot requires Python 2 to be in root lib dir | ||||||
| set(MODULE_INSTALL_SUBDIR "") | set(MODULE_INSTALL_SUBDIR "") | ||||||
|  |  | ||||||
| set(PYTHON_INCLUDE_PATH ${PYTHON2_INCLUDE_PATH}) | set(PYTHON PYTHON2) | ||||||
| set(PYTHON_NUMPY_INCLUDE_DIRS ${PYTHON2_NUMPY_INCLUDE_DIRS}) |  | ||||||
| set(PYTHON_EXECUTABLE ${PYTHON2_EXECUTABLE}) |  | ||||||
| set(PYTHON_DEBUG_LIBRARIES ${PYTHON2_DEBUG_LIBRARIES}) |  | ||||||
| set(PYTHON_LIBRARIES ${PYTHON2_LIBRARIES}) |  | ||||||
| set(PYTHON_PACKAGES_PATH ${PYTHON2_PACKAGES_PATH}) |  | ||||||
| set(PYTHON_VERSION_MAJOR ${PYTHON2_VERSION_MAJOR}) |  | ||||||
| set(PYTHON_VERSION_MINOR ${PYTHON2_VERSION_MINOR}) |  | ||||||
|  |  | ||||||
| include(../common.cmake) | include(../common.cmake) | ||||||
|  |  | ||||||
| unset(MODULE_NAME) | unset(MODULE_NAME) | ||||||
| unset(MODULE_INSTALL_SUBDIR) | unset(MODULE_INSTALL_SUBDIR) | ||||||
| unset(PYTHON_INCLUDE_PATH) |  | ||||||
| unset(PYTHON_NUMPY_INCLUDE_DIRS) |  | ||||||
| unset(PYTHON_EXECUTABLE) |  | ||||||
| unset(PYTHON_DEBUG_LIBRARIES) |  | ||||||
| unset(PYTHON_LIBRARIES) |  | ||||||
| unset(PYTHON_PACKAGES_PATH) |  | ||||||
| unset(PYTHON_VERSION_MAJOR) |  | ||||||
| unset(PYTHON_VERSION_MINOR) |  | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| if(NOT PYTHON3LIBS_FOUND OR NOT PYTHON3_NUMPY_INCLUDE_DIRS) | if(NOT PYTHON3_INCLUDE_PATH OR NOT PYTHON3_NUMPY_INCLUDE_DIRS) | ||||||
|   ocv_module_disable(python3) |   ocv_module_disable(python3) | ||||||
| endif() | endif() | ||||||
|  |  | ||||||
| @@ -6,24 +6,9 @@ set(the_description "The python3 bindings") | |||||||
| set(MODULE_NAME python3) | set(MODULE_NAME python3) | ||||||
| set(MODULE_INSTALL_SUBDIR python3) | set(MODULE_INSTALL_SUBDIR python3) | ||||||
|  |  | ||||||
| set(PYTHON_INCLUDE_PATH ${PYTHON3_INCLUDE_PATH}) | set(PYTHON PYTHON3) | ||||||
| set(PYTHON_NUMPY_INCLUDE_DIRS ${PYTHON3_NUMPY_INCLUDE_DIRS}) |  | ||||||
| set(PYTHON_EXECUTABLE ${PYTHON3_EXECUTABLE}) |  | ||||||
| set(PYTHON_DEBUG_LIBRARIES ${PYTHON3_DEBUG_LIBRARIES}) |  | ||||||
| set(PYTHON_LIBRARIES ${PYTHON3_LIBRARIES}) |  | ||||||
| set(PYTHON_PACKAGES_PATH ${PYTHON3_PACKAGES_PATH}) |  | ||||||
| set(PYTHON_VERSION_MAJOR ${PYTHON3_VERSION_MAJOR}) |  | ||||||
| set(PYTHON_VERSION_MINOR ${PYTHON3_VERSION_MINOR}) |  | ||||||
|  |  | ||||||
| include(../common.cmake) | include(../common.cmake) | ||||||
|  |  | ||||||
| unset(MODULE_NAME) | unset(MODULE_NAME) | ||||||
| unset(MODULE_INSTALL_SUBDIR) | unset(MODULE_INSTALL_SUBDIR) | ||||||
| unset(PYTHON_INCLUDE_PATH) |  | ||||||
| unset(PYTHON_NUMPY_INCLUDE_DIRS) |  | ||||||
| unset(PYTHON_EXECUTABLE) |  | ||||||
| unset(PYTHON_DEBUG_LIBRARIES) |  | ||||||
| unset(PYTHON_LIBRARIES) |  | ||||||
| unset(PYTHON_PACKAGES_PATH) |  | ||||||
| unset(PYTHON_VERSION_MAJOR) |  | ||||||
| unset(PYTHON_VERSION_MINOR) |  | ||||||
|   | |||||||
| @@ -44,6 +44,14 @@ gen_template_func_body = Template("""$code_decl | |||||||
| """) | """) | ||||||
|  |  | ||||||
| py_major_version = sys.version_info[0] | py_major_version = sys.version_info[0] | ||||||
|  | if __name__ == "__main__": | ||||||
|  |     if len(sys.argv) > 3: | ||||||
|  |         if sys.argv[3] == 'PYTHON3': | ||||||
|  |             py_major_version = 3 | ||||||
|  |         elif sys.argv[3] == 'PYTHON2': | ||||||
|  |             py_major_version = 2 | ||||||
|  |         else: | ||||||
|  |             raise Exception('Incorrect argument: expected PYTHON2 or PYTHON3, received: ' + sys.argv[3]) | ||||||
| if py_major_version >= 3: | if py_major_version >= 3: | ||||||
|     head_init_str = "PyVarObject_HEAD_INIT(&PyType_Type, 0)" |     head_init_str = "PyVarObject_HEAD_INIT(&PyType_Type, 0)" | ||||||
| else: | else: | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Maksim Shabunin
					Maksim Shabunin