OCV_OPTION(CV_DISABLE_OPTIMIZATION "Disable explicit optimized code (dispatched code/intrinsics/loop unrolling/etc)" OFF )
OCV_OPTION(CV_TRACE "Enable OpenCV code trace" ON)
+OCV_OPTION(ENABLE_PYLINT "Add target with Pylint checks" (${BUILD_DOCS} OR ${BUILD_EXAMPLES}) )
if(ENABLE_IMPL_COLLECTION)
add_definitions(-DCV_COLLECT_IMPL_DATA)
find_package(JNI)
endif()
+if(ENABLE_PYLINT)
+ include(cmake/OpenCVPylint.cmake)
+endif()
+
+
if(ANDROID AND ANDROID_EXECUTABLE AND ANT_EXECUTABLE AND (ANT_VERSION VERSION_GREATER 1.7) AND (ANDROID_TOOLS_Pkg_Revision GREATER 13))
SET(CAN_BUILD_ANDROID_PROJECTS TRUE)
else()
# Extra OpenCV targets: uninstall, package_source, perf, etc.
include(cmake/OpenCVExtraTargets.cmake)
-
# ----------------------------------------------------------------------------
# Process subdirectories
# ----------------------------------------------------------------------------
endif()
endif()
+if(COMMAND ocv_pylint_finalize)
+ ocv_pylint_add_directory(${CMAKE_CURRENT_LIST_DIR}/samples/python)
+ ocv_pylint_add_directory(${CMAKE_CURRENT_LIST_DIR}/samples/dnn)
+ ocv_pylint_add_directory_recurse(${CMAKE_CURRENT_LIST_DIR}/samples/python/tutorial_code)
+ ocv_pylint_finalize()
+endif()
+
# ----------------------------------------------------------------------------
# Summary:
# ----------------------------------------------------------------------------
status("")
status(" Python (for build):" PYTHON_DEFAULT_AVAILABLE THEN "${PYTHON_DEFAULT_EXECUTABLE}" ELSE NO)
+if(PYLINT_FOUND AND PYLINT_EXECUTABLE)
+status(" Pylint:" PYLINT_FOUND THEN "${PYLINT_EXECUTABLE} (ver: ${PYLINT_VERSION}, checks: ${PYLINT_TOTAL_TARGETS})" ELSE NO)
+endif()
# ========================== java ==========================
status("")
# PYLINT_VERSION
# A string denoting the version of pylint that has been found
-find_program(PYLINT_EXECUTABLE pylint PATHS /usr/bin)
+find_host_program(PYLINT_EXECUTABLE pylint PATHS /usr/bin)
if(PYLINT_EXECUTABLE)
execute_process(COMMAND ${PYLINT_EXECUTABLE} --version OUTPUT_VARIABLE PYLINT_VERSION_RAW ERROR_QUIET)
--- /dev/null
+if(COMMAND ocv_pylint_add_target)
+ return()
+endif()
+
+find_package(Pylint QUIET)
+if(NOT PYLINT_FOUND OR NOT PYLINT_EXECUTABLE)
+ include("${CMAKE_CURRENT_LIST_DIR}/FindPylint.cmake")
+endif()
+
+if(NOT PYLINT_FOUND)
+ macro(ocv_pylint_add_target) # dummy
+ endmacro()
+ return()
+endif()
+
+macro(ocv_pylint_cleanup)
+ foreach(__id ${PYLINT_TARGET_ID})
+ ocv_clear_vars(
+ PYLINT_TARGET_${__id}_CWD
+ PYLINT_TARGET_${__id}_TARGET
+ PYLINT_TARGET_${__id}_RCFILE
+ PYLINT_TARGET_${__id}_OPTIONS
+ )
+ endforeach()
+ ocv_clear_vars(PYLINT_TARGET_ID)
+endmacro()
+ocv_pylint_cleanup()
+
+macro(ocv_pylint_add_target)
+ cmake_parse_arguments(__pylint "" "CWD;TARGET;RCFILE;" "OPTIONS" ${ARGN})
+ if(__pylint_UNPARSED_ARGUMENTS)
+ message(WARNING "Unsupported arguments: ${__pylint_UNPARSED_ARGUMENTS}
+(keep versions of opencv/opencv_contrib synchronized)
+")
+ endif()
+ ocv_assert(__pylint_TARGET)
+ set(__cwd ${__pylint_CWD})
+ if(__cwd STREQUAL "default")
+ get_filename_component(__cwd "${__pylint_TARGET}" DIRECTORY)
+ endif()
+ set(__rcfile ${__pylint_RCFILE})
+ if(NOT __rcfile AND NOT __pylint_OPTIONS)
+ if(__cwd)
+ set(__path "${__cwd}")
+ else()
+ get_filename_component(__path "${__pylint_TARGET}" DIRECTORY)
+ endif()
+ while(__path MATCHES "^${CMAKE_SOURCE_DIR}")
+ if(EXISTS "${__path}/pylintrc")
+ set(__rcfile "${__path}/pylintrc")
+ break()
+ endif()
+ if(EXISTS "${__path}/.pylintrc")
+ set(__rcfile "${__path}/.pylintrc")
+ break()
+ endif()
+ get_filename_component(__path "${__path}" DIRECTORY)
+ endwhile()
+ if(NOT __rcfile)
+ set(__rcfile "${CMAKE_BINARY_DIR}/pylintrc")
+ endif()
+ endif()
+
+ list(LENGTH PYLINT_TARGET_ID __id)
+ list(APPEND PYLINT_TARGET_ID ${__id})
+ set(PYLINT_TARGET_ID "${PYLINT_TARGET_ID}" CACHE INTERNAL "")
+ set(PYLINT_TARGET_${__id}_CWD "${__cwd}" CACHE INTERNAL "")
+ set(PYLINT_TARGET_${__id}_TARGET "${__pylint_TARGET}" CACHE INTERNAL "")
+ set(PYLINT_TARGET_${__id}_RCFILE "${__rcfile}" CACHE INTERNAL "")
+ set(PYLINT_TARGET_${__id}_OPTIONS "${__pylint_options}" CACHE INTERNAL "")
+endmacro()
+
+macro(ocv_pylint_add_directory_recurse __path)
+ file(GLOB_RECURSE __python_scripts ${__path}/*.py)
+ list(LENGTH __python_scripts __total)
+ if(__total EQUAL 0)
+ message(WARNING "Pylint: Python files are not found: ${__path}")
+ endif()
+ foreach(__script ${__python_scripts})
+ ocv_pylint_add_target(TARGET ${__script} ${ARGN})
+ endforeach()
+endmacro()
+
+macro(ocv_pylint_add_directory __path)
+ file(GLOB __python_scripts ${__path}/*.py)
+ list(LENGTH __python_scripts __total)
+ if(__total EQUAL 0)
+ message(WARNING "Pylint: Python files are not found: ${__path}")
+ endif()
+ foreach(__script ${__python_scripts})
+ ocv_pylint_add_target(TARGET ${__script} ${ARGN})
+ endforeach()
+endmacro()
+
+function(ocv_pylint_finalize)
+ if(NOT PYLINT_FOUND)
+ return()
+ endif()
+
+ file(COPY "${CMAKE_SOURCE_DIR}/platforms/scripts/pylintrc" DESTINATION "${CMAKE_BINARY_DIR}")
+
+ set(PYLINT_CONFIG_SCRIPT "")
+ ocv_cmake_script_append_var(PYLINT_CONFIG_SCRIPT
+ PYLINT_EXECUTABLE
+ PYLINT_TARGET_ID
+ )
+ set(__sources "")
+ foreach(__id ${PYLINT_TARGET_ID})
+ ocv_cmake_script_append_var(PYLINT_CONFIG_SCRIPT
+ PYLINT_TARGET_${__id}_CWD
+ PYLINT_TARGET_${__id}_TARGET
+ PYLINT_TARGET_${__id}_RCFILE
+ PYLINT_TARGET_${__id}_OPTIONS
+ )
+ list(APPEND __sources ${PYLINT_TARGET_${__id}_TARGET} ${PYLINT_TARGET_${__id}_RCFILE})
+ endforeach()
+ list(REMOVE_DUPLICATES __sources)
+
+ list(LENGTH PYLINT_TARGET_ID __total)
+ set(PYLINT_TOTAL_TARGETS "${__total}" CACHE INTERNAL "")
+ message(STATUS "Pylint: registered ${__total} targets. Build 'check_pylint' target to run checks (\"cmake --build . --target check_pylint\" or \"make check_pylint\")")
+ configure_file("${OpenCV_SOURCE_DIR}/cmake/templates/pylint.cmake.in" "${CMAKE_BINARY_DIR}/pylint.cmake" @ONLY)
+
+ add_custom_target(check_pylint
+ COMMAND ${CMAKE_COMMAND} -P "${CMAKE_BINARY_DIR}/pylint.cmake"
+ COMMENT "Running pylint"
+ DEPENDS ${__sources}
+ SOURCES ${__sources}
+ )
+endfunction()
--- /dev/null
+@PYLINT_CONFIG_SCRIPT@
+
+set(__total 0)
+set(__passed 0)
+set(__errors 0)
+
+if(NOT DEFINED VERBOSE AND DEFINED ENV{VERBOSE})
+ set(VERBOSE "$ENV{VERBOSE}")
+endif()
+
+foreach(__id ${PYLINT_TARGET_ID})
+ message("Pylint check: ${PYLINT_TARGET_${__id}_TARGET}")
+ set(__options ${PYLINT_TARGET_${__id}_OPTIONS})
+ if(PYLINT_TARGET_${__id}_RCFILE)
+ set(__options ${__options} --rcfile=${PYLINT_TARGET_${__id}_RCFILE})
+ endif()
+ set(__cwd "${PYLINT_TARGET_${__id}_CWD}")
+ if(NOT __cwd)
+ set(__cwd ".")
+ endif()
+ if(VERBOSE)
+ message("Run: ${PYLINT_EXECUTABLE} \"${PYLINT_TARGET_${__id}_TARGET}\" ${__options}
+ directory: \"${__cwd}\"")
+ endif()
+ execute_process(COMMAND ${PYLINT_EXECUTABLE} "${PYLINT_TARGET_${__id}_TARGET}" ${__options}
+ WORKING_DIRECTORY "${__cwd}"
+ RESULT_VARIABLE __res
+ )
+ math(EXPR __total "${__total} + 1")
+ if(NOT __res EQUAL 0)
+ math(EXPR __errors "${__errors} + 1")
+ else()
+ math(EXPR __passed "${__passed} + 1")
+ endif()
+endforeach()
+
+message("Pylint status:
+ TOTAL : ${__total}
+ PASSED: ${__passed}
+ ERRORS: ${__errors}
+")
+if(NOT __errors EQUAL 0)
+ message(SEND_ERROR "ERROR: Pylint check FAILED")
+endif()
make doxygen
@endcode
- Open <i>doc/doxygen/html/index.html</i> file in your favorite browser
-- Test your python code:
+- Test your Python code:
@code{.sh}
- make run_pylint_on_tutorials
+ make check_pylint
@endcode
Quick start {#tutorial_documentation_quick_start}
6. _Optional_: describe return value of the function using the _returns_ command.
7. _Optional_: add "See also" section with links to similar functions or classes
8. _Optional_: add bibliographic reference if any.
-9. Test your code. (Python: "make run_pylint_on_tutorials")
+9. Test your code. (Python: "make check_pylint")
10. Generate doxygen documentation and verify results.
Write the tutorial {#tutorial_documentation_steps_tutorial}
add_subdirectory(cpp)
add_subdirectory(java/tutorial_code)
-add_subdirectory(python/tutorial_code)
add_subdirectory(dnn)
add_subdirectory(gpu)
add_subdirectory(tapi)
+++ /dev/null
-# ----------------------------------------------------------------------------
-# CMake file to run pylint on the tutorial python files.
-#
-# ----------------------------------------------------------------------------
-include(${CMAKE_SOURCE_DIR}/cmake/FindPylint.cmake)
-
-project(run_pylint_on_tutorials)
-
-if(PYLINT_FOUND)
- message(STATUS "pylint version: ${PYLINT_VERSION}")
- set(curdir "${CMAKE_CURRENT_SOURCE_DIR}")
- file(GLOB_RECURSE PYTHON_SCRIPTS ${curdir}/*.py)
- add_custom_target("${PROJECT_NAME}")
-
- foreach(SCRIPT ${PYTHON_SCRIPTS})
- get_filename_component(SCRIPT_NAME ${SCRIPT} NAME_WE)
- add_custom_command(TARGET "${PROJECT_NAME}"
- COMMAND ${PYLINT_EXECUTABLE} ${SCRIPT}
- --rcfile=${curdir}/pylintrc
- COMMENT "Running pylint on : ${SCRIPT_NAME}.py"
- )
- endforeach()
-endif()