mirror of
https://github.com/opencv/opencv.git
synced 2024-12-15 18:09:11 +08:00
a9424868a1
Python typing stub generation #20370 Add stub generation to `gen2.py`, addressing #14590. ### Pull Request Readiness Checklist See details at https://github.com/opencv/opencv/wiki/How_to_contribute#making-a-good-pull-request - [x] I agree to contribute to the project under Apache 2 License. - [x] To the best of my knowledge, the proposed patch is not based on a code under GPL or other license that is incompatible with OpenCV - [x] The PR is proposed to proper branch - [x] There is reference to original bug report and related work - [ ] There is accuracy test, performance test and test data in opencv_extra repository, if applicable Patch to opencv_extra has the same branch name. - [ ] The feature is well documented and sample code can be built with the project CMake
144 lines
5.2 KiB
CMake
144 lines
5.2 KiB
CMake
set(MODULE_NAME "python_bindings_generator")
|
|
set(OPENCV_MODULE_IS_PART_OF_WORLD FALSE)
|
|
ocv_add_module(${MODULE_NAME} INTERNAL)
|
|
|
|
set(OPENCV_PYTHON_SIGNATURES_FILE "${CMAKE_CURRENT_BINARY_DIR}/pyopencv_signatures.json" CACHE INTERNAL "")
|
|
set(OPENCV_PYTHON_BINDINGS_DIR "${CMAKE_CURRENT_BINARY_DIR}" CACHE INTERNAL "")
|
|
|
|
# This file is included from a subdirectory
|
|
set(PYTHON_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../")
|
|
|
|
if(NOT OPENCV_SKIP_PYTHON_LOADER)
|
|
include("${PYTHON_SOURCE_DIR}/python_loader.cmake")
|
|
endif()
|
|
|
|
# get list of modules to wrap
|
|
set(OPENCV_PYTHON_MODULES)
|
|
foreach(m ${OPENCV_MODULES_BUILD})
|
|
if (";${OPENCV_MODULE_${m}_WRAPPERS};" MATCHES ";python;" AND HAVE_${m})
|
|
list(APPEND OPENCV_PYTHON_MODULES ${m})
|
|
#message(STATUS "\t${m}")
|
|
endif()
|
|
endforeach()
|
|
|
|
set(opencv_hdrs "")
|
|
set(opencv_userdef_hdrs "")
|
|
foreach(m ${OPENCV_PYTHON_MODULES})
|
|
foreach (hdr ${OPENCV_MODULE_${m}_HEADERS})
|
|
ocv_is_subdir(is_sub "${OPENCV_MODULE_${m}_LOCATION}/include" "${hdr}")
|
|
if(is_sub)
|
|
list(APPEND opencv_hdrs "${hdr}")
|
|
endif()
|
|
endforeach()
|
|
|
|
# both wrapping and C++ implementation
|
|
file(GLOB hdr2 ${OPENCV_MODULE_${m}_LOCATION}/misc/python/python_*.hpp)
|
|
list(SORT hdr2)
|
|
list(APPEND opencv_hdrs ${hdr2})
|
|
list(APPEND opencv_userdef_hdrs ${hdr2})
|
|
|
|
file(GLOB hdr ${OPENCV_MODULE_${m}_LOCATION}/misc/python/shadow*.hpp)
|
|
list(SORT hdr)
|
|
list(APPEND opencv_hdrs ${hdr})
|
|
file(GLOB userdef_hdrs ${OPENCV_MODULE_${m}_LOCATION}/misc/python/pyopencv*.hpp)
|
|
list(SORT userdef_hdrs)
|
|
list(APPEND opencv_userdef_hdrs ${userdef_hdrs})
|
|
endforeach(m)
|
|
|
|
# header blacklist
|
|
ocv_list_filterout(opencv_hdrs "modules/.*\\\\.h$")
|
|
ocv_list_filterout(opencv_hdrs "modules/core/.*/cuda/")
|
|
ocv_list_filterout(opencv_hdrs "modules/core/.*/hal/")
|
|
ocv_list_filterout(opencv_hdrs "modules/core/.*/opencl/")
|
|
ocv_list_filterout(opencv_hdrs "modules/.+/utils/.*")
|
|
ocv_list_filterout(opencv_hdrs "modules/.*\\\\.inl\\\\.h*")
|
|
ocv_list_filterout(opencv_hdrs "modules/.*_inl\\\\.h*")
|
|
ocv_list_filterout(opencv_hdrs "modules/.*\\\\.details\\\\.h*")
|
|
ocv_list_filterout(opencv_hdrs "modules/.*\\\\.private\\\\.h*")
|
|
ocv_list_filterout(opencv_hdrs "modules/.*/private\\\\.h*")
|
|
ocv_list_filterout(opencv_hdrs "modules/.*/legacy/.*")
|
|
ocv_list_filterout(opencv_hdrs "modules/.*/detection_based_tracker\\\\.hpp") # Conditional compilation
|
|
if(NOT HAVE_CUDA)
|
|
ocv_list_filterout(opencv_hdrs "modules/cuda.*")
|
|
ocv_list_filterout(opencv_hdrs "modules/cudev")
|
|
endif()
|
|
|
|
set(cv2_generated_files
|
|
"${CMAKE_CURRENT_BINARY_DIR}/pyopencv_generated_enums.h"
|
|
"${CMAKE_CURRENT_BINARY_DIR}/pyopencv_generated_funcs.h"
|
|
"${CMAKE_CURRENT_BINARY_DIR}/pyopencv_generated_include.h"
|
|
"${CMAKE_CURRENT_BINARY_DIR}/pyopencv_generated_modules.h"
|
|
"${CMAKE_CURRENT_BINARY_DIR}/pyopencv_generated_modules_content.h"
|
|
"${CMAKE_CURRENT_BINARY_DIR}/pyopencv_generated_types.h"
|
|
"${CMAKE_CURRENT_BINARY_DIR}/pyopencv_generated_types_content.h"
|
|
"${OPENCV_PYTHON_SIGNATURES_FILE}"
|
|
)
|
|
|
|
string(REPLACE ";" "\n" opencv_hdrs_ "${opencv_hdrs}")
|
|
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/headers.txt" "${opencv_hdrs_}")
|
|
file(GLOB_RECURSE typing_stubs_generation_files "${PYTHON_SOURCE_DIR}/src2/typing_stubs_generation/*.py")
|
|
add_custom_command(
|
|
OUTPUT ${cv2_generated_files}
|
|
COMMAND "${PYTHON_DEFAULT_EXECUTABLE}" "${PYTHON_SOURCE_DIR}/src2/gen2.py" "${CMAKE_CURRENT_BINARY_DIR}" "${CMAKE_CURRENT_BINARY_DIR}/headers.txt"
|
|
DEPENDS "${PYTHON_SOURCE_DIR}/src2/gen2.py"
|
|
"${PYTHON_SOURCE_DIR}/src2/hdr_parser.py"
|
|
"${typing_stubs_generation_files}"
|
|
"${PYTHON_SOURCE_DIR}/src2/typing_stubs_generator.py"
|
|
# not a real build dependency (file(WRITE) result): ${CMAKE_CURRENT_BINARY_DIR}/headers.txt
|
|
${opencv_hdrs}
|
|
COMMENT "Generate files for Python bindings and documentation"
|
|
)
|
|
|
|
add_custom_target(gen_opencv_python_source DEPENDS ${cv2_generated_files})
|
|
|
|
if(TARGET copy_opencv_typing_stubs)
|
|
add_dependencies(copy_opencv_typing_stubs gen_opencv_python_source)
|
|
endif()
|
|
|
|
set(cv2_custom_hdr "${CMAKE_CURRENT_BINARY_DIR}/pyopencv_custom_headers.h")
|
|
set(cv2_custom_hdr_str "//user-defined headers\n")
|
|
foreach(uh ${opencv_userdef_hdrs})
|
|
set(cv2_custom_hdr_str "${cv2_custom_hdr_str}#include \"${uh}\"\n")
|
|
endforeach(uh)
|
|
if(EXISTS "${cv2_custom_hdr}")
|
|
file(READ "${cv2_custom_hdr}" __content)
|
|
else()
|
|
set(__content "")
|
|
endif()
|
|
if("${__content}" STREQUAL "${cv2_custom_hdr_str}")
|
|
# Up-to-date
|
|
else()
|
|
file(WRITE "${cv2_custom_hdr}" "${cv2_custom_hdr_str}")
|
|
endif()
|
|
unset(__content)
|
|
|
|
|
|
#
|
|
# Configuration for standalone build of Python bindings
|
|
#
|
|
set(PYTHON_CONFIG_SCRIPT "")
|
|
ocv_cmake_script_append_var(PYTHON_CONFIG_SCRIPT
|
|
CMAKE_BUILD_TYPE
|
|
BUILD_SHARED_LIBS
|
|
|
|
CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
|
|
CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
|
|
|
|
CV_GCC CV_CLANG ENABLE_NOISY_WARNINGS
|
|
|
|
CMAKE_MODULE_LINKER_FLAGS
|
|
CMAKE_INSTALL_PREFIX
|
|
OPENCV_PYTHON_INSTALL_PATH
|
|
|
|
OpenCV_SOURCE_DIR
|
|
|
|
OPENCV_FORCE_PYTHON_LIBS
|
|
OPENCV_PYTHON_SKIP_LINKER_EXCLUDE_LIBS
|
|
|
|
OPENCV_PYTHON_BINDINGS_DIR
|
|
cv2_custom_hdr
|
|
cv2_generated_files
|
|
)
|
|
set(CMAKE_HELPER_SCRIPT "${CMAKE_BINARY_DIR}/opencv_python_config.cmake")
|
|
file(GENERATE OUTPUT "${CMAKE_HELPER_SCRIPT}" CONTENT "${PYTHON_CONFIG_SCRIPT}")
|