diff --git a/packages/c/cuda/xmake.lua b/packages/c/cuda/xmake.lua new file mode 100644 index 00000000000..181ffaf8759 --- /dev/null +++ b/packages/c/cuda/xmake.lua @@ -0,0 +1,29 @@ +package("cuda") + + set_homepage("https://developer.nvidia.com/cuda-zone/") + set_description("CUDA® is a parallel computing platform and programming model developed by NVIDIA for general computing on graphical processing units (GPUs).") + + add_configs("utils", {description = "enabled cuda utilities.", default = {}, type = "table"}) + + on_fetch(function (package, opt) + if opt.system then + import("detect.sdks.find_cuda") + import("lib.detect.find_library") + + local cuda = find_cuda() + if cuda then + package:addenv("PATH", cuda.bindir) + local result = {includedirs = cuda.includedirs, linkdirs = cuda.linkdirs, links = {}} + local utils = package:config("utils") + table.insert(utils, package:config("shared") and "cudart" or "cudart_static") + + for _, util in ipairs(utils) do + if not find_library(util, cuda.linkdirs) then + return + end + table.insert(result.links, util) + end + return result + end + end + end) diff --git a/packages/l/libtorch/xmake.lua b/packages/l/libtorch/xmake.lua new file mode 100644 index 00000000000..6b37b2fca00 --- /dev/null +++ b/packages/l/libtorch/xmake.lua @@ -0,0 +1,127 @@ +package("libtorch") + + set_homepage("https://pytorch.org/") + set_description("An open source machine learning framework that accelerates the path from research prototyping to production deployment.") + set_license("BSD-3-Clause") + + add_urls("https://github.com/pytorch/pytorch.git") + add_versions("v1.8.0", "37c1f4a7fef115d719104e871d0cf39434aa9d56") + add_versions("v1.8.1", "56b43f4fec1f76953f15a627694d4bba34588969") + + add_configs("python", {description = "Build python interface.", default = false, type = "boolean"}) + add_configs("ninja", {description = "Use ninja as build tool.", default = false, type = "boolean"}) + + add_deps("cmake") + add_deps("python 3.x", {kind = "binary", system = false}) + add_deps("libuv") + add_deps("cuda", {optional = true, configs = {utils = {"nvrtc", "cudnn", "cufft", "curand", "cublas", "cudart_static"}}}) + add_deps("nvtx", "mkl", {optional = true, system = true}) + add_includedirs("include") + add_includedirs("include/torch/csrc/api/include") + + -- prevent the link to the libraries found automatically + add_links("") + + on_load("windows|x64", "macosx", "linux", function (package) + if package:config("ninja") then + package:add("deps", "ninja") + end + + if not package:is_plat("macosx") then + if not find_package("mkl") then + package:add("deps", "openblas") + end + end + end) + + on_install("windows|x64", "macosx", "linux", function (package) + import("package.tools.cmake") + + -- tackle link flags + local has_cuda = package:dep("cuda"):exists() and package:dep("nvtx"):exists() + local libnames = {"torch", "torch_cpu"} + if has_cuda then + table.insert(libnames, "torch_cuda") + end + table.insert(libnames, "c10") + if has_cuda then + table.insert(libnames, "c10_cuda") + end + local suffix = "" + if not package:is_plat("windows") and package:config("shared") then + package:add("ldflags", "-Wl,-rpath," .. package:installdir("lib")) + if package:is_plat("linux") then + suffix = ".so" + elseif package:is_plat("macosx") then + suffix = ".dylib" + end + for _, lib in ipairs(libnames) do + package:add("ldflags", (package:is_plat("linux") and "-Wl,--no-as-needed," or "") .. package:installdir("lib", "lib") .. lib .. suffix) + end + else + for _, lib in ipairs(libnames) do + package:add("links", lib) + end + end + + -- workaround before 2.5.3, will be removed in future + if xmake.version():le("2.5.3") then + os.vrun("git submodule sync") + os.vrun("git submodule update --init --recursive") + end + + -- some patches to the third-party cmake files + io.replace("cmake/Modules/FindMKL.cmake", "MSVC AND NOT CMAKE_CXX_COMPILER_ID STREQUAL \"Intel\"", "FALSE", {plain = true}) + io.replace("third_party/fbgemm/CMakeLists.txt", "PRIVATE FBGEMM_STATIC", "PUBLIC FBGEMM_STATIC", {plain = true}) + io.replace("third_party/protobuf/cmake/install.cmake", "install%(DIRECTORY.-%)", "") + io.replace("third_party/ideep/mkl-dnn/src/CMakeLists.txt", "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}", "${CMAKE_INSTALL_LIBDIR}", {plain = true}) + if package:is_plat("windows") then + io.replace("cmake/Modules/FindOpenBLAS.cmake", "NAMES openblas PATHS", "NAMES libopenblas PATHS", {plain = true}) + if package:config("vs_runtime"):startswith("MD") then + io.replace("third_party/fbgemm/CMakeLists.txt", "MT", "MD", {plain = true}) + end + end + + -- prepare python + os.vrun("python -m pip install typing_extensions pyyaml") + local configs = {"-DUSE_MPI=OFF"} + if package:config("python") then + table.insert(configs, "-DBUILD_PYTHON=ON") + os.vrun("python -m pip install numpy") + else + table.insert(configs, "-DBUILD_PYTHON=OFF") + end + + -- prepare for installation + local extracfg = {} + if package:config("ninja") then + extracfg.cmake_generator = "Ninja" + end + local envs = cmake.buildenvs(package, extracfg) + if not package:is_plat("macosx") then + if package:dep("mkl"):exists() then + table.insert(configs, "-DBLAS=MKL") + local mkl = package:dep("mkl"):fetch() + table.insert(configs, "-DINTEL_MKL_DIR=" .. path.directory(mkl.sysincludedirs[1])) + else + table.insert(configs, "-DBLAS=OpenBLAS") + envs.OpenBLAS_HOME = package:dep("openblas"):installdir() + end + end + envs.libuv_ROOT = package:dep("libuv"):installdir() + 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, "-DCAFFE2_USE_MSVC_STATIC_RUNTIME=" .. (package:config("vs_runtime"):startswith("MT") and "ON" or "OFF")) + extracfg.envs = envs + cmake.install(package, configs, extracfg) + end) + + on_test(function (package) + assert(package:check_cxxsnippets({test = [[ + void test() { + auto a = torch::ones(3); + auto b = torch::tensor({1, 2, 3}); + auto c = torch::dot(a, b); + } + ]]}, {configs = {languages = "c++14"}, includes = "torch/torch.h"})) + end)