diff --git a/Merge-pull-request-21114-from-dwardor-patch-1.patch b/Merge-pull-request-21114-from-dwardor-patch-1.patch new file mode 100644 index 0000000000000000000000000000000000000000..af1ef49106e36aa565a0c5c2affccceb9bbc4f93 --- /dev/null +++ b/Merge-pull-request-21114-from-dwardor-patch-1.patch @@ -0,0 +1,165 @@ +From 54c180092d2ca02e0460eac7176cab23890fc11e Mon Sep 17 00:00:00 2001 +From: dwardor <50771662+dwardor@users.noreply.github.com> +Date: Wed, 22 Dec 2021 13:00:00 +0100 +Subject: [PATCH] Merge pull request #21114 from dwardor:patch-1 + +* Fix compile against lapack-3.10.0 + +Fix compilation against lapack >= 3.9.1 and 3.10.0 while not breaking older versions + +OpenCVFindLAPACK.cmake & CMakeLists.txt: determine OPENCV_USE_LAPACK_PREFIX from LAPACK_VERSION + +hal_internal.cpp : Only apply LAPACK_FUNC to functions whose number of inputs depends on LAPACK_FORTRAN_STR_LEN in lapack >= 3.9.1 + +lapack_check.cpp : remove LAPACK_FUNC which is not OK as function are not used with input parameters (so lapack.h preprocessing of "LAPACK_xxxx(...)" is not applicable with lapack >= 3.9.1 +If not removed lapack_check fails so LAPACK is deactivated in build (not want we want) + +use OCV_ prefix and don't use Global, instead generate OCV_LAPACK_FUNC depending on CMake Conditions + +Remove CONFIG from find_package(LAPACK) and use LAPACK_GLOBAL and LAPACK_NAME to figure out if using netlib's reference LAPACK implementation and how to #define OCV_LAPACK_FUNC(f) + +* Fix typos and grammar in comments +--- + cmake/OpenCVFindLAPACK.cmake | 17 +++++++++++++++ + modules/core/src/hal_internal.cpp | 36 +++++++++++++++---------------- + 2 files changed, 35 insertions(+), 18 deletions(-) + +diff --git a/cmake/OpenCVFindLAPACK.cmake b/cmake/OpenCVFindLAPACK.cmake +index 342bebc723..3f17b7b289 100644 +--- a/cmake/OpenCVFindLAPACK.cmake ++++ b/cmake/OpenCVFindLAPACK.cmake +@@ -51,6 +51,23 @@ macro(ocv_lapack_check) + if(NOT "${OPENCV_CBLAS_H_PATH_${_lapack_impl}}" STREQUAL "${OPENCV_LAPACKE_H_PATH_${_lapack_impl}}") + list(APPEND _lapack_content "#include \"${OPENCV_LAPACKE_H_PATH_${_lapack_impl}}\"") + endif() ++ list(APPEND _lapack_content " ++#if defined(LAPACK_GLOBAL) || defined(LAPACK_NAME) ++/* ++ * Using netlib's reference LAPACK implementation version >= 3.4.0 (first with C interface). ++ * Use LAPACK_xxxx to transparently (via predefined lapack macros) deal with pre and post 3.9.1 versions. ++ * LAPACK 3.9.1 introduces LAPACK_FORTRAN_STRLEN_END and modifies (through preprocessing) the declarations of the following functions used in opencv ++ * sposv_, dposv_, spotrf_, dpotrf_, sgesdd_, dgesdd_, sgels_, dgels_ ++ * which end up with an extra parameter. ++ * So we also need to preprocess the function calls in opencv coding by prefixing them with LAPACK_. ++ * The good news is the preprocessing works fine whatever netlib's LAPACK version. ++ */ ++#define OCV_LAPACK_FUNC(f) LAPACK_##f ++#else ++/* Using other LAPACK implementations so fall back to opencv's assumption until now */ ++#define OCV_LAPACK_FUNC(f) f##_ ++#endif ++") + if(${_lapack_add_extern_c}) + list(APPEND _lapack_content "}") + endif() +diff --git a/modules/core/src/hal_internal.cpp b/modules/core/src/hal_internal.cpp +index 483281d1f7..cbe02780d2 100644 +--- a/modules/core/src/hal_internal.cpp ++++ b/modules/core/src/hal_internal.cpp +@@ -163,9 +163,9 @@ lapack_Cholesky(fptype* a, size_t a_step, int m, fptype* b, size_t b_step, int n + if(n == 1 && b_step == sizeof(fptype)) + { + if(typeid(fptype) == typeid(float)) +- sposv_(L, &m, &n, (float*)a, &lda, (float*)b, &m, &lapackStatus); ++ OCV_LAPACK_FUNC(sposv)(L, &m, &n, (float*)a, &lda, (float*)b, &m, &lapackStatus); + else if(typeid(fptype) == typeid(double)) +- dposv_(L, &m, &n, (double*)a, &lda, (double*)b, &m, &lapackStatus); ++ OCV_LAPACK_FUNC(dposv)(L, &m, &n, (double*)a, &lda, (double*)b, &m, &lapackStatus); + } + else + { +@@ -174,9 +174,9 @@ lapack_Cholesky(fptype* a, size_t a_step, int m, fptype* b, size_t b_step, int n + transpose(b, ldb, tmpB, m, m, n); + + if(typeid(fptype) == typeid(float)) +- sposv_(L, &m, &n, (float*)a, &lda, (float*)tmpB, &m, &lapackStatus); ++ OCV_LAPACK_FUNC(sposv)(L, &m, &n, (float*)a, &lda, (float*)tmpB, &m, &lapackStatus); + else if(typeid(fptype) == typeid(double)) +- dposv_(L, &m, &n, (double*)a, &lda, (double*)tmpB, &m, &lapackStatus); ++ OCV_LAPACK_FUNC(dposv)(L, &m, &n, (double*)a, &lda, (double*)tmpB, &m, &lapackStatus); + + transpose(tmpB, m, b, ldb, n, m); + delete[] tmpB; +@@ -185,9 +185,9 @@ lapack_Cholesky(fptype* a, size_t a_step, int m, fptype* b, size_t b_step, int n + else + { + if(typeid(fptype) == typeid(float)) +- spotrf_(L, &m, (float*)a, &lda, &lapackStatus); ++ OCV_LAPACK_FUNC(spotrf)(L, &m, (float*)a, &lda, &lapackStatus); + else if(typeid(fptype) == typeid(double)) +- dpotrf_(L, &m, (double*)a, &lda, &lapackStatus); ++ OCV_LAPACK_FUNC(dpotrf)(L, &m, (double*)a, &lda, &lapackStatus); + } + + if(lapackStatus == 0) *info = true; +@@ -227,17 +227,17 @@ lapack_SVD(fptype* a, size_t a_step, fptype *w, fptype* u, size_t u_step, fptype + } + + if(typeid(fptype) == typeid(float)) +- sgesdd_(mode, &m, &n, (float*)a, &lda, (float*)w, (float*)u, &ldu, (float*)vt, &ldv, (float*)&work1, &lwork, iworkBuf, info); ++ OCV_LAPACK_FUNC(sgesdd)(mode, &m, &n, (float*)a, &lda, (float*)w, (float*)u, &ldu, (float*)vt, &ldv, (float*)&work1, &lwork, iworkBuf, info); + else if(typeid(fptype) == typeid(double)) +- dgesdd_(mode, &m, &n, (double*)a, &lda, (double*)w, (double*)u, &ldu, (double*)vt, &ldv, (double*)&work1, &lwork, iworkBuf, info); ++ OCV_LAPACK_FUNC(dgesdd)(mode, &m, &n, (double*)a, &lda, (double*)w, (double*)u, &ldu, (double*)vt, &ldv, (double*)&work1, &lwork, iworkBuf, info); + + lwork = (int)round(work1); //optimal buffer size + fptype* buffer = new fptype[lwork + 1]; + + if(typeid(fptype) == typeid(float)) +- sgesdd_(mode, &m, &n, (float*)a, &lda, (float*)w, (float*)u, &ldu, (float*)vt, &ldv, (float*)buffer, &lwork, iworkBuf, info); ++ OCV_LAPACK_FUNC(sgesdd)(mode, &m, &n, (float*)a, &lda, (float*)w, (float*)u, &ldu, (float*)vt, &ldv, (float*)buffer, &lwork, iworkBuf, info); + else if(typeid(fptype) == typeid(double)) +- dgesdd_(mode, &m, &n, (double*)a, &lda, (double*)w, (double*)u, &ldu, (double*)vt, &ldv, (double*)buffer, &lwork, iworkBuf, info); ++ OCV_LAPACK_FUNC(dgesdd)(mode, &m, &n, (double*)a, &lda, (double*)w, (double*)u, &ldu, (double*)vt, &ldv, (double*)buffer, &lwork, iworkBuf, info); + + if(!(flags & CV_HAL_SVD_NO_UV)) + transpose_square_inplace(vt, ldv, n); +@@ -288,18 +288,18 @@ lapack_QR(fptype* a, size_t a_step, int m, int n, int k, fptype* b, size_t b_ste + if (k == 1 && b_step == sizeof(fptype)) + { + if (typeid(fptype) == typeid(float)) +- sgels_(mode, &m, &n, &k, (float*)tmpA, &ldtmpA, (float*)b, &m, (float*)&work1, &lwork, info); ++ OCV_LAPACK_FUNC(sgels)(mode, &m, &n, &k, (float*)tmpA, &ldtmpA, (float*)b, &m, (float*)&work1, &lwork, info); + else if (typeid(fptype) == typeid(double)) +- dgels_(mode, &m, &n, &k, (double*)tmpA, &ldtmpA, (double*)b, &m, (double*)&work1, &lwork, info); ++ OCV_LAPACK_FUNC(dgels)(mode, &m, &n, &k, (double*)tmpA, &ldtmpA, (double*)b, &m, (double*)&work1, &lwork, info); + + lwork = cvRound(work1); //optimal buffer size + std::vector workBufMemHolder(lwork + 1); + fptype* buffer = &workBufMemHolder.front(); + + if (typeid(fptype) == typeid(float)) +- sgels_(mode, &m, &n, &k, (float*)tmpA, &ldtmpA, (float*)b, &m, (float*)buffer, &lwork, info); ++ OCV_LAPACK_FUNC(sgels)(mode, &m, &n, &k, (float*)tmpA, &ldtmpA, (float*)b, &m, (float*)buffer, &lwork, info); + else if (typeid(fptype) == typeid(double)) +- dgels_(mode, &m, &n, &k, (double*)tmpA, &ldtmpA, (double*)b, &m, (double*)buffer, &lwork, info); ++ OCV_LAPACK_FUNC(dgels)(mode, &m, &n, &k, (double*)tmpA, &ldtmpA, (double*)b, &m, (double*)buffer, &lwork, info); + } + else + { +@@ -309,18 +309,18 @@ lapack_QR(fptype* a, size_t a_step, int m, int n, int k, fptype* b, size_t b_ste + transpose(b, ldb, tmpB, m, m, k); + + if (typeid(fptype) == typeid(float)) +- sgels_(mode, &m, &n, &k, (float*)tmpA, &ldtmpA, (float*)tmpB, &m, (float*)&work1, &lwork, info); ++ OCV_LAPACK_FUNC(sgels)(mode, &m, &n, &k, (float*)tmpA, &ldtmpA, (float*)tmpB, &m, (float*)&work1, &lwork, info); + else if (typeid(fptype) == typeid(double)) +- dgels_(mode, &m, &n, &k, (double*)tmpA, &ldtmpA, (double*)tmpB, &m, (double*)&work1, &lwork, info); ++ OCV_LAPACK_FUNC(dgels)(mode, &m, &n, &k, (double*)tmpA, &ldtmpA, (double*)tmpB, &m, (double*)&work1, &lwork, info); + + lwork = cvRound(work1); //optimal buffer size + std::vector workBufMemHolder(lwork + 1); + fptype* buffer = &workBufMemHolder.front(); + + if (typeid(fptype) == typeid(float)) +- sgels_(mode, &m, &n, &k, (float*)tmpA, &ldtmpA, (float*)tmpB, &m, (float*)buffer, &lwork, info); ++ OCV_LAPACK_FUNC(sgels)(mode, &m, &n, &k, (float*)tmpA, &ldtmpA, (float*)tmpB, &m, (float*)buffer, &lwork, info); + else if (typeid(fptype) == typeid(double)) +- dgels_(mode, &m, &n, &k, (double*)tmpA, &ldtmpA, (double*)tmpB, &m, (double*)buffer, &lwork, info); ++ OCV_LAPACK_FUNC(dgels)(mode, &m, &n, &k, (double*)tmpA, &ldtmpA, (double*)tmpB, &m, (double*)buffer, &lwork, info); + + transpose(tmpB, m, b, ldb, k, m); + } +-- +2.20.1 + diff --git a/calib3d-use-OCV_LAPACK_FUNC.patch b/calib3d-use-OCV_LAPACK_FUNC.patch new file mode 100644 index 0000000000000000000000000000000000000000..52f608325ecee91b59fb1116f3693dce15cf6919 --- /dev/null +++ b/calib3d-use-OCV_LAPACK_FUNC.patch @@ -0,0 +1,39 @@ +From 70779d4e66946dca4e0da602f10ec37573b9ac88 Mon Sep 17 00:00:00 2001 +From: Pavel Rojtberg +Date: Sat, 17 Sep 2022 13:04:42 +0200 +Subject: [PATCH] calib3d: use OCV_LAPACK_FUNC + +--- + modules/calib3d/src/usac/dls_solver.cpp | 2 +- + modules/calib3d/src/usac/essential_solver.cpp | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +diff --git a/modules/calib3d/src/usac/dls_solver.cpp b/modules/calib3d/src/usac/dls_solver.cpp +index 0abb26cecc..8f109d51bf 100644 +--- a/modules/calib3d/src/usac/dls_solver.cpp ++++ b/modules/calib3d/src/usac/dls_solver.cpp +@@ -160,7 +160,7 @@ public: + double wr[27], wi[27] = {0}; // 27 = mat_order + std::vector work(lwork), eig_vecs(729); + char jobvl = 'N', jobvr = 'V'; // only left eigen vectors are computed +- dgeev_(&jobvl, &jobvr, &mat_order, (double*)solution_polynomial.data, &lda, wr, wi, nullptr, &ldvl, ++ OCV_LAPACK_FUNC(dgeev)(&jobvl, &jobvr, &mat_order, (double*)solution_polynomial.data, &lda, wr, wi, nullptr, &ldvl, + &eig_vecs[0], &ldvr, &work[0], &lwork, &info); + if (info != 0) return 0; + #endif +diff --git a/modules/calib3d/src/usac/essential_solver.cpp b/modules/calib3d/src/usac/essential_solver.cpp +index 0adca0966f..014cd36f40 100644 +--- a/modules/calib3d/src/usac/essential_solver.cpp ++++ b/modules/calib3d/src/usac/essential_solver.cpp +@@ -161,7 +161,7 @@ public: + int mat_order = 10, info, lda = 10, ldvl = 10, ldvr = 1, lwork = 100; + double wr[10], wi[10] = {0}, eig_vecs[100], work[100]; // 10 = mat_order, 100 = lwork + char jobvl = 'V', jobvr = 'N'; // only left eigen vectors are computed +- dgeev_(&jobvl, &jobvr, &mat_order, action_mat_data, &lda, wr, wi, eig_vecs, &ldvl, ++ OCV_LAPACK_FUNC(dgeev)(&jobvl, &jobvr, &mat_order, action_mat_data, &lda, wr, wi, eig_vecs, &ldvl, + nullptr, &ldvr, work, &lwork, &info); + if (info != 0) return 0; + #endif +-- +2.20.1 + diff --git a/opencv.spec b/opencv.spec index c68df721ca68f9645298a5ed3710c0a6480eb32f..c2544ddfbe5d5efa52afb88e67e0328f6beb5cde 100644 --- a/opencv.spec +++ b/opencv.spec @@ -1,6 +1,6 @@ Name: opencv Version: 4.5.2 -Release: 8 +Release: 9 Summary: OpenCV means IntelĀ® Open Source Computer Vision Library. License: Apache-2.0 URL: https://github.com/opencv/opencv @@ -16,6 +16,8 @@ Patch2: Fix_compilation_of_copy_assignment_operators_with_GCC.patch Patch3: Repair_clang_abi.patch Patch4: CVE-2022-0561_and_CVE-2022-0562.patch Patch5: CVE-2022-0908.patch +Patch6: Merge-pull-request-21114-from-dwardor-patch-1.patch +Patch7: calib3d-use-OCV_LAPACK_FUNC.patch BuildRequires: qt5-qtbase-devel BuildRequires: gcc-c++ gcc autoconf pkgconfig protobuf-compiler protobuf @@ -104,6 +106,9 @@ make install DESTDIR=%{buildroot} %{python3_sitelib}/cv2/* %changelog +* Wed Nov 22 2023 konglidong - 4.5.2-9 +- backport upstraem patch to fix build failed + * Sat May 06 2023 misaka00251 - 4.5.2-8 - Fix tests failed - Add option to build DNN