summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2024-12-17 14:09:47 +0800
committerGitHub <[email protected]>2024-12-17 14:09:47 +0800
commite49b5e63596ac9faadee460178eb8237f9953c80 (patch)
tree7b90e7cb33caaaed4eead9ac1c839fdec745d74a
parenta2ee23e47a174c06ed539e15a0e5b121a61830f2 (diff)
parentdc88fe879795cc5fcebe32244628a59dca9dad09 (diff)
Merge pull request #5981 from xmake-io/nuget
Support for nuget packages
-rw-r--r--tests/projects/package/nuget/.gitignore8
-rw-r--r--tests/projects/package/nuget/src/main.cpp8
-rw-r--r--tests/projects/package/nuget/xmake.lua7
-rw-r--r--xmake/modules/package/manager/nuget/find_package.lua164
-rw-r--r--xmake/modules/package/manager/nuget/install_package.lua64
-rw-r--r--xmake/modules/package/manager/vcpkg/install_package.lua2
6 files changed, 251 insertions, 2 deletions
diff --git a/tests/projects/package/nuget/.gitignore b/tests/projects/package/nuget/.gitignore
new file mode 100644
index 000000000..152105761
--- /dev/null
+++ b/tests/projects/package/nuget/.gitignore
@@ -0,0 +1,8 @@
+# Xmake cache
+.xmake/
+build/
+
+# MacOS Cache
+.DS_Store
+
+
diff --git a/tests/projects/package/nuget/src/main.cpp b/tests/projects/package/nuget/src/main.cpp
new file mode 100644
index 000000000..e64ad9bc2
--- /dev/null
+++ b/tests/projects/package/nuget/src/main.cpp
@@ -0,0 +1,8 @@
+#include <iostream>
+
+using namespace std;
+
+int main(int argc, char** argv) {
+ cout << "hello world!" << endl;
+ return 0;
+}
diff --git a/tests/projects/package/nuget/xmake.lua b/tests/projects/package/nuget/xmake.lua
new file mode 100644
index 000000000..591aa2439
--- /dev/null
+++ b/tests/projects/package/nuget/xmake.lua
@@ -0,0 +1,7 @@
+add_requires("nuget::zlib_static", {alias = "zlib"})
+
+target("test")
+ set_kind("binary")
+ add_files("src/*.cpp")
+ add_packages("zlib")
+
diff --git a/xmake/modules/package/manager/nuget/find_package.lua b/xmake/modules/package/manager/nuget/find_package.lua
new file mode 100644
index 000000000..5af474c69
--- /dev/null
+++ b/xmake/modules/package/manager/nuget/find_package.lua
@@ -0,0 +1,164 @@
+--!A cross-platform build utility based on Lua
+--
+-- Licensed under the Apache License, Version 2.0 (the "License");
+-- you may not use this file except in compliance with the License.
+-- You may obtain a copy of the License at
+--
+-- http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+-- See the License for the specific language governing permissions and
+-- limitations under the License.
+--
+-- Copyright (C) 2015-present, TBOOX Open Source Group.
+--
+-- @author ruki
+-- @file find_package.lua
+--
+
+-- imports
+import("lib.detect.find_file")
+import("lib.detect.find_tool")
+import("core.base.option")
+import("core.base.json")
+import("core.tool.toolchain")
+import("core.project.config")
+import("core.project.target")
+import("private.utils.toolchain", {alias = "toolchain_utils"})
+
+-- find native package files
+-- e.g.
+--[[
+ "build/native/include/crc32.h",
+ "build/native/include/deflate.h",
+ "build/native/include/gzguts.h",
+ "build/native/include/inffast.h",
+ "build/native/include/inffixed.h",
+ "build/native/include/inflate.h",
+ "build/native/include/inftrees.h",
+ "build/native/include/trees.h",
+ "build/native/include/zconf.h",
+ "build/native/include/zlib.h",
+ "build/native/include/zutil.h",
+ "build/native/lib/Win32/v140/Debug/zlib.lib",
+ "build/native/lib/Win32/v140/Release/zlib.lib",
+ "build/native/lib/Win32/v141/Debug/zlib.lib",
+ "build/native/lib/Win32/v141/Release/zlib.lib",
+ "build/native/lib/Win32/v142/Debug/MultiThreadedDebug/zlib.lib",
+ "build/native/lib/Win32/v142/Debug/MultiThreadedDebugDLL/zlib.lib",
+ "build/native/lib/Win32/v142/Release/MultiThreaded/zlib.lib",
+ "build/native/lib/Win32/v142/Release/MultiThreadedDLL/zlib.lib",
+ "build/native/lib/x64/v140/Debug/zlib.lib",
+ "build/native/lib/x64/v140/Release/zlib.lib",
+ "build/native/lib/x64/v141/Debug/zlib.lib",
+ "build/native/lib/x64/v141/Release/zlib.lib",
+ "build/native/lib/x64/v142/Debug/MultiThreadedDebug/zlib.lib",
+ "build/native/lib/x64/v142/Debug/MultiThreadedDebugDLL/zlib.lib",
+ "build/native/lib/x64/v142/Release/MultiThreaded/zlib.lib",
+ "build/native/lib/x64/v142/Release/MultiThreadedDLL/zlib.lib",
+]]
+function _find_package(name, result, opt)
+ local arch = opt.arch
+ local plat = opt.plat
+ local configs = opt.configs or {}
+ local libinfo = opt.libraries[name]
+ if libinfo then
+ local libarchs = {x64 = "x64", x86 = "Win32", arm64 = "arm64"}
+ local runtimes = {
+ MT = "MultiThreaded",
+ MTd = "MultiThreadedDebug",
+ MD = "MultiThreadedDLL",
+ MDd = "MultiThreadedDebugDLL"}
+ local installdir = path.join(opt.packagesdir, name)
+ local libdir = "build/native/lib"
+ local runtime = assert(runtimes[configs.runtimes], "unknown runtimes %s", configs.runtimes)
+ local toolset = toolchain_utils.get_vs_toolset_ver(toolchain.load("msvc", {plat = plat, arch = arch}):config("vs_toolset") or config.get("vs_toolset"))
+ local libarch = libarchs[arch] or "x64"
+ local libmode = configs.debug and "Debug" or "Release"
+ for _, file in ipairs(libinfo.files) do
+ local filepath = path.join(installdir, file)
+ file = file:trim()
+
+ -- get includedirs
+ if file:find("/include/", 1, true) then
+ result.includedirs = result.includedirs or {}
+ table.insert(result.includedirs, path.join(installdir, "include"))
+ end
+
+ -- get linkdirs and links
+ if file:endswith(".lib") then
+ local libfile = path.unix(path.join(libdir, libarch, toolset, libmode, runtime))
+ if file:startswith(libfile .. "/") then
+ result.links = result.links or {}
+ result.linkdirs = result.linkdirs or {}
+ result.libfiles = result.libfiles or {}
+ table.insert(result.linkdirs, path.directory(filepath))
+ table.insert(result.links, target.linkname(path.filename(filepath), {plat = plat}))
+ table.insert(result.libfiles, filepath)
+ end
+ end
+ end
+ end
+ local targetinfo = opt.targets[name]
+ if targetinfo then
+ local dependencies = targetinfo.dependencies
+ if dependencies then
+ for k, v in pairs(dependencies) do
+ _find_package(k .. "/" .. v, result, opt)
+ end
+ end
+ end
+end
+
+-- find package from the nuget package manager
+--
+-- @param name the package name, e.g. zlib, pcre
+-- @param opt the options, e.g. {verbose = true)
+--
+function main(name, opt)
+ opt = opt or {}
+
+ -- load manifest info
+ local installdir = assert(opt.installdir, "installdir not found!")
+ local stubdir = path.join(installdir, "stub")
+ local manifestfile = path.join(stubdir, "obj", "project.assets.json")
+ if not os.isfile(manifestfile) then
+ return
+ end
+ local manifest = json.loadfile(manifestfile)
+ local targets
+ for k, v in pairs(manifest.targets) do
+ targets = v
+ break
+ end
+ local target_root
+ if targets then
+ for k, v in pairs(targets) do
+ if k:startswith(name) then
+ target_root = k
+ break
+ end
+ end
+ end
+ local metainfo = {}
+ metainfo.plat = opt.plat
+ metainfo.arch = opt.arch
+ metainfo.mode = opt.mode
+ metainfo.configs = opt.configs
+ metainfo.targets = targets
+ metainfo.libraries = manifest.libraries
+ if manifest.project and manifest.project.restore then
+ metainfo.packagesdir = manifest.project.restore.packagesPath
+ end
+ if target_root and metainfo.targets and metainfo.libraries and metainfo.packagesdir then
+ local result = {}
+ _find_package(target_root, result, metainfo)
+ if result.links or result.includedirs then
+ return result
+ end
+ end
+end
+
+
diff --git a/xmake/modules/package/manager/nuget/install_package.lua b/xmake/modules/package/manager/nuget/install_package.lua
new file mode 100644
index 000000000..371dd4391
--- /dev/null
+++ b/xmake/modules/package/manager/nuget/install_package.lua
@@ -0,0 +1,64 @@
+--!A cross-platform build utility based on Lua
+--
+-- Licensed under the Apache License, Version 2.0 (the "License");
+-- you may not use this file except in compliance with the License.
+-- You may obtain a copy of the License at
+--
+-- http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+-- See the License for the specific language governing permissions and
+-- limitations under the License.
+--
+-- Copyright (C) 2015-present, TBOOX Open Source Group.
+--
+-- @author ruki
+-- @file install_package.lua
+--
+
+-- imports
+import("core.base.option")
+import("core.base.semver")
+import("lib.detect.find_tool")
+
+-- dotnet add package libpapki --version 1.0.147
+function _install(dotnet, name, opt)
+
+ -- init argv
+ local argv = {"add", "package", name}
+ local require_version = opt.require_version
+ if require_version == "latest" then
+ require_version = nil
+ end
+ if require_version then
+ table.insert(argv, "--version")
+ table.insert(argv, require_version)
+ end
+
+ local installdir = assert(opt.installdir, "installdir not found!")
+ if not os.isdir(installdir) then
+ os.mkdir(installdir)
+ end
+ local stubdir = path.join(installdir, "stub")
+ if not os.isdir(stubdir) then
+ os.vrunv(dotnet, {"new", "console", "-n", "stub"}, {curdir = installdir})
+ end
+
+ -- install package
+ os.vrunv(dotnet, argv, {curdir = stubdir})
+end
+
+-- install package
+--
+-- @param name the package name, e.g. pcre2
+-- @param opt the options, e.g. {verbose = true}
+--
+function main(name, opt)
+ local dotnet = find_tool("dotnet")
+ if not dotnet then
+ raise("dotnet not found!")
+ end
+ _install(dotnet.program, name, opt or {})
+end
diff --git a/xmake/modules/package/manager/vcpkg/install_package.lua b/xmake/modules/package/manager/vcpkg/install_package.lua
index 6cd92573c..b82739367 100644
--- a/xmake/modules/package/manager/vcpkg/install_package.lua
+++ b/xmake/modules/package/manager/vcpkg/install_package.lua
@@ -139,8 +139,6 @@ end
-- @param name the package name, e.g. pcre2, pcre2/libpcre2-8
-- @param opt the options, e.g. {verbose = true}
--
--- @return true or false
---
function main(name, opt)
-- attempt to find vcpkg