Ver código fonte

openmvg: add new package (#7408)

* openmvg: add new package

* Update packages/o/openmvg/xmake.lua

Co-authored-by: Saikari <[email protected]>

* fix linux(clang), windows

* optimize

* fix links

* fix links

* Unbundle some dependencies

* fix

* flann internal

* ceres internal

* add links

* unbundle flann & lemon

* Update xmake.lua

* unbundle cereal

* unbundle clp, coinutils, osi, ceres

* fix suitesparse

* fix gklib

* fix gklib

* fix gklib checks

* fix gklib

* Update macos_arm64.yml

* Update macos_x86_64.yml

* fix ceres finding suitesparse

* try to fix ceres

* Revert ceres

* try to fix ceres

* fix ceres, gflags(Android r27), glog

* fix gflags, glog

* revise ceres, clp, gflags, gklib

* Update packages/g/gflags/xmake.lua

Co-authored-by: Saikari <[email protected]>

* Update packages/o/openmvg/xmake.lua

Co-authored-by: Saikari <[email protected]>

* Update openmvg

* use add_links between add_deps/on_check

* test remove gklib setting symbols

---------

Co-authored-by: Saikari <[email protected]>
Co-authored-by: star9029 <[email protected]>
choyy 1 mês atrás
pai
commit
13c4a14f86

+ 47 - 0
packages/c/ceres-solver/patches/2.2.0/suitesparse.patch

@@ -0,0 +1,47 @@
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 8e49c19..9ef55e2 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -292,20 +292,19 @@ if (SUITESPARSE)
+   # built with SuiteSparse support.
+ 
+   # Check for SuiteSparse and dependencies.
+-  find_package(SuiteSparse 4.5.6 COMPONENTS CHOLMOD SPQR
+-    OPTIONAL_COMPONENTS Partition)
++  find_package(CHOLMOD REQUIRED)
++  find_package(SPQR REQUIRED)
++  add_library (SuiteSparse::Partition IMPORTED INTERFACE)
++  set_property (TARGET SuiteSparse::Partition APPEND PROPERTY INTERFACE_LINK_LIBRARIES SuiteSparse::CHOLMOD)
++  set(SuiteSparse_FOUND TRUE)
++  set(SuiteSparse_Partition_FOUND TRUE)
++  set(SuiteSparse_VERSION ${SUITESPARSE_CONFIG_VERSION})
+   if (SuiteSparse_FOUND)
+     set(SuiteSparse_DEPENDENCY "find_dependency(SuiteSparse ${SuiteSparse_VERSION})")
+     # By default, if all of SuiteSparse's dependencies are found, Ceres is
+     # built with SuiteSparse support.
+     message("-- Found SuiteSparse ${SuiteSparse_VERSION}, "
+             "building with SuiteSparse.")
+-
+-    if (SuiteSparse_NO_CMAKE OR NOT SuiteSparse_DIR)
+-      install(FILES ${Ceres_SOURCE_DIR}/cmake/FindSuiteSparse.cmake
+-                    ${Ceres_SOURCE_DIR}/cmake/FindMETIS.cmake
+-              DESTINATION ${RELATIVE_CMAKECONFIG_INSTALL_DIR})
+-    endif (SuiteSparse_NO_CMAKE OR NOT SuiteSparse_DIR)
+   else (SuiteSparse_FOUND)
+     # Disable use of SuiteSparse if it cannot be found and continue.
+     message("-- Did not find all SuiteSparse dependencies, disabling "
+diff --git a/internal/ceres/CMakeLists.txt b/internal/ceres/CMakeLists.txt
+index f9fc241..55a3ceb 100644
+--- a/internal/ceres/CMakeLists.txt
++++ b/internal/ceres/CMakeLists.txt
+@@ -33,7 +33,9 @@
+ # Avoid 'xxx.cc has no symbols' warnings from source files which are 'empty'
+ # when their enclosing #ifdefs are disabled.
+ find_package(Threads REQUIRED)
+-list(APPEND CERES_LIBRARY_PRIVATE_DEPENDENCIES Threads::Threads)
++include(FindPkgConfig)
++pkg_search_module(gklib REQUIRED IMPORTED_TARGET gklib)
++list(APPEND CERES_LIBRARY_PRIVATE_DEPENDENCIES Threads::Threads PkgConfig::gklib)
+ # Make dependency visible to the parent CMakeLists.txt
+ set(Threads_DEPENDENCY "find_dependency (Threads)" PARENT_SCOPE)
+ 

+ 3 - 2
packages/c/ceres-solver/xmake.lua

@@ -9,12 +9,13 @@ package("ceres-solver")
     add_versions("2.2.0", "48b2302a7986ece172898477c3bcd6deb8fb5cf19b3327bc49969aad4cede82d")
 
     add_patches("2.1.0", "patches/2.1.0/int64.patch", "1df14f30abf1a942204b408c780eabbeac0859ba5a6db3459b55c47479583c57")
+    add_patches("2.2.0", "patches/2.2.0/suitesparse.patch", "1eaa17d98a99e8f5ac5a75f8685ee165bd1e05f5ea6da3774b4933de4084e3b5")
 
     add_configs("blas", {description = "Choose BLAS library to use.", default = "openblas", type = "string", values = {"mkl", "openblas"}})
     add_configs("suitesparse", {description = "Enable SuiteSparse.", default = true, type = "boolean"})
     add_configs("cuda", {description = "Enable CUDA support.", default = false, type = "boolean"})
 
-    add_deps("cmake", "eigen", "glog", "gflags")
+    add_deps("cmake", "eigen", "glog", "gflags", "pkgconf")
 
     on_load(function (package)
         if package:config("suitesparse") then
@@ -38,7 +39,7 @@ package("ceres-solver")
         table.insert(configs, "-DCMAKE_BUILD_TYPE=" .. (package:is_debug() and "Debug" or "Release"))
         table.insert(configs, "-DBUILD_SHARED_LIBS=" .. (package:config("shared") and "ON" or "OFF"))
         if package:is_plat("windows") then
-            table.insert(configs, "-DMSVC_USE_STATIC_CRT=" .. (package:config("vs_runtime"):startswith("MT") and "ON" or "OFF"))
+            table.insert(configs, "-DMSVC_USE_STATIC_CRT=" .. (package:has_runtime("MT", "MTd") and "ON" or "OFF"))
         end
         table.insert(configs, "-DSUITESPARSE=" .. (package:config("suitesparse") and "ON" or "OFF"))
         table.insert(configs, "-DUSE_CUDA=" .. (package:config("cuda") and "ON" or "OFF"))

+ 3 - 3
packages/c/coin-or-clp/port/xmake.lua

@@ -58,8 +58,8 @@ target("clp")
      "Clp/src/*Abc*.cpp"
     )
     add_includedirs("Clp/src")
-    add_headerfiles("Clp/src/*.hpp", "Clp/src/*.h")
-    add_headerfiles("Clp/src/OsiClp/*.hpp")
+    add_headerfiles("Clp/src/*.hpp", "Clp/src/*.h", {prefixdir = "coin"})
+    add_headerfiles("Clp/src/OsiClp/*.hpp", {prefixdir = "coin"})
     remove_headerfiles(
      "Clp/src/ClpCholeskyMumps.hpp",
      "Clp/src/ClpCholeskyUfl.hpp",
@@ -74,4 +74,4 @@ target("clp")
     if is_plat("windows") and is_kind("shared") then
         add_rules("utils.symbols.export_all", {export_classes = true})
     end
-    add_packages("coin-or-coinutils", "coin-or-osi", "glpk")
+    add_packages("coin-or-coinutils", "coin-or-osi")

+ 15 - 0
packages/g/gflags/patches/v2.2.2/fix-cmake.patch

@@ -1,3 +1,18 @@
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 657a1f4..5092a59 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -72,6 +72,10 @@
+ 
+ cmake_minimum_required (VERSION 3.0.2 FATAL_ERROR)
+ 
++if(POLICY CMP0057)
++  cmake_policy(SET CMP0057 NEW)
++endif()
++
+ if (POLICY CMP0042)
+   cmake_policy (SET CMP0042 NEW)
+ endif ()
 diff --git a/cmake/config.cmake.in b/cmake/config.cmake.in
 index a512c2a..2fe7844 100644
 --- a/cmake/config.cmake.in

+ 1 - 1
packages/g/gflags/xmake.lua

@@ -7,7 +7,7 @@ package("gflags")
     add_urls("https://github.com/gflags/gflags/archive/refs/tags/$(version).tar.gz",
              "https://github.com/gflags/gflags.git")
     add_versions("v2.2.2", "34af2f15cf7367513b352bdcd2493ab14ce43692d2dcd9dfc499492966c64dcf")
-    add_patches("v2.2.2", path.join(os.scriptdir(), "patches", "v2.2.2", "fix-cmake.patch"), "a2b9f99fe1421723aacd66e1a268efcb23c3dbf357776d4942c0bb25fc89d15c")
+    add_patches("v2.2.2", "patches/v2.2.2/fix-cmake.patch", "03c256993c42bf8d1f8dfd100d552fda9e0cf000e02f4aee2fd6b33a3563be56")
 
     add_configs("mt", {description = "Build the multi-threaded gflags library.", default = true, type = "boolean"})
     add_deps("cmake")

+ 2 - 2
packages/g/gklib/port/xmake.lua

@@ -19,8 +19,8 @@ end
 
 includes("@builtin/check")
 
-configvar_check_cincludes("HAVE_EXECINFO_H", "execinfo.h")
-configvar_check_cfuncs("HAVE_GETLINE", "getline")
+check_cincludes("HAVE_STDBOOL_H", "stdbool.h")
+check_cfuncs("HAVE_GETLINE", "getline")
 
 target("gklib")
     set_kind("$(kind)")

+ 4 - 0
packages/g/gklib/xmake.lua

@@ -19,6 +19,10 @@ package("gklib")
     end
 
     on_install("!iphoneos", function (package)
+        if package:has_cincludes("execinfo.h") then
+            package:add("defines",  "HAVE_EXECINFO_H")
+        end
+
         local configs = {
             openmp = package:config("openmp"),
             regex = package:config("regex"),

+ 3 - 3
packages/g/glog/xmake.lua

@@ -48,8 +48,8 @@ package("glog")
         end
 
         -- fix cmake try run
-        if package:is_plat("mingw") then
-            table.insert(configs, "-DHAVE_SYMBOLIZE_EXITCODE=ON")
+        if package:is_plat("mingw") or (package:is_plat("windows") and package:is_arch("arm64")) then
+            table.insert(configs, "-DHAVE_SYMBOLIZE_EXITCODE=1")
         end
 
         import("package.tools.cmake").install(package, configs)
@@ -57,7 +57,7 @@ package("glog")
         -- fix https://github.com/xmake-io/xmake-repo/discussions/4221
         if package:version() and package:version():ge("0.7.0") then
             io.replace(path.join(package:installdir("include"), "glog/logging.h"),
-                "#define GLOG_LOGGING_H", "#define GLOG_LOGGING_H\n#define GLOG_USE_GLOG_EXPORT", {plain = true})
+                "#define GLOG_LOGGING_H", "#define GLOG_LOGGING_H\n#ifndef GLOG_USE_GLOG_EXPORT\n#define GLOG_USE_GLOG_EXPORT\n#endif", {plain = true})
         end
     end)
 

+ 100 - 0
packages/o/openmvg/xmake.lua

@@ -0,0 +1,100 @@
+package("openmvg")
+    set_homepage("https://github.com/openMVG/openMVG")
+    set_description("open Multiple View Geometry library. Basis for 3D computer vision and Structure from Motion.")
+    set_license("MPL-2.0")
+
+    add_urls("https://github.com/openMVG/openMVG/archive/refs/tags/$(version).tar.gz",
+             "https://github.com/openMVG/openMVG.git")
+    add_versions("v2.1", "5538c1c8453385e5595047198fc9d0e3d8cdaa85a53b3a27c70cb05ae3f5fc2c")
+
+    add_configs("openmp", {description = "Enable OpenMP parallelization", default = true, type = "boolean"})
+    if is_plat("windows") then
+        add_configs("shared", {description = "Build shared library", default = false, type = "boolean", readonly = true})
+    end
+
+    add_deps("cmake")
+    if is_subhost("windows") then
+        add_deps("pkgconf")
+    else
+        add_deps("pkg-config")
+    end
+    add_deps("eigen", "libpng", "libjpeg", "libtiff", "flann", "lemon", "cereal", "ceres-solver", "coin-or-clp")
+
+    add_links("openMVG_easyexif", "openMVG_exif", "openMVG_fast", "openMVG_features", "openMVG_geometry", "openMVG_image", "openMVG_kvld", "openMVG_lInftyComputerVision", "openMVG_linearProgramming", "openMVG_matching", "openMVG_matching_image_collection", "openMVG_multiview", "openMVG_numeric", "openMVG_robust_estimation", "openMVG_sfm", "openMVG_stlplus", "openMVG_system", "vlsift")
+
+    if on_check then
+        on_check("linux", function (package)
+            assert(not package:has_tool("cxx", "clang"), "Linux Clang is not supported.")
+        end)
+    end
+
+    on_load(function (package)
+        if package:config("openmp") then
+            package:add("deps", "openmp")
+        end
+    end)
+
+    on_install("windows|!arm*", "linux", "macosx", function (package)
+        local clp = package:dep("coin-or-clp")
+        local flann = package:dep("flann")
+        local lemon = package:dep("lemon")
+        if not clp:is_system() then
+            io.replace("src/CMakeLists.txt", "find_package(Clp QUIET)", "include(FindPkgConfig)\npkg_search_module(coin-or-clp REQUIRED IMPORTED_TARGET coin-or-clp)", {plain = true})
+            io.replace("src/openMVG/linearProgramming/CMakeLists.txt", "${CLP_LIBRARIES}", "PkgConfig::coin-or-clp", {plain = true})
+        end
+        if not flann:is_system() then
+            io.replace("src/CMakeLists.txt", "find_package(Flann QUIET CONFIG)", "include(FindPkgConfig)\npkg_search_module(flann REQUIRED IMPORTED_TARGET flann)", {plain = true})
+            io.replace("src/CMakeLists.txt", "find_package(Flann QUIET)", "include(FindPkgConfig)\npkg_search_module(flann REQUIRED IMPORTED_TARGET flann)", {plain = true})
+            io.replace("src/openMVG/matching/CMakeLists.txt", "$<BUILD_INTERFACE:${FLANN_INCLUDE_DIRS}>", "", {plain = true})
+            io.replace("src/openMVG/matching/CMakeLists.txt", "${FLANN_LIBRARIES}", "PkgConfig::flann", {plain = true})
+        end
+        if not lemon:is_system() then
+            io.replace("src/CMakeLists.txt", "find_package(Lemon QUIET)", "include(FindPkgConfig)\npkg_search_module(lemon REQUIRED IMPORTED_TARGET lemon)", {plain = true})
+            io.replace("src/openMVG/graph/CMakeLists.txt", "${LEMON_LIBRARY}", "PkgConfig::lemon", {plain = true})
+        end
+
+        io.replace("src/CMakeLists.txt", "dependencies/cereal/include", "dependencies", {plain = true})
+        if package:is_plat("windows") then
+            io.replace("src/openMVG/matching/metric_hamming.hpp", "#ifdef _MSC_VER",
+                       "#if defined(_MSC_VER) && (defined(_M_X64) || defined(_M_IX86) || defined(_M_ARM64) || defined(_M_ARM64EC))", {plain = true})
+            package:add("defines", "_USE_MATH_DEFINES")
+        end
+
+        local configs = {
+            "-DCMAKE_BUILD_TYPE=" .. (package:is_debug() and "Debug" or "Release"),
+            "-DOpenMVG_BUILD_SHARED=" .. (package:config("shared") and "ON" or "OFF"),
+            "-DOpenMVG_BUILD_COVERAGE=OFF",
+            "-DOpenMVG_BUILD_TESTS=OFF",
+            "-DOpenMVG_BUILD_DOC=OFF",
+            "-DOpenMVG_BUILD_EXAMPLES=OFF",
+            "-DOpenMVG_BUILD_OPENGL_EXAMPLES=OFF",
+            "-DOpenMVG_BUILD_SOFTWARES=OFF",
+            "-DOpenMVG_BUILD_GUI_SOFTWARES=OFF",
+            "-DFLANN_INCLUDE_DIR_HINTS=1",
+            "-DLEMON_INCLUDE_DIR_HINTS=1",
+            "-DCLP_INCLUDE_DIR_HINTS=1",
+            "-DCOINUTILS_INCLUDE_DIR_HINTS=1",
+            "-DOSI_INCLUDE_DIR_HINTS=1",
+        }
+
+        os.cd("src")
+        import("package.tools.cmake").install(package, configs)
+
+        os.rm(package:installdir("include/openMVG_dependencies/cereal"))
+        os.rm(package:installdir("lib/pkgconfig/*.pc"))
+    end)
+
+    on_test(function (package)
+        assert(package:check_cxxsnippets({test = [[
+            #include <openMVG/geometry/pose3.hpp>
+            #include <openMVG/numeric/numeric.h>
+            using namespace openMVG;
+            using namespace openMVG::geometry;
+            void test() {
+                Pose3 pose1(RotationAroundX(0.02), Vec3(0,0,-2));
+                Pose3 pose2(RotationAroundX(0.06), Vec3(-1,0,-2));
+                Pose3 combinedPose = pose1 * pose2;
+                const Vec3 pt = combinedPose(Vec3(2.6453,3.32,6.3));
+            }
+        ]]}, {configs = {languages = "c++11"}}))
+    end)

+ 3 - 0
packages/s/suitesparse/xmake.lua

@@ -77,6 +77,9 @@ package("suitesparse")
             table.insert(configs, "-DBLA_VENDOR=" .. bla_vendor[package:config("blas")])
             table.insert(configs, "-DBLA_STATIC=" .. (package:config("blas_static") and "ON" or "OFF"))
             if package:is_plat("windows") then
+                if not package:has_tool("cxx", "ifort", "ifx") then
+                    table.insert(configs, "-DSUITESPARSE_USE_FORTRAN=OFF")
+                end
                 if package:config("graphblas") then
                     table.insert(configs, "-DSUITESPARSE_ENABLE_PROJECTS=suitesparse_config;mongoose;amd;btf;camd;ccolamd;colamd;cholmod;cxsparse;ldl;klu;umfpack;paru;rbio;spqr;graphblas;lagraph") -- remove spex since it does not support windows
                 else