ソースを参照

coin-or-clp: add new package (#7589)

* coin-or-clp: add new package

* add few missing configvars and fix typo

* fix lapack deps and src files

* fix glpk error

* fix xmake.lua

* fix clp(cbc_glp_tran/cbc_glp_prob), coinutils(CoinIndexedVector::checkClear()) issues

* optimize

---------

Co-authored-by: Saikari <[email protected]>
choyy 4 週間 前
コミット
498139863d

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

@@ -0,0 +1,77 @@
+includes("@builtin/check")
+configvar_check_cincludes("COINUTILS_HAS_CSTDINT", "cstdint")
+configvar_check_cincludes("COINUTILS_HAS_STDINT_H", "stdint.h")
+configvar_check_cincludes("HAVE_ARM_NEON_H", "arm_neon.h")
+configvar_check_cincludes("HAVE_FMAINTRIN_H", "fmaintrin.h")
+configvar_check_cincludes("HAVE_IMMINTRIN_H", "immintrin.h")
+configvar_check_cincludes("HAVE_INTRIN_H", "intrin.h")
+configvar_check_cincludes("HAVE_STDIO_H", "stdio.h")
+configvar_check_cincludes("HAVE_CFLOAT", "cfloat")
+configvar_check_cincludes("HAVE_CIEEEFP", "cieeefp")
+configvar_check_cincludes("HAVE_CINTTYPES", "cinttypes")
+configvar_check_cincludes("HAVE_CMATH", "cmath")
+configvar_check_cincludes("HAVE_DLFCN_H", "dlfcn.h")
+configvar_check_cincludes("HAVE_FLOAT_H", "float.h")
+configvar_check_cincludes("HAVE_IEEEFP_H", "ieeefp.h")
+configvar_check_cincludes("HAVE_INTTYPES_H", "inttypes.h")
+configvar_check_cincludes("HAVE_MATH_H", "math.h")
+configvar_check_cincludes("HAVE_MEMORY_H", "memory.h")
+configvar_check_cincludes("HAVE_READLINE_READLINE_H", "readline/readline.h")
+configvar_check_cincludes("HAVE_STDINT_H", "stdint.h")
+configvar_check_cincludes("HAVE_STDLIB_H", "stdlib.h")
+configvar_check_cincludes("HAVE_STRINGS_H", "strings.h")
+configvar_check_cincludes("HAVE_STRING_H", "string.h")
+configvar_check_cincludes("HAVE_SYS_STAT_H", "sys/stat.h")
+configvar_check_cincludes("HAVE_SYS_TYPES_H", "sys/types.h")
+configvar_check_cincludes("HAVE_UNISTD_H", "unistd.h")
+configvar_check_cincludes("STDC_HEADERS", {"stdlib.h", "string.h"})
+            
+set_configvar("COIN_CLP_CHECKLEVEL", 0)
+set_configvar("COIN_CLP_VERBOSITY", 0)
+
+set_configvar("CLP_VERSION", "1.17.10")
+set_configvar("CLP_VERSION_MAJOR", 1)
+set_configvar("CLP_VERSION_MINOR", 17)
+set_configvar("CLP_VERSION_RELEASE", 10)
+
+add_rules("mode.debug", "mode.release")
+
+add_requires("coin-or-coinutils", "coin-or-osi")
+if is_plat("linux") then
+    add_requires("lapack")
+    add_packages("lapack")
+    add_defines("LAPACK_TEST")
+end
+
+set_languages("c++11")
+
+target("clp")
+    set_kind("$(kind)")
+    add_defines("HAVE_CONFIG_H", "CLP_BUILD", "COIN_HAS_CLP")
+    add_files("Clp/src/*.cpp", "Clp/src/OsiClp/*.cpp")
+    remove_files(
+     "Clp/src/ClpCholeskyMumps.cpp",
+     "Clp/src/ClpCholeskyUfl.cpp",
+     "Clp/src/ClpCholeskyWssmp.cpp",
+     "Clp/src/ClpCholeskyWssmpKKT.cpp",
+     "Clp/src/ClpMain.cpp",
+     "Clp/src/*Abc*.cpp"
+    )
+    add_includedirs("Clp/src")
+    add_headerfiles("Clp/src/*.hpp", "Clp/src/*.h")
+    add_headerfiles("Clp/src/OsiClp/*.hpp")
+    remove_headerfiles(
+     "Clp/src/ClpCholeskyMumps.hpp",
+     "Clp/src/ClpCholeskyUfl.hpp",
+     "Clp/src/ClpCholeskyWssmp.hpp",
+     "Clp/src/ClpCholeskyWssmpKKT.hpp",
+     "Clp/src/*Abc*.hpp",
+     "Clp/src/*Abc*.h"
+    )
+    set_configdir("Clp/src")
+    add_configfiles("Clp/src/(config.h.in)")
+    add_configfiles("Clp/src/(config_clp.h.in)")
+    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")

+ 55 - 0
packages/c/coin-or-clp/xmake.lua

@@ -0,0 +1,55 @@
+package("coin-or-clp")
+    set_homepage("https://github.com/coin-or/Clp")
+    set_description("COIN-OR Linear Programming Solver")
+    set_license("EPL-2.0")
+
+    add_urls("https://github.com/coin-or/Clp/archive/refs/tags/releases/$(version).tar.gz",
+             "https://github.com/coin-or/Clp.git")
+
+    add_versions("1.17.10", "0d79ece896cdaa4a3855c37f1c28e6c26285f74d45f635046ca0b6d68a509885")
+
+    if is_plat("mingw") and is_subhost("msys") then
+        add_extsources("pacman::coin-or-clp")
+    elseif is_plat("linux") then
+        add_extsources("apt::coinor-libclp-dev", "pacman::coin-or-clp")
+    elseif is_plat("macosx") then
+        add_extsources("brew::clp")
+    end
+
+    on_load(function (package)
+        package:add("deps", "coin-or-coinutils", "coin-or-osi")
+        package:add("defines", "COIN_HAS_COINUTILS", "COIN_HAS_OSI")
+        if package:is_plat("linux") then
+            package:add("deps", "lapack")
+        end
+    end)
+
+    add_includedirs("include", "include/coin")
+
+    on_install(function (package)
+        io.replace("Clp/src/ClpSolve.cpp", "#define UFL_BARRIER", "", {plain = true})
+        io.replace("Clp/src/ClpSolver.cpp", "extern glp_tran *cbc_glp_tran;\nextern glp_prob *cbc_glp_prob;",
+                                            "glp_tran *cbc_glp_tran = NULL;\nglp_prob *cbc_glp_prob = NULL;", {plain = true})
+        io.replace("Clp/src/CbcOrClpParam.cpp", [[#include "CoinTime.hpp"]],
+                                                [[#include "CoinTime.hpp"
+                                                  #include "CoinFinite.hpp"]], {plain = true})
+        io.gsub("Clp/src/config.h.in", "# *undef (.-)\n", "${define %1}\n")
+        os.cp(path.join(package:scriptdir(), "port", "xmake.lua"), "xmake.lua")
+        import("package.tools.xmake").install(package)
+    end)
+
+    on_test(function (package)
+        assert(package:check_cxxsnippets({test = [[
+            #include <ClpSimplex.hpp>
+            void test() {
+                ClpSimplex model;
+                double obj[] = {1.0, 1.0};
+                CoinPackedMatrix matrix;
+                matrix.setDimensions(0, 2);
+                double colLB[] = {0.0, 0.0};
+                double colUB[] = {COIN_DBL_MAX, COIN_DBL_MAX};
+                model.loadProblem(matrix, colLB, colUB, obj, nullptr, nullptr);
+                model.primal();
+            }
+        ]]}, {configs = {languages = "c++11"}}))
+    end)

+ 8 - 9
packages/c/coin-or-coinutils/port/xmake.lua

@@ -24,31 +24,30 @@ configvar_check_cincludes("HAVE_SYS_STAT_H", "sys/stat.h")
 configvar_check_cincludes("HAVE_SYS_TYPES_H", "sys/types.h")
 configvar_check_cincludes("HAVE_UNISTD_H", "unistd.h")
 configvar_check_cincludes("HAVE_WINDOWS_H", "windows.h")
-check_sizeof("SIZEOF_DOUBLE", "double")
-check_sizeof("SIZEOF_INT", "int")
-check_sizeof("SIZEOF_INT_P", "int *")
-check_sizeof("SIZEOF_LONG", "long")
-check_sizeof("SIZEOF_LONG_LONG", "long long")
 configvar_check_cincludes("STDC_HEADERS", {"stdlib.h", "string.h"})
 
+set_configvar("COIN_INT64_T", "long long", {quote = false})
+set_configvar("COIN_INTPTR_T", "intptr_t", {quote = false})
+set_configvar("COIN_UINT64_T", "unsigned long long", {quote = false})
+
 add_rules("mode.debug", "mode.release")
 
 add_requires("bzip2", "zlib")
-add_defines("COIN_HAS_ZLIB", "COIN_HAS_BZLIB")
 if is_plat("linux", "macosx", "bsd") then
     add_requires("readline")
     add_packages("readline")
-    add_defines("COIN_HAS_READLINE")
 end
 
 set_languages("c++11")
 
 target("CoinUtils")
     set_kind("$(kind)")
+    add_defines("HAVE_CONFIG_H", "COINUTILS_BUILD")
     add_files("CoinUtils/src/*.cpp")
     add_headerfiles("CoinUtils/src/*.hpp", "CoinUtils/src/*.h", {prefixdir = "coin"})
-    add_configfiles("CoinUtils/src/(config.h.in)", {filename = "config.h"})
-    add_configfiles("CoinUtils/src/(config_coinutils.h.in)", {filename = "config_coinutils.h"})
+    set_configdir("CoinUtils/src")
+    add_configfiles("CoinUtils/src/(config.h.in)")
+    add_configfiles("CoinUtils/src/(config_coinutils.h.in)")
     if is_plat("windows") and is_kind("shared") then
         add_rules("utils.symbols.export_all", {export_classes = true})
     end

+ 17 - 10
packages/c/coin-or-coinutils/xmake.lua

@@ -16,16 +16,23 @@ package("coin-or-coinutils")
         add_extsources("brew::coinutils")
     end
 
-    add_deps("bzip2", "zlib")
-    if is_plat("linux", "macosx", "bsd") then
-        add_deps("readline")
-    end
-
-    if is_plat("macosx", "iphoneos") then
-        add_frameworks("Accelerate")
-    elseif is_plat("linux", "bsd") then
-        add_syslinks("m")
-    end
+    add_deps("bzip2", "zlib", "glpk")
+
+    on_load(function (package)
+        package:add("defines", "COIN_HAS_ZLIB", "COIN_HAS_BZLIB", "COIN_HAS_GLPK")
+        if package:is_plat("linux", "macosx", "bsd") then
+            package:add("deps", "readline")
+            package:add("defines", "COIN_HAS_READLINE")
+        end
+        if package:is_plat("macosx", "iphoneos") then
+            package:add("frameworks", "Accelerate")
+        elseif package:is_plat("linux", "bsd") then
+            package:add("syslinks", "m")
+        end
+        if not package:is_debug() then
+            package:add("defines", "NDEBUG")
+        end
+    end)
 
     add_includedirs("include", "include/coin")
 

+ 2 - 0
packages/g/glpk/xmake.lua

@@ -43,6 +43,7 @@ package("glpk")
     end)
 
     on_install(function (package)
+        io.replace("src/minisat/minisat.h", "typedef int bool;", "#if __STDC_VERSION__ < 202311L\ntypedef int bool;\n#endif", {plain = true})
         if package:is_plat("windows") and package:config("shared") then
             local def = "glpk.def"
             local version = package:version()
@@ -65,6 +66,7 @@ package("glpk")
     end)
 
     on_install("macosx", "linux", function (package)
+        io.replace("src/minisat/minisat.h", "typedef int bool;", "#if __STDC_VERSION__ < 202311L\ntypedef int bool;\n#endif", {plain = true})
         local configs = {}
         table.insert(configs, "--enable-shared=" .. (package:config("shared") and "yes" or "no"))
         table.insert(configs, "--enable-static=" .. (package:config("shared") and "no" or "yes"))