Browse Source

flashlight: add package. (#8230)

* flashlight: add package.

* update.
RedbeanW 2 months ago
parent
commit
f0f32bf204
2 changed files with 204 additions and 4 deletions
  1. 203 0
      packages/f/flashlight/xmake.lua
  2. 1 4
      scripts/test.lua

+ 203 - 0
packages/f/flashlight/xmake.lua

@@ -0,0 +1,203 @@
+package("flashlight")
+    set_homepage("https://github.com/flashlight/flashlight")
+    set_description("A C++ standalone library for machine learning.")
+    set_license("MIT")
+
+    add_urls("https://github.com/flashlight/flashlight/archive/refs/tags/$(version).tar.gz",
+             "https://github.com/flashlight/flashlight.git")
+    add_versions("v0.3.2", "6557f65ef2fbacc867bb6721d9134d0bc15d29e7413cbce0ae5e28d857164029")
+
+    add_configs("core",        {description = "Build flashlight core.", default = true, type = "boolean"})
+    add_configs("arrayfire",   {description = "Build ArrayFire tensor backend.", default = true, type = "boolean"})
+    add_configs("contrib",     {description = "Build and link additional flashlight contrib assets.", default = true, type = "boolean"})
+    add_configs("distributed", {description = "Build and link a distributed backend with flashlight.", default = true, type = "boolean"})
+    add_configs("backend",     {description = "Backend with which to build flashlight.", default = "cpu", type = "string", values = {"cpu", "cuda", "opencl"}})
+    add_configs("profiling",   {description = "Enable profiling with Flashlight.", default = false, type = "boolean"})
+    add_configs("all_libs",    {description = "Build all flashlight libraries.", default = false, type = "boolean"})
+
+    local libs = {"set", "sequence", "audio", "common", "text"}
+    for _, lib in ipairs(libs) do
+        add_configs("lib_" .. lib, {description = "Build flashlight " .. lib .. " library.", default = nil, type = "boolean"})
+    end
+
+    add_configs("all_pkgs",    {description = "Build all flashlight packages.", default = false, type = "boolean"})
+
+    local pkgs = {"runtime", "vision", "text", "speech"}
+    for _, pkg in ipairs(pkgs) do
+        add_configs("pkg_" .. pkg, {description = "Build flashlight " .. pkg .. " library.", default = nil, type = "boolean"})
+    end
+
+    add_configs("cuda",  {description = "Use CUDA in flashlight libraries build.", default = true, type = "boolean"})
+    add_configs("kenlm", {description = "Use KenLM in flashlight libraries build.", default = true, type = "boolean"})
+    add_configs("mkl",   {description = "Use MKL in flashlight libraries build.", default = true, type = "boolean"})
+    
+    add_configs("openblas",  {description = "Use OpenBLAS instead of MKL.", default = false, type = "boolean"})
+    add_configs("cublas",    {description = "Use CUBLAS instead of MKL.", default = false, type = "boolean"})
+
+    add_deps("cmake")
+    add_deps("cereal")
+    if is_plat("linux", "bsd") then
+        add_syslinks("pthread")
+    end
+
+    on_load(function (package)
+        local cuda_utils = {}
+        
+        -- flahslight core
+        if package:config("core") then
+            if package:config("backend") == "cpu" then
+                package:add("deps", "onednn 2.5")
+                package:add("defines", "FL_BACKEND_CPU=1")
+            else
+                package:add("defines", "FL_BACKEND_CPU=0")
+            end
+            if package:config("backend") == "cuda" then
+                package:add("deps", "nvtx")
+                package:add("defines", "FL_BACKEND_CUDA=1", "NO_CUDNN_DESTROY_HANDLE")
+                table.insert(cuda_utils, "cudnn")
+            else
+                package:add("defines", "FL_BACKEND_CUDA=0")
+            end
+            if package:config("backend") == "opencl" then
+                package:add("defines", "FL_BACKEND_OPENCL=1")
+            else
+                package:add("defines", "FL_BACKEND_OPENCL=0")
+            end
+            if package:config("profiling") then
+                package:add("defines", "FL_BUILD_PROFILING=1")
+            else
+                package:add("defines", "FL_BUILD_PROFILING=0")
+            end
+            if package:config("arrayfire") then
+                package:add("deps", "arrayfire")
+                package:add("defines", "FL_USE_ARRAYFIRE=1")
+            else
+                package:add("defines", "FL_USE_ARRAYFIRE=0")
+            end
+            if package:config("distributed") then
+                package:add("deps", "mpich")
+                if package:config("backend") == "cuda" then
+                    package:add("defines", "NO_NCCL_COMM_DESTROY_HANDLE")
+                else
+                    package:add("deps", "gloo", {configs = {mpi = true}})
+                end
+            end
+        else
+            package:config_set("contrib", false)
+            package:config_set("distributed", false)
+            package:config_set("profiling", false)
+            package:config_set("arrayfire", false)
+        end
+
+        -- flashlight library dependencies
+        if package:config("mkl") then
+            package:add("deps", "mkl")
+            package:add("defines", "FL_LIBRARIES_USE_MKL")
+        elseif package:config("openblas") then
+            package:add("deps", "openblas")
+        elseif package:config("cublas") then
+            table.insert(cuda_utils, "cublas")
+        end
+        if package:config("kenlm") then
+            package:add("defines", "FL_LIBRARIES_USE_KENLM")
+            package:add("deps", "kenlm")
+        end
+
+        -- flashlight libraries
+            if package:config("all_libs") then
+            for _, lib in ipairs(libs) do
+                if package:config("lib_" .. lib) ~= nil then
+                    package:config_set("lib_" .. lib, true)
+                end
+            end
+        end
+        if package:config("lib_audio") then
+            package:add("deps", "fftw", "openmp")
+        end
+        if package:config("lib_text") and package:config("kenlm") then
+            package:add("defines", "KENLM_MAX_ORDER=6")
+        end
+
+        -- flashlight packages
+        if package:config("all_pkgs") then
+            for _, lib in ipairs(libs) do
+                if package:config("pkg_" .. lib) ~= nil then
+                    package:config_set("pkg_" .. lib, true)
+                end
+            end
+        end
+        if package:config("pkg_runtime") then
+            package:add("deps", "glog", "gflags")
+        end
+        if package:config("pkg_speech") then
+            package:add("deps", "libsndfile")
+        end
+        if package:config("pkg_vision") then
+            package:add("deps", "stb")
+        end
+
+        -- flashlight backend
+        if package:config("backend") == "opencl" then
+            package:add("deps", "opencl", "opencl-headers")
+        end
+        if package:config("backend") == "cuda" then
+            package:add("deps", "cuda", {configs = {utils = cuda_utils}})
+        else
+            package:config_set("cuda", false)
+            package:config_set("cublas", false)
+        end
+        if package:config("cuda") then
+            package:add("defines", "FL_LIBRARIES_USE_CUDA")
+        end
+    end)
+
+    on_install("linux|x86_64", function (package)
+        local configs = {
+            "-DFL_BUILD_TESTS=OFF",
+            "-DFL_BUILD_EXAMPLES=OFF",
+            "-DFL_BUILD_STANDALONE=OFF"
+        }
+        table.insert(configs, "-DCMAKE_BUILD_TYPE=" .. (package:debug() and "Debug" or "Release"))
+        table.insert(configs, "-DBUILD_SHARED_LIBS=" .. (package:config("shared") and "ON" or "OFF"))
+        table.insert(configs, "-DFL_BUILD_CORE=" .. (package:config("core") and "ON" or "OFF"))
+        table.insert(configs, "-DFL_BUILD_CONTRIB=" .. (package:config("contrib") and "ON" or "OFF"))
+        table.insert(configs, "-DFL_BUILD_DISTRIBUTED=" .. (package:config("distributed") and "ON" or "OFF"))
+        table.insert(configs, "-DFL_BUILD_PROFILING=" .. (package:config("profiling") and "ON" or "OFF"))
+        table.insert(configs, "-DFL_USE_ARRAYFIRE=" .. (package:config("arrayfire") and "ON" or "OFF"))
+        table.insert(configs, "-DFL_BACKEND=" .. package:config("backend"):upper())
+        for _, lib in ipairs(libs) do
+            if package:config("lib_" .. lib) then
+                table.insert(configs, ("-DFL_BUILD_LIB_%s=ON"):format(lib:upper()))
+            end
+        end
+        for _, pkg in ipairs(pkgs) do
+            if package:config("pkg_" .. pkg) then
+                table.insert(configs, ("-DFL_BUILD_PKG_%s=ON"):format(lib:upper()))
+            end
+        end
+        for _, lib in ipairs({"cuda", "kenlm", "mkl"}) do
+            if package:config(lib) then
+                table.insert(configs, ("-DFL_LIBRARIES_USE_%s=ON"):format(lib:upper()))
+            end
+        end
+        io.replace("flashlight/fl/autograd/CMakeLists.txt", "DNNL 2.0 CONFIG", "DNNL", {plain = true})
+        io.replace("CMakeLists.txt", "find_package(cereal)", [[
+            find_package(PkgConfig REQUIRED)
+            pkg_check_modules(cereal REQUIRED cereal)
+            include_directories(${cereal_INCLUDE_DIRS})
+        ]], {plain = true})
+        io.replace("CMakeLists.txt", "target_link_libraries(flashlight PRIVATE cereal)", "", {plain = true})
+        io.replace("flashlight/fl/common/Logging.cpp", "#include <utility>", "#include <utility>\n#include <array>", {plain = true})
+        io.replace("flashlight/fl/tensor/TensorBase.h", "#include <vector>", "#include <vector>\n#include <cstdint>", {plain = true})
+        io.replace("flashlight/fl/tensor/TensorBase.cpp", "#include <utility>", "#include <utility>\n#include <algorithm>", {plain = true})
+
+        import("package.tools.cmake").install(package, configs)
+    end)
+
+    on_test(function (package)
+        assert(package:check_cxxsnippets({test = [[
+            void test() {
+                fl::init();
+            }
+        ]]}, {configs = {languages = "c++17"}, includes = "flashlight/fl/flashlight.h"}))
+    end)

+ 1 - 4
scripts/test.lua

@@ -289,10 +289,7 @@ end
 
 -- @see https://github.com/xmake-io/xmake-repo/issues/6940
 function _lock_packages(packages)
-    local locked_packages = {
-        "flashlight",
-        "systemd"
-    }
+    local locked_packages = {}
     for _, package in ipairs(packages) do
         if table.contains(locked_packages, package) then
             raise("package(%s) has been locked, please do not submit it, @see https://github.com/xmake-io/xmake-repo/issues/6940", package)