diff options
| author | ruki <[email protected]> | 2024-12-17 14:09:47 +0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2024-12-17 14:09:47 +0800 |
| commit | e49b5e63596ac9faadee460178eb8237f9953c80 (patch) | |
| tree | 7b90e7cb33caaaed4eead9ac1c839fdec745d74a | |
| parent | a2ee23e47a174c06ed539e15a0e5b121a61830f2 (diff) | |
| parent | dc88fe879795cc5fcebe32244628a59dca9dad09 (diff) | |
Merge pull request #5981 from xmake-io/nuget
Support for nuget packages
| -rw-r--r-- | tests/projects/package/nuget/.gitignore | 8 | ||||
| -rw-r--r-- | tests/projects/package/nuget/src/main.cpp | 8 | ||||
| -rw-r--r-- | tests/projects/package/nuget/xmake.lua | 7 | ||||
| -rw-r--r-- | xmake/modules/package/manager/nuget/find_package.lua | 164 | ||||
| -rw-r--r-- | xmake/modules/package/manager/nuget/install_package.lua | 64 | ||||
| -rw-r--r-- | xmake/modules/package/manager/vcpkg/install_package.lua | 2 |
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 |
