mirror of
https://github.com/lingble/meta-tegra.git
synced 2025-10-29 19:42:41 +00:00
external/openembedded-layer: backport opencv upstream patches for CUDA
to fix issues with python interface generation for opencv cuda modules. Signed-off-by: Matt Madison <matt@madison.systems>
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
From 295390cc1fb80eaedb2d9a29a1528be362e86265 Mon Sep 17 00:00:00 2001
|
||||
From 350eed2e71692cb7961377cedd37141bc85e3e83 Mon Sep 17 00:00:00 2001
|
||||
From: Matt Madison <matt@madison.systems>
|
||||
Date: Wed, 19 Aug 2020 04:53:27 -0700
|
||||
Subject: [PATCH 1/2] Fix search paths in FindCUDNN.cmake
|
||||
Subject: [PATCH 1/7] Fix search paths in FindCUDNN.cmake
|
||||
|
||||
CuDNN libraries are not located in the CUDA toolkit
|
||||
for Tegra platforms.
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
From 19cea321a87f5425a749a161be3fc924643a8cd2 Mon Sep 17 00:00:00 2001
|
||||
From f6fbf377952a328bebbc4df1edd9aa08999016e9 Mon Sep 17 00:00:00 2001
|
||||
From: Matt Madison <matt@madison.systems>
|
||||
Date: Fri, 17 Mar 2023 06:47:40 -0700
|
||||
Subject: [PATCH 2/2] Fix broken override of CUDA_TOOLKIT_TARGET_DIR setting
|
||||
Subject: [PATCH 2/7] Fix broken override of CUDA_TOOLKIT_TARGET_DIR setting
|
||||
|
||||
Signed-off-by: Matt Madison <matt@madison.systems>
|
||||
---
|
||||
@@ -9,7 +9,7 @@ Signed-off-by: Matt Madison <matt@madison.systems>
|
||||
1 file changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/cmake/OpenCVDetectCUDA.cmake b/cmake/OpenCVDetectCUDA.cmake
|
||||
index a3d987a2b8..71dee57aa7 100644
|
||||
index 4a562bdaf9..f2c6b7c76d 100644
|
||||
--- a/cmake/OpenCVDetectCUDA.cmake
|
||||
+++ b/cmake/OpenCVDetectCUDA.cmake
|
||||
@@ -11,7 +11,9 @@ endif()
|
||||
@@ -23,7 +23,7 @@ index a3d987a2b8..71dee57aa7 100644
|
||||
endif()
|
||||
|
||||
if(((NOT CMAKE_VERSION VERSION_LESS "3.9.0") # requires https://gitlab.kitware.com/cmake/cmake/merge_requests/663
|
||||
@@ -551,8 +553,6 @@ if(HAVE_CUDA)
|
||||
@@ -559,8 +561,6 @@ if(HAVE_CUDA)
|
||||
foreach(p ${CUDA_LIBS_PATH})
|
||||
if(MSVC AND CMAKE_GENERATOR MATCHES "Ninja|JOM")
|
||||
set(OPENCV_LINKER_LIBS ${OPENCV_LINKER_LIBS} ${CMAKE_LIBRARY_PATH_FLAG}"${p}")
|
||||
|
||||
@@ -0,0 +1,59 @@
|
||||
From a0aec233409846a3f62cf2df36aa91080eed37c6 Mon Sep 17 00:00:00 2001
|
||||
From: Avasam <samuel.06@hotmail.com>
|
||||
Date: Tue, 4 Jul 2023 17:50:33 -0400
|
||||
Subject: [PATCH 3/7] Add missing properties to error class
|
||||
|
||||
---
|
||||
.../src2/typing_stubs_generation/api_refinement.py | 13 +++++++++++--
|
||||
.../src2/typing_stubs_generation/nodes/__init__.py | 2 +-
|
||||
2 files changed, 12 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/modules/python/src2/typing_stubs_generation/api_refinement.py b/modules/python/src2/typing_stubs_generation/api_refinement.py
|
||||
index f23167f914..599830f8d8 100644
|
||||
--- a/modules/python/src2/typing_stubs_generation/api_refinement.py
|
||||
+++ b/modules/python/src2/typing_stubs_generation/api_refinement.py
|
||||
@@ -3,7 +3,8 @@ __all__ = [
|
||||
]
|
||||
|
||||
from typing import Sequence, Callable
|
||||
-from .nodes import NamespaceNode, FunctionNode, OptionalTypeNode
|
||||
+
|
||||
+from .nodes import NamespaceNode, FunctionNode, OptionalTypeNode, ClassProperty, PrimitiveTypeNode
|
||||
from .ast_utils import find_function_node, SymbolName
|
||||
|
||||
|
||||
@@ -11,7 +12,7 @@ def apply_manual_api_refinement(root: NamespaceNode) -> None:
|
||||
# Export OpenCV exception class
|
||||
builtin_exception = root.add_class("Exception")
|
||||
builtin_exception.is_exported = False
|
||||
- root.add_class("error", (builtin_exception, ))
|
||||
+ root.add_class("error", (builtin_exception, ), ERROR_CLASS_PROPERTIES)
|
||||
for symbol_name, refine_symbol in NODES_TO_REFINE.items():
|
||||
refine_symbol(root, symbol_name)
|
||||
|
||||
@@ -46,3 +47,11 @@ NODES_TO_REFINE = {
|
||||
SymbolName(("cv", ), (), "resize"): make_optional_arg("dsize"),
|
||||
SymbolName(("cv", ), (), "calcHist"): make_optional_arg("mask"),
|
||||
}
|
||||
+ERROR_CLASS_PROPERTIES = (
|
||||
+ ClassProperty("code", PrimitiveTypeNode.int_(), False),
|
||||
+ ClassProperty("err", PrimitiveTypeNode.str_(), False),
|
||||
+ ClassProperty("file", PrimitiveTypeNode.str_(), False),
|
||||
+ ClassProperty("func", PrimitiveTypeNode.str_(), False),
|
||||
+ ClassProperty("line", PrimitiveTypeNode.int_(), False),
|
||||
+ ClassProperty("msg", PrimitiveTypeNode.str_(), False),
|
||||
+)
|
||||
diff --git a/modules/python/src2/typing_stubs_generation/nodes/__init__.py b/modules/python/src2/typing_stubs_generation/nodes/__init__.py
|
||||
index 0ee1df93d9..82f8df8c92 100644
|
||||
--- a/modules/python/src2/typing_stubs_generation/nodes/__init__.py
|
||||
+++ b/modules/python/src2/typing_stubs_generation/nodes/__init__.py
|
||||
@@ -7,5 +7,5 @@ from .constant_node import ConstantNode
|
||||
from .type_node import (
|
||||
TypeNode, OptionalTypeNode, UnionTypeNode, NoneTypeNode, TupleTypeNode,
|
||||
ASTNodeTypeNode, AliasTypeNode, SequenceTypeNode, AnyTypeNode,
|
||||
- AggregatedTypeNode, NDArrayTypeNode, AliasRefTypeNode,
|
||||
+ AggregatedTypeNode, NDArrayTypeNode, AliasRefTypeNode, PrimitiveTypeNode
|
||||
)
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
From fb315a8cea4a6b33e25358bccf2ce64ed2c0ebd2 Mon Sep 17 00:00:00 2001
|
||||
From: Vadim Levin <vadim.levin@xperience.ai>
|
||||
Date: Mon, 10 Jul 2023 14:30:44 +0300
|
||||
Subject: [PATCH 4/7] fix: typing stubs overload presence check
|
||||
|
||||
---
|
||||
modules/python/src2/typing_stubs_generation/generation.py | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/modules/python/src2/typing_stubs_generation/generation.py b/modules/python/src2/typing_stubs_generation/generation.py
|
||||
index f89200e0ed..ea6b64bde0 100644
|
||||
--- a/modules/python/src2/typing_stubs_generation/generation.py
|
||||
+++ b/modules/python/src2/typing_stubs_generation/generation.py
|
||||
@@ -535,7 +535,7 @@ def check_overload_presence(node: Union[NamespaceNode, ClassNode]) -> bool:
|
||||
otherwise.
|
||||
"""
|
||||
for func_node in node.functions.values():
|
||||
- if len(func_node.overloads):
|
||||
+ if len(func_node.overloads) > 1:
|
||||
return True
|
||||
return False
|
||||
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
From bbca78d2f6e5bde35386d9edd9966a7312bb409b Mon Sep 17 00:00:00 2001
|
||||
From: Vadim Levin <vadim.levin@xperience.ai>
|
||||
Date: Mon, 10 Jul 2023 14:38:15 +0300
|
||||
Subject: [PATCH 5/7] fix: recursively re-export nested submodules
|
||||
|
||||
---
|
||||
.../python/src2/typing_stubs_generation/generation.py | 9 +++++++--
|
||||
1 file changed, 7 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/modules/python/src2/typing_stubs_generation/generation.py b/modules/python/src2/typing_stubs_generation/generation.py
|
||||
index ea6b64bde0..f41563e276 100644
|
||||
--- a/modules/python/src2/typing_stubs_generation/generation.py
|
||||
+++ b/modules/python/src2/typing_stubs_generation/generation.py
|
||||
@@ -621,12 +621,17 @@ def _populate_reexported_symbols(root: NamespaceNode) -> None:
|
||||
# Re-export all submodules to allow referencing symbols in submodules
|
||||
# without submodule import. Example:
|
||||
# `cv2.aruco.ArucoDetector` should be accessible without `import cv2.aruco`
|
||||
- for submodule in root.namespaces.values():
|
||||
- root.reexported_submodules.append(submodule.export_name)
|
||||
+ def _reexport_submodule(ns: NamespaceNode) -> None:
|
||||
+ for submodule in ns.namespaces.values():
|
||||
+ ns.reexported_submodules.append(submodule.export_name)
|
||||
+ _reexport_submodule(submodule)
|
||||
+
|
||||
+ _reexport_submodule(root)
|
||||
|
||||
# Special cases, symbols defined in possible pure Python submodules should be
|
||||
root.reexported_submodules_symbols["mat_wrapper"].append("Mat")
|
||||
|
||||
+
|
||||
def _write_reexported_symbols_section(module: NamespaceNode, output_stream: StringIO) -> None:
|
||||
"""Write re-export section for the given module.
|
||||
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,85 @@
|
||||
From bbc25633c60f1fd32bff694c906eff1420676179 Mon Sep 17 00:00:00 2001
|
||||
From: Vadim Levin <vadim.levin@xperience.ai>
|
||||
Date: Mon, 10 Jul 2023 13:55:54 +0300
|
||||
Subject: [PATCH 6/7] feat: add matrix type stubs generation
|
||||
|
||||
Adds missing typing stubs:
|
||||
|
||||
- Matrix depths: `CV_8U`, `CV_8S` and etc.
|
||||
- Matrix type constants: `CV_8UC1`, `CV_32FC3` and etc.
|
||||
- Matrix type factory functions: `CV_*(channels) -> int` and `CV_MAKETYPE`
|
||||
---
|
||||
.../typing_stubs_generation/api_refinement.py | 31 ++++++++++++++++++-
|
||||
.../typing_stubs_generation/generation.py | 3 --
|
||||
2 files changed, 30 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/modules/python/src2/typing_stubs_generation/api_refinement.py b/modules/python/src2/typing_stubs_generation/api_refinement.py
|
||||
index 599830f8d8..f7d3a9dd08 100644
|
||||
--- a/modules/python/src2/typing_stubs_generation/api_refinement.py
|
||||
+++ b/modules/python/src2/typing_stubs_generation/api_refinement.py
|
||||
@@ -4,11 +4,13 @@ __all__ = [
|
||||
|
||||
from typing import Sequence, Callable
|
||||
|
||||
-from .nodes import NamespaceNode, FunctionNode, OptionalTypeNode, ClassProperty, PrimitiveTypeNode
|
||||
+from .nodes import (NamespaceNode, FunctionNode, OptionalTypeNode,
|
||||
+ ClassProperty, PrimitiveTypeNode)
|
||||
from .ast_utils import find_function_node, SymbolName
|
||||
|
||||
|
||||
def apply_manual_api_refinement(root: NamespaceNode) -> None:
|
||||
+ export_matrix_type_constants(root)
|
||||
# Export OpenCV exception class
|
||||
builtin_exception = root.add_class("Exception")
|
||||
builtin_exception.is_exported = False
|
||||
@@ -17,6 +19,33 @@ def apply_manual_api_refinement(root: NamespaceNode) -> None:
|
||||
refine_symbol(root, symbol_name)
|
||||
|
||||
|
||||
+def export_matrix_type_constants(root: NamespaceNode) -> None:
|
||||
+ MAX_PREDEFINED_CHANNELS = 4
|
||||
+
|
||||
+ depth_names = ("CV_8U", "CV_8S", "CV_16U", "CV_16S", "CV_32S",
|
||||
+ "CV_32F", "CV_64F", "CV_16F")
|
||||
+ for depth_value, depth_name in enumerate(depth_names):
|
||||
+ # Export depth constants
|
||||
+ root.add_constant(depth_name, str(depth_value))
|
||||
+ # Export predefined types
|
||||
+ for c in range(MAX_PREDEFINED_CHANNELS):
|
||||
+ root.add_constant(f"{depth_name}C{c + 1}",
|
||||
+ f"{depth_value + 8 * c}")
|
||||
+ # Export type creation function
|
||||
+ root.add_function(
|
||||
+ f"{depth_name}C",
|
||||
+ (FunctionNode.Arg("channels", PrimitiveTypeNode.int_()), ),
|
||||
+ FunctionNode.RetType(PrimitiveTypeNode.int_())
|
||||
+ )
|
||||
+ # Export CV_MAKETYPE
|
||||
+ root.add_function(
|
||||
+ "CV_MAKETYPE",
|
||||
+ (FunctionNode.Arg("depth", PrimitiveTypeNode.int_()),
|
||||
+ FunctionNode.Arg("channels", PrimitiveTypeNode.int_())),
|
||||
+ FunctionNode.RetType(PrimitiveTypeNode.int_())
|
||||
+ )
|
||||
+
|
||||
+
|
||||
def make_optional_arg(arg_name: str) -> Callable[[NamespaceNode, SymbolName], None]:
|
||||
def _make_optional_arg(root_node: NamespaceNode,
|
||||
function_symbol_name: SymbolName) -> None:
|
||||
diff --git a/modules/python/src2/typing_stubs_generation/generation.py b/modules/python/src2/typing_stubs_generation/generation.py
|
||||
index f41563e276..2d6d4d338e 100644
|
||||
--- a/modules/python/src2/typing_stubs_generation/generation.py
|
||||
+++ b/modules/python/src2/typing_stubs_generation/generation.py
|
||||
@@ -103,9 +103,6 @@ def _generate_typing_stubs(root: NamespaceNode, output_path: Path) -> None:
|
||||
|
||||
_write_reexported_symbols_section(root, output_stream)
|
||||
|
||||
- # Write constants section, because constants don't impose any dependencies
|
||||
- _generate_section_stub(StubSection("# Constants", ConstantNode), root,
|
||||
- output_stream, 0)
|
||||
# NOTE: Enumerations require special handling, because all enumeration
|
||||
# constants are exposed as module attributes
|
||||
has_enums = _generate_section_stub(StubSection("# Enumerations", EnumerationNode),
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,304 @@
|
||||
From 23fb6c7e134a51a8e7fb3491e3d973e59bad0ac3 Mon Sep 17 00:00:00 2001
|
||||
From: Vadim Levin <vadim.levin@xperience.ai>
|
||||
Date: Wed, 19 Jul 2023 16:51:41 +0300
|
||||
Subject: [PATCH 7/7] Merge pull request #24022 from
|
||||
VadimLevin:dev/vlevin/python-typing-cuda
|
||||
|
||||
Fix python typing stubs generation for CUDA modules #24022
|
||||
|
||||
resolves #23946
|
||||
resolves #23945
|
||||
resolves opencv/opencv-python#871
|
||||
|
||||
### 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 another license that is incompatible with OpenCV
|
||||
- [x] The PR is proposed to the proper branch
|
||||
- [x] There is a reference to the 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.
|
||||
- [x] The feature is well documented and sample code can be built with the project CMake
|
||||
---
|
||||
.../typing_stubs_generation/api_refinement.py | 68 +++++++++++++++++--
|
||||
.../src2/typing_stubs_generation/ast_utils.py | 29 +++++++-
|
||||
.../typing_stubs_generation/generation.py | 53 +++++----------
|
||||
.../predefined_types.py | 4 ++
|
||||
4 files changed, 112 insertions(+), 42 deletions(-)
|
||||
|
||||
diff --git a/modules/python/src2/typing_stubs_generation/api_refinement.py b/modules/python/src2/typing_stubs_generation/api_refinement.py
|
||||
index f7d3a9dd08..a879d0ac4b 100644
|
||||
--- a/modules/python/src2/typing_stubs_generation/api_refinement.py
|
||||
+++ b/modules/python/src2/typing_stubs_generation/api_refinement.py
|
||||
@@ -2,14 +2,17 @@ __all__ = [
|
||||
"apply_manual_api_refinement"
|
||||
]
|
||||
|
||||
-from typing import Sequence, Callable
|
||||
+from typing import cast, Sequence, Callable, Iterable
|
||||
|
||||
-from .nodes import (NamespaceNode, FunctionNode, OptionalTypeNode,
|
||||
- ClassProperty, PrimitiveTypeNode)
|
||||
-from .ast_utils import find_function_node, SymbolName
|
||||
+from .nodes import (NamespaceNode, FunctionNode, OptionalTypeNode, TypeNode,
|
||||
+ ClassProperty, PrimitiveTypeNode, ASTNodeTypeNode,
|
||||
+ AggregatedTypeNode)
|
||||
+from .ast_utils import (find_function_node, SymbolName,
|
||||
+ for_each_function_overload)
|
||||
|
||||
|
||||
def apply_manual_api_refinement(root: NamespaceNode) -> None:
|
||||
+ refine_cuda_module(root)
|
||||
export_matrix_type_constants(root)
|
||||
# Export OpenCV exception class
|
||||
builtin_exception = root.add_class("Exception")
|
||||
@@ -57,13 +60,65 @@ def make_optional_arg(arg_name: str) -> Callable[[NamespaceNode, SymbolName], No
|
||||
continue
|
||||
|
||||
overload.arguments[arg_idx].type_node = OptionalTypeNode(
|
||||
- overload.arguments[arg_idx].type_node
|
||||
+ cast(TypeNode, overload.arguments[arg_idx].type_node)
|
||||
)
|
||||
|
||||
return _make_optional_arg
|
||||
|
||||
|
||||
-def _find_argument_index(arguments: Sequence[FunctionNode.Arg], name: str) -> int:
|
||||
+def refine_cuda_module(root: NamespaceNode) -> None:
|
||||
+ def fix_cudaoptflow_enums_names() -> None:
|
||||
+ for class_name in ("NvidiaOpticalFlow_1_0", "NvidiaOpticalFlow_2_0"):
|
||||
+ if class_name not in cuda_root.classes:
|
||||
+ continue
|
||||
+ opt_flow_class = cuda_root.classes[class_name]
|
||||
+ _trim_class_name_from_argument_types(
|
||||
+ for_each_function_overload(opt_flow_class), class_name
|
||||
+ )
|
||||
+
|
||||
+ def fix_namespace_usage_scope(cuda_ns: NamespaceNode) -> None:
|
||||
+ USED_TYPES = ("GpuMat", "Stream")
|
||||
+
|
||||
+ def fix_type_usage(type_node: TypeNode) -> None:
|
||||
+ if isinstance(type_node, AggregatedTypeNode):
|
||||
+ for item in type_node.items:
|
||||
+ fix_type_usage(item)
|
||||
+ if isinstance(type_node, ASTNodeTypeNode):
|
||||
+ if type_node._typename in USED_TYPES:
|
||||
+ type_node._typename = f"cuda_{type_node._typename}"
|
||||
+
|
||||
+ for overload in for_each_function_overload(cuda_ns):
|
||||
+ if overload.return_type is not None:
|
||||
+ fix_type_usage(overload.return_type.type_node)
|
||||
+ for type_node in [arg.type_node for arg in overload.arguments
|
||||
+ if arg.type_node is not None]:
|
||||
+ fix_type_usage(type_node)
|
||||
+
|
||||
+ if "cuda" not in root.namespaces:
|
||||
+ return
|
||||
+ cuda_root = root.namespaces["cuda"]
|
||||
+ fix_cudaoptflow_enums_names()
|
||||
+ for ns in [ns for ns_name, ns in root.namespaces.items()
|
||||
+ if ns_name.startswith("cuda")]:
|
||||
+ fix_namespace_usage_scope(ns)
|
||||
+
|
||||
+
|
||||
+def _trim_class_name_from_argument_types(
|
||||
+ overloads: Iterable[FunctionNode.Overload],
|
||||
+ class_name: str
|
||||
+) -> None:
|
||||
+ separator = f"{class_name}_"
|
||||
+ for overload in overloads:
|
||||
+ for arg in [arg for arg in overload.arguments
|
||||
+ if arg.type_node is not None]:
|
||||
+ ast_node = cast(ASTNodeTypeNode, arg.type_node)
|
||||
+ if class_name in ast_node.ctype_name:
|
||||
+ fixed_name = ast_node._typename.split(separator)[-1]
|
||||
+ ast_node._typename = fixed_name
|
||||
+
|
||||
+
|
||||
+def _find_argument_index(arguments: Sequence[FunctionNode.Arg],
|
||||
+ name: str) -> int:
|
||||
for i, arg in enumerate(arguments):
|
||||
if arg.name == name:
|
||||
return i
|
||||
@@ -76,6 +131,7 @@ NODES_TO_REFINE = {
|
||||
SymbolName(("cv", ), (), "resize"): make_optional_arg("dsize"),
|
||||
SymbolName(("cv", ), (), "calcHist"): make_optional_arg("mask"),
|
||||
}
|
||||
+
|
||||
ERROR_CLASS_PROPERTIES = (
|
||||
ClassProperty("code", PrimitiveTypeNode.int_(), False),
|
||||
ClassProperty("err", PrimitiveTypeNode.str_(), False),
|
||||
diff --git a/modules/python/src2/typing_stubs_generation/ast_utils.py b/modules/python/src2/typing_stubs_generation/ast_utils.py
|
||||
index 4cdf807260..47c06571a5 100644
|
||||
--- a/modules/python/src2/typing_stubs_generation/ast_utils.py
|
||||
+++ b/modules/python/src2/typing_stubs_generation/ast_utils.py
|
||||
@@ -1,5 +1,5 @@
|
||||
from typing import (NamedTuple, Sequence, Tuple, Union, List,
|
||||
- Dict, Callable, Optional)
|
||||
+ Dict, Callable, Optional, Generator)
|
||||
import keyword
|
||||
|
||||
from .nodes import (ASTNode, NamespaceNode, ClassNode, FunctionNode,
|
||||
@@ -404,6 +404,33 @@ def get_enum_module_and_export_name(enum_node: EnumerationNode) -> Tuple[str, st
|
||||
return enum_export_name, namespace_node.full_export_name
|
||||
|
||||
|
||||
+def for_each_class(
|
||||
+ node: Union[NamespaceNode, ClassNode]
|
||||
+) -> Generator[ClassNode, None, None]:
|
||||
+ for cls in node.classes.values():
|
||||
+ yield cls
|
||||
+ if len(cls.classes):
|
||||
+ yield from for_each_class(cls)
|
||||
+
|
||||
+
|
||||
+def for_each_function(
|
||||
+ node: Union[NamespaceNode, ClassNode],
|
||||
+ traverse_class_nodes: bool = True
|
||||
+) -> Generator[FunctionNode, None, None]:
|
||||
+ yield from node.functions.values()
|
||||
+ if traverse_class_nodes:
|
||||
+ for cls in for_each_class(node):
|
||||
+ yield from for_each_function(cls)
|
||||
+
|
||||
+
|
||||
+def for_each_function_overload(
|
||||
+ node: Union[NamespaceNode, ClassNode],
|
||||
+ traverse_class_nodes: bool = True
|
||||
+) -> Generator[FunctionNode.Overload, None, None]:
|
||||
+ for func in for_each_function(node, traverse_class_nodes):
|
||||
+ yield from func.overloads
|
||||
+
|
||||
+
|
||||
if __name__ == '__main__':
|
||||
import doctest
|
||||
doctest.testmod()
|
||||
diff --git a/modules/python/src2/typing_stubs_generation/generation.py b/modules/python/src2/typing_stubs_generation/generation.py
|
||||
index 2d6d4d338e..b4e8cb22c6 100644
|
||||
--- a/modules/python/src2/typing_stubs_generation/generation.py
|
||||
+++ b/modules/python/src2/typing_stubs_generation/generation.py
|
||||
@@ -3,17 +3,20 @@ __all__ = ("generate_typing_stubs", )
|
||||
from io import StringIO
|
||||
from pathlib import Path
|
||||
import re
|
||||
-from typing import (Generator, Type, Callable, NamedTuple, Union, Set, Dict,
|
||||
+from typing import (Type, Callable, NamedTuple, Union, Set, Dict,
|
||||
Collection, Tuple, List)
|
||||
import warnings
|
||||
|
||||
-from .ast_utils import get_enclosing_namespace, get_enum_module_and_export_name
|
||||
+from .ast_utils import (get_enclosing_namespace,
|
||||
+ get_enum_module_and_export_name,
|
||||
+ for_each_function_overload,
|
||||
+ for_each_class)
|
||||
|
||||
from .predefined_types import PREDEFINED_TYPES
|
||||
from .api_refinement import apply_manual_api_refinement
|
||||
|
||||
-from .nodes import (ASTNode, ASTNodeType, NamespaceNode, ClassNode, FunctionNode,
|
||||
- EnumerationNode, ConstantNode)
|
||||
+from .nodes import (ASTNode, ASTNodeType, NamespaceNode, ClassNode,
|
||||
+ FunctionNode, EnumerationNode, ConstantNode)
|
||||
|
||||
from .nodes.type_node import (TypeNode, AliasTypeNode, AliasRefTypeNode,
|
||||
AggregatedTypeNode, ASTNodeTypeNode,
|
||||
@@ -105,8 +108,9 @@ def _generate_typing_stubs(root: NamespaceNode, output_path: Path) -> None:
|
||||
|
||||
# NOTE: Enumerations require special handling, because all enumeration
|
||||
# constants are exposed as module attributes
|
||||
- has_enums = _generate_section_stub(StubSection("# Enumerations", EnumerationNode),
|
||||
- root, output_stream, 0)
|
||||
+ has_enums = _generate_section_stub(
|
||||
+ StubSection("# Enumerations", EnumerationNode), root, output_stream, 0
|
||||
+ )
|
||||
# Collect all enums from class level and export them to module level
|
||||
for class_node in root.classes.values():
|
||||
if _generate_enums_from_classes_tree(class_node, output_stream, indent=0):
|
||||
@@ -536,30 +540,6 @@ def check_overload_presence(node: Union[NamespaceNode, ClassNode]) -> bool:
|
||||
return True
|
||||
return False
|
||||
|
||||
-
|
||||
-def _for_each_class(node: Union[NamespaceNode, ClassNode]) \
|
||||
- -> Generator[ClassNode, None, None]:
|
||||
- for cls in node.classes.values():
|
||||
- yield cls
|
||||
- if len(cls.classes):
|
||||
- yield from _for_each_class(cls)
|
||||
-
|
||||
-
|
||||
-def _for_each_function(node: Union[NamespaceNode, ClassNode]) \
|
||||
- -> Generator[FunctionNode, None, None]:
|
||||
- for func in node.functions.values():
|
||||
- yield func
|
||||
- for cls in node.classes.values():
|
||||
- yield from _for_each_function(cls)
|
||||
-
|
||||
-
|
||||
-def _for_each_function_overload(node: Union[NamespaceNode, ClassNode]) \
|
||||
- -> Generator[FunctionNode.Overload, None, None]:
|
||||
- for func in _for_each_function(node):
|
||||
- for overload in func.overloads:
|
||||
- yield overload
|
||||
-
|
||||
-
|
||||
def _collect_required_imports(root: NamespaceNode) -> Set[str]:
|
||||
"""Collects all imports required for classes and functions typing stubs
|
||||
declarations.
|
||||
@@ -582,7 +562,7 @@ def _collect_required_imports(root: NamespaceNode) -> Set[str]:
|
||||
has_overload = check_overload_presence(root)
|
||||
# if there is no module-level functions with overload, check its presence
|
||||
# during class traversing, including their inner-classes
|
||||
- for cls in _for_each_class(root):
|
||||
+ for cls in for_each_class(root):
|
||||
if not has_overload and check_overload_presence(cls):
|
||||
has_overload = True
|
||||
required_imports.add("import typing")
|
||||
@@ -600,8 +580,9 @@ def _collect_required_imports(root: NamespaceNode) -> Set[str]:
|
||||
if has_overload:
|
||||
required_imports.add("import typing")
|
||||
# Importing modules required to resolve functions arguments
|
||||
- for overload in _for_each_function_overload(root):
|
||||
- for arg in filter(lambda a: a.type_node is not None, overload.arguments):
|
||||
+ for overload in for_each_function_overload(root):
|
||||
+ for arg in filter(lambda a: a.type_node is not None,
|
||||
+ overload.arguments):
|
||||
_add_required_usage_imports(arg.type_node, required_imports) # type: ignore
|
||||
if overload.return_type is not None:
|
||||
_add_required_usage_imports(overload.return_type.type_node,
|
||||
@@ -625,11 +606,13 @@ def _populate_reexported_symbols(root: NamespaceNode) -> None:
|
||||
|
||||
_reexport_submodule(root)
|
||||
|
||||
- # Special cases, symbols defined in possible pure Python submodules should be
|
||||
+ # Special cases, symbols defined in possible pure Python submodules
|
||||
+ # should be
|
||||
root.reexported_submodules_symbols["mat_wrapper"].append("Mat")
|
||||
|
||||
|
||||
-def _write_reexported_symbols_section(module: NamespaceNode, output_stream: StringIO) -> None:
|
||||
+def _write_reexported_symbols_section(module: NamespaceNode,
|
||||
+ output_stream: StringIO) -> None:
|
||||
"""Write re-export section for the given module.
|
||||
|
||||
Re-export statements have from `from module_name import smth as smth`.
|
||||
diff --git a/modules/python/src2/typing_stubs_generation/predefined_types.py b/modules/python/src2/typing_stubs_generation/predefined_types.py
|
||||
index fe9a37a45e..ce4f901e79 100644
|
||||
--- a/modules/python/src2/typing_stubs_generation/predefined_types.py
|
||||
+++ b/modules/python/src2/typing_stubs_generation/predefined_types.py
|
||||
@@ -22,6 +22,10 @@ _PREDEFINED_TYPES = (
|
||||
PrimitiveTypeNode.int_("uchar"),
|
||||
PrimitiveTypeNode.int_("unsigned"),
|
||||
PrimitiveTypeNode.int_("int64"),
|
||||
+ PrimitiveTypeNode.int_("uint8_t"),
|
||||
+ PrimitiveTypeNode.int_("int8_t"),
|
||||
+ PrimitiveTypeNode.int_("int32_t"),
|
||||
+ PrimitiveTypeNode.int_("uint32_t"),
|
||||
PrimitiveTypeNode.int_("size_t"),
|
||||
PrimitiveTypeNode.float_("float"),
|
||||
PrimitiveTypeNode.float_("double"),
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -17,6 +17,11 @@ EXTRA_OECMAKE:append:cuda = ' -DOPENCV_CUDA_DETECTION_NVCC_FLAGS="-ccbin ${CUDAH
|
||||
SRC_URI:append:cuda = " \
|
||||
file://0001-Fix-search-paths-in-FindCUDNN.cmake.patch \
|
||||
file://0002-Fix-broken-override-of-CUDA_TOOLKIT_TARGET_DIR-setti.patch \
|
||||
file://0003-Add-missing-properties-to-error-class.patch \
|
||||
file://0004-fix-typing-stubs-overload-presence-check.patch \
|
||||
file://0005-fix-recursively-re-export-nested-submodules.patch \
|
||||
file://0006-feat-add-matrix-type-stubs-generation.patch \
|
||||
file://0007-Merge-pull-request-24022-from-VadimLevin-dev-vlevin-.patch \
|
||||
"
|
||||
|
||||
OPTICALFLOW_MD5 = "a73cd48b18dcc0cc8933b30796074191"
|
||||
|
||||
Reference in New Issue
Block a user