From c5b3fb0bd7de0c096344b98ebdb925e53d1e0e7c Mon Sep 17 00:00:00 2001 From: ruki Date: Tue, 29 Dec 2020 00:32:40 +0800 Subject: support group for vs project --- xmake/core/project/target.lua | 1 + .../project/vstudio/impl/vs201x_solution.lua | 49 ++++++++++++++++++---- 2 files changed, 41 insertions(+), 9 deletions(-) diff --git a/xmake/core/project/target.lua b/xmake/core/project/target.lua index 204236394..cd94045db 100644 --- a/xmake/core/project/target.lua +++ b/xmake/core/project/target.lua @@ -1869,6 +1869,7 @@ function target.apis() , "target.set_arch" , "target.set_strip" , "target.set_rules" + , "target.set_group" , "target.set_version" , "target.set_license" , "target.set_enabled" diff --git a/xmake/plugins/project/vstudio/impl/vs201x_solution.lua b/xmake/plugins/project/vstudio/impl/vs201x_solution.lua index 64d219695..45551e1da 100644 --- a/xmake/plugins/project/vstudio/impl/vs201x_solution.lua +++ b/xmake/plugins/project/vstudio/impl/vs201x_solution.lua @@ -40,27 +40,33 @@ end -- make projects function _make_projects(slnfile, vsinfo) - -- the vstudio tool uuid for vc project - local vctool = "8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942" - -- make all targets + local groups = {} + local vctool = "8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942" for targetname, target in pairs(project.targets()) do if not target:isphony() then - - -- enter project slnfile:enter("Project(\"{%s}\") = \"%s\", \"%s\\%s.vcxproj\", \"{%s}\"", vctool, targetname, targetname, targetname, hash.uuid4(targetname)) - - -- add dependences for _, dep in ipairs(target:get("deps")) do slnfile:enter("ProjectSection(ProjectDependencies) = postProject") slnfile:print("{%s} = {%s}", hash.uuid4(dep), hash.uuid4(dep)) slnfile:leave("EndProjectSection") end - - -- leave project slnfile:leave("EndProject") + local group_path = target:get("group") + if group_path then + for _, group_name in ipairs(path.split(group_path)) do + groups[group_name] = hash.uuid4(group_name) + end + end end end + + -- make all groups + local project_group_uuid = "2150E333-8FDC-42A3-9474-1A3956D46DE8" + for group_name, group_uuid in pairs(groups) do + slnfile:enter("Project(\"{%s}\") = \"%s\", \"%s\", \"{%s}\"", project_group_uuid, group_name, group_name, group_uuid) + slnfile:leave("EndProject") + end end -- make global @@ -98,6 +104,31 @@ function _make_global(slnfile, vsinfo) slnfile:print("HideSolutionNode = FALSE") slnfile:leave("EndGlobalSection") + -- add project groups + slnfile:enter("GlobalSection(NestedProjects) = preSolution") + local subgroups = {} + for targetname, target in pairs(project.targets()) do + if not target:isphony() then + local group_path = target:get("group") + if group_path then + -- target -> group + local group_name = path.filename(group_path) + slnfile:print("{%s} = {%s}", hash.uuid4(targetname), hash.uuid4(group_name)) + -- group -> group -> ... + local group_names = path.split(group_path) + for idx, group_name in ipairs(group_names) do + local key = group_name .. (group_name_sub or "") + local group_name_sub = group_names[idx + 1] + if group_name_sub and not subgroups[key] then + slnfile:print("{%s} = {%s}", hash.uuid4(group_name_sub), hash.uuid4(group_name)) + subgroups[key] = true + end + end + end + end + end + slnfile:leave("EndGlobalSection") + -- leave global slnfile:leave("EndGlobal") end -- cgit v1.3.1 From 35feb285f84cd87070d0d8f83c80b8563d0229c7 Mon Sep 17 00:00:00 2001 From: ruki Date: Tue, 29 Dec 2020 00:32:55 +0800 Subject: update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 75715509a..e0c4221cf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ * [#1079](https://github.com/xmake-io/xmake/issues/1079): Add autoupdate plugin rule for vsxmake, `add_rules("plugin.vsxmake.autoupdate")` * Add `xmake f --vs_runtime=MT` and `set_runtimes("MT")` to set vs runtime for targets and packages * [#1032](https://github.com/xmake-io/xmake/issues/1032): Support to enum registry keys and values +* [#1026](https://github.com/xmake-io/xmake/issues/1026): Support group for vs/vsxmake project ### Change @@ -898,6 +899,7 @@ * [#1079](https://github.com/xmake-io/xmake/issues/1079): 为 vsxmake 插件添加工程自动更新插件,`add_rules("plugin.vsxmake.autoupdate")` * 添加 `xmake f --vs_runtime=MT` 和 `set_runtimes("MT")` 去更方便的对 target 和 package 进行设置 * [#1032](https://github.com/xmake-io/xmake/issues/1032): 支持枚举注册表 keys 和 values +* [#1026](https://github.com/xmake-io/xmake/issues/1026): 支持对 vs/vsmake 工程增加分组设置 ### 改进 -- cgit v1.3.1 From 9358e68caf11067b683bfad56c75714222ac6f57 Mon Sep 17 00:00:00 2001 From: ruki Date: Tue, 29 Dec 2020 00:36:38 +0800 Subject: add group test --- tests/projects/other/group/.gitignore | 8 ++++++++ tests/projects/other/group/src/main.cpp | 9 +++++++++ tests/projects/other/group/xmake.lua | 29 +++++++++++++++++++++++++++++ 3 files changed, 46 insertions(+) create mode 100644 tests/projects/other/group/.gitignore create mode 100644 tests/projects/other/group/src/main.cpp create mode 100644 tests/projects/other/group/xmake.lua diff --git a/tests/projects/other/group/.gitignore b/tests/projects/other/group/.gitignore new file mode 100644 index 000000000..152105761 --- /dev/null +++ b/tests/projects/other/group/.gitignore @@ -0,0 +1,8 @@ +# Xmake cache +.xmake/ +build/ + +# MacOS Cache +.DS_Store + + diff --git a/tests/projects/other/group/src/main.cpp b/tests/projects/other/group/src/main.cpp new file mode 100644 index 000000000..7c435d251 --- /dev/null +++ b/tests/projects/other/group/src/main.cpp @@ -0,0 +1,9 @@ +#include + +using namespace std; + +int main(int argc, char** argv) +{ + cout << "hello world!" << endl; + return 0; +} diff --git a/tests/projects/other/group/xmake.lua b/tests/projects/other/group/xmake.lua new file mode 100644 index 000000000..65da1826c --- /dev/null +++ b/tests/projects/other/group/xmake.lua @@ -0,0 +1,29 @@ +add_rules("mode.debug", "mode.release") + +target("test1") + set_kind("binary") + add_files("src/*.cpp") + set_group("group1") + +target("test2") + set_kind("binary") + add_files("src/*.cpp") + set_group("group1") + +target("test3") + set_kind("binary") + add_files("src/*.cpp") + set_group("group1/group2") + +target("test4") + set_kind("binary") + add_files("src/*.cpp") + set_group("group3/group4") + +target("test5") + set_kind("binary") + add_files("src/*.cpp") + +target("test6") + set_kind("binary") + add_files("src/*.cpp") -- cgit v1.3.1 From a9307b7687e1b29dfdecd1db0c86ae0d4c5ba501 Mon Sep 17 00:00:00 2001 From: ruki Date: Tue, 29 Dec 2020 23:04:03 +0800 Subject: add project groups for vsxmake --- xmake/plugins/project/vsxmake/getinfo.lua | 27 ++++++++++++++++++++-- .../vsproj/templates/sln/ProjectGroup(group) | 2 ++ .../vsxmake/vsproj/templates/sln/vsxmake.sln | 1 + xmake/plugins/project/vsxmake/vsxmake.lua | 8 ++++++- 4 files changed, 35 insertions(+), 3 deletions(-) create mode 100644 xmake/plugins/project/vsxmake/vsproj/templates/sln/ProjectGroup(group) diff --git a/xmake/plugins/project/vsxmake/getinfo.lua b/xmake/plugins/project/vsxmake/getinfo.lua index 1cc3efac2..97fa6eb76 100644 --- a/xmake/plugins/project/vsxmake/getinfo.lua +++ b/xmake/plugins/project/vsxmake/getinfo.lua @@ -265,6 +265,24 @@ function _make_vsinfo_archs() return vsinfo_archs end +function _make_vsinfo_groups() + local groups = {} + for targetname, target in pairs(project.targets()) do + if not target:isphony() then + local group_path = target:get("group") + if group_path then + for _, group_name in ipairs(path.split(group_path)) do + local group = groups[group_name] or {} + group.group = group_name + group.group_id = hash.uuid4(group_name) + groups[group_name] = group + end + end + end + end + return groups +end + -- make vstudio project function main(outputdir, vsinfo) @@ -290,9 +308,15 @@ function main(outputdir, vsinfo) -- init modes vsinfo.modes = _make_vsinfo_modes() + -- init archs vsinfo.archs = _make_vsinfo_archs() + -- init groups + local groups = _make_vsinfo_groups() + vsinfo.groups = table.keys(groups) + vsinfo._groups = groups + -- load targets local targets = {} vsinfo._sub2 = {} @@ -366,13 +390,12 @@ function main(outputdir, vsinfo) _target.sourcefiles = table.unique(table.join(_target.sourcefiles or {}, (target:sourcefiles()))) _target.headerfiles = table.unique(table.join(_target.headerfiles or {}, (target:headerfiles()))) + -- save deps _target.deps = table.unique(table.join(_target.deps or {}, table.keys(target:deps()), nil)) end end end end - - -- leave project directory os.cd(oldir) for _, target in pairs(targets) do target._sub2 = {} diff --git a/xmake/plugins/project/vsxmake/vsproj/templates/sln/ProjectGroup(group) b/xmake/plugins/project/vsxmake/vsproj/templates/sln/ProjectGroup(group) new file mode 100644 index 000000000..2a32553a7 --- /dev/null +++ b/xmake/plugins/project/vsxmake/vsproj/templates/sln/ProjectGroup(group) @@ -0,0 +1,2 @@ +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "#group#", "#group#", "{#group_id#}" +EndProject diff --git a/xmake/plugins/project/vsxmake/vsproj/templates/sln/vsxmake.sln b/xmake/plugins/project/vsxmake/vsproj/templates/sln/vsxmake.sln index fa719dfff..6dddb0e7e 100644 --- a/xmake/plugins/project/vsxmake/vsproj/templates/sln/vsxmake.sln +++ b/xmake/plugins/project/vsxmake/vsproj/templates/sln/vsxmake.sln @@ -11,6 +11,7 @@ Microsoft Visual Studio Solution File, Format Version #solution_version#.0 VisualStudioVersion = #vs_version# MinimumVisualStudioVersion = 10.0 #Import(Project)# +#Import(ProjectGroup)# Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Properties", "Properties", "{007754BD-BB1F-452F-A0D8-13EF216C5ED9}" ProjectSection(SolutionItems) = preProject Xmake.Custom.props = Xmake.Custom.props diff --git a/xmake/plugins/project/vsxmake/vsxmake.lua b/xmake/plugins/project/vsxmake/vsxmake.lua index cb238ca12..95058ebe4 100644 --- a/xmake/plugins/project/vsxmake/vsxmake.lua +++ b/xmake/plugins/project/vsxmake/vsxmake.lua @@ -57,7 +57,10 @@ function _buildparams(info, target, default) opt = table.join(target, opt) end for _, k in ipairs(opt) do - local v = (i._sub or {})[k] or (i._sub2 or {})[k] or (i._sub3 or {})[k] or (i._sub4 or {})[k]or i[k] + local v = (i._sub or {})[k] or (i._sub2 or {})[k] or (i._sub3 or {})[k] or (i._sub4 or {})[k] or i[k] + if v == nil and i._groups then + v = i._groups[k] + end if v == nil then raise("key '" .. k .. "' not found") end @@ -82,6 +85,9 @@ function _buildparams(info, target, default) if args.arch then table.insert(r, info.archs) end + if args.group then + table.insert(r, info.groups) + end if args.dir then table.insert(r, info._sub[target].dirs) end -- cgit v1.3.1 From 729564c443fe59ece8fa481db2693f4f1b4c1498 Mon Sep 17 00:00:00 2001 From: ruki Date: Tue, 29 Dec 2020 23:08:41 +0800 Subject: impl partial group for vsxmake --- xmake/plugins/project/vsxmake/getinfo.lua | 6 ++++++ .../project/vsxmake/vsproj/templates/sln/TargetGroupConfig(target) | 1 + xmake/plugins/project/vsxmake/vsproj/templates/sln/vsxmake.sln | 2 ++ 3 files changed, 9 insertions(+) create mode 100644 xmake/plugins/project/vsxmake/vsproj/templates/sln/TargetGroupConfig(target) diff --git a/xmake/plugins/project/vsxmake/getinfo.lua b/xmake/plugins/project/vsxmake/getinfo.lua index 97fa6eb76..1eb6bad19 100644 --- a/xmake/plugins/project/vsxmake/getinfo.lua +++ b/xmake/plugins/project/vsxmake/getinfo.lua @@ -392,6 +392,12 @@ function main(outputdir, vsinfo) -- save deps _target.deps = table.unique(table.join(_target.deps or {}, table.keys(target:deps()), nil)) + + -- save group id + local group_path = target:get("group") + if group_path then + _target.group_id = hash.uuid4(path.filename(group_path)) + end end end end diff --git a/xmake/plugins/project/vsxmake/vsproj/templates/sln/TargetGroupConfig(target) b/xmake/plugins/project/vsxmake/vsproj/templates/sln/TargetGroupConfig(target) new file mode 100644 index 000000000..278eab9d8 --- /dev/null +++ b/xmake/plugins/project/vsxmake/vsproj/templates/sln/TargetGroupConfig(target) @@ -0,0 +1 @@ + {#target_id#} = {#group_id#} diff --git a/xmake/plugins/project/vsxmake/vsproj/templates/sln/vsxmake.sln b/xmake/plugins/project/vsxmake/vsproj/templates/sln/vsxmake.sln index 6dddb0e7e..13678b34b 100644 --- a/xmake/plugins/project/vsxmake/vsproj/templates/sln/vsxmake.sln +++ b/xmake/plugins/project/vsxmake/vsproj/templates/sln/vsxmake.sln @@ -27,6 +27,8 @@ Global GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(NestedProjects) = preSolution +#Import(TargetGroupConfig)# EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {#solution_id#} EndGlobalSection -- cgit v1.3.1 From a5cc662eb1b570e02512706019b7bb1082a2155f Mon Sep 17 00:00:00 2001 From: ruki Date: Tue, 29 Dec 2020 23:14:06 +0800 Subject: impl subgroup for vsxmake --- xmake/plugins/project/vsxmake/getinfo.lua | 7 ++++++- .../project/vsxmake/vsproj/templates/sln/SubGroupConfig(group) | 1 + xmake/plugins/project/vsxmake/vsproj/templates/sln/vsxmake.sln | 3 ++- 3 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 xmake/plugins/project/vsxmake/vsproj/templates/sln/SubGroupConfig(group) diff --git a/xmake/plugins/project/vsxmake/getinfo.lua b/xmake/plugins/project/vsxmake/getinfo.lua index 1eb6bad19..103ee5a56 100644 --- a/xmake/plugins/project/vsxmake/getinfo.lua +++ b/xmake/plugins/project/vsxmake/getinfo.lua @@ -271,10 +271,15 @@ function _make_vsinfo_groups() if not target:isphony() then local group_path = target:get("group") if group_path then - for _, group_name in ipairs(path.split(group_path)) do + local group_names = path.split(group_path) + for idx, group_name in ipairs(group_names) do local group = groups[group_name] or {} group.group = group_name group.group_id = hash.uuid4(group_name) + if idx > 1 then + local parent_group_name = group_names[idx - 1] + group.parent_group_id = hash.uuid4(parent_group_name) + end groups[group_name] = group end end diff --git a/xmake/plugins/project/vsxmake/vsproj/templates/sln/SubGroupConfig(group) b/xmake/plugins/project/vsxmake/vsproj/templates/sln/SubGroupConfig(group) new file mode 100644 index 000000000..95015762a --- /dev/null +++ b/xmake/plugins/project/vsxmake/vsproj/templates/sln/SubGroupConfig(group) @@ -0,0 +1 @@ + {#group_id#} = {#parent_group_id#} diff --git a/xmake/plugins/project/vsxmake/vsproj/templates/sln/vsxmake.sln b/xmake/plugins/project/vsxmake/vsproj/templates/sln/vsxmake.sln index 13678b34b..693ed4793 100644 --- a/xmake/plugins/project/vsxmake/vsproj/templates/sln/vsxmake.sln +++ b/xmake/plugins/project/vsxmake/vsproj/templates/sln/vsxmake.sln @@ -28,7 +28,8 @@ Global HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution -#Import(TargetGroupConfig)# EndGlobalSection +#Import(TargetGroupConfig)# +#Import(SubGroupConfig)# EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {#solution_id#} EndGlobalSection -- cgit v1.3.1 From f3cbb6767c3f28317bd6c2f2160b41d34057d25b Mon Sep 17 00:00:00 2001 From: ruki Date: Tue, 29 Dec 2020 23:20:33 +0800 Subject: rename some vars for vsxmake --- xmake/plugins/project/vsxmake/getinfo.lua | 24 ++++++++++---------- xmake/plugins/project/vsxmake/vsxmake.lua | 37 ++++++++++++++++++++++--------- 2 files changed, 38 insertions(+), 23 deletions(-) diff --git a/xmake/plugins/project/vsxmake/getinfo.lua b/xmake/plugins/project/vsxmake/getinfo.lua index 103ee5a56..b7255bb1c 100644 --- a/xmake/plugins/project/vsxmake/getinfo.lua +++ b/xmake/plugins/project/vsxmake/getinfo.lua @@ -324,11 +324,11 @@ function main(outputdir, vsinfo) -- load targets local targets = {} - vsinfo._sub2 = {} + vsinfo._arch_modes = {} for _, mode in ipairs(vsinfo.modes) do - vsinfo._sub2[mode] = {} + vsinfo._arch_modes[mode] = {} for _, arch in ipairs(vsinfo.archs) do - vsinfo._sub2[mode][arch] = { mode = mode, arch = arch } + vsinfo._arch_modes[mode][arch] = { mode = mode, arch = arch } -- trace print("checking for %s.%s ...", mode, arch) @@ -385,10 +385,10 @@ function main(outputdir, vsinfo) _target.projectdir = path.relative(project.directory(), _target.vcxprojdir) local targetdir = target:get("targetdir") if targetdir then _target.targetdir = path.relative(targetdir, _target.vcxprojdir) end - _target._sub = _target._sub or {} - _target._sub[mode] = _target._sub[mode] or {} + _target._targets = _target._targets or {} + _target._targets[mode] = _target._targets[mode] or {} local targetinfo = _make_targetinfo(mode, arch, target) - _target._sub[mode][arch] = targetinfo + _target._targets[mode][arch] = targetinfo _target.sdkver = targetinfo.sdkver -- save all sourcefiles and headerfiles @@ -409,14 +409,14 @@ function main(outputdir, vsinfo) end os.cd(oldir) for _, target in pairs(targets) do - target._sub2 = {} + target._paths = {} local dirs = {} local root = project.directory() target.sourcefiles = table.imap(target.sourcefiles, function(_, v) return path.relative(v, root) end) target.headerfiles = table.imap(target.headerfiles, function(_, v) return path.relative(v, root) end) for _, f in ipairs(table.join(target.sourcefiles, target.headerfiles)) do local dir = path.directory(f) - target._sub2[f] = + target._paths[f] = { path = _escape(f), dir = _escape(dir) @@ -432,14 +432,14 @@ function main(outputdir, vsinfo) dir = path.directory(dir) end end - target._sub3 = dirs + target._dirs = dirs target.dirs = table.keys(dirs) - target._sub4 = {} + target._deps = {} for _, v in ipairs(target.deps) do - target._sub4[v] = targets[v] + target._deps[v] = targets[v] end end vsinfo.targets = table.keys(targets) - vsinfo._sub = targets + vsinfo._targets = targets return vsinfo end diff --git a/xmake/plugins/project/vsxmake/vsxmake.lua b/xmake/plugins/project/vsxmake/vsxmake.lua index 95058ebe4..557b0489d 100644 --- a/xmake/plugins/project/vsxmake/vsxmake.lua +++ b/xmake/plugins/project/vsxmake/vsxmake.lua @@ -57,10 +57,25 @@ function _buildparams(info, target, default) opt = table.join(target, opt) end for _, k in ipairs(opt) do - local v = (i._sub or {})[k] or (i._sub2 or {})[k] or (i._sub3 or {})[k] or (i._sub4 or {})[k] or i[k] + local v = (i._targets or {})[k] + if v == nil and i._arch_modes then + v = i._arch_modes[k] + end + if v == nil and i._paths then + v = i._paths[k] + end + if v == nil and i._dirs then + v = i._dirs[k] + end + if v == nil and i._deps then + v = i._deps[k] + end if v == nil and i._groups then v = i._groups[k] end + if v == nil then + v = i[k] + end if v == nil then raise("key '" .. k .. "' not found") end @@ -89,31 +104,31 @@ function _buildparams(info, target, default) table.insert(r, info.groups) end if args.dir then - table.insert(r, info._sub[target].dirs) + table.insert(r, info._targets[target].dirs) end if args.dep then - table.insert(r, info._sub[target].deps) + table.insert(r, info._targets[target].deps) end if args.filec then - local files = info._sub[target].sourcefiles + local files = info._targets[target].sourcefiles table.insert(r, _filter_files(files, {".c"})) elseif args.filecxx then - local files = info._sub[target].sourcefiles + local files = info._targets[target].sourcefiles table.insert(r, _filter_files(files, {".cpp", ".cc", ".cxx"})) elseif args.filecu then - local files = info._sub[target].sourcefiles + local files = info._targets[target].sourcefiles table.insert(r, _filter_files(files, {".cu"})) elseif args.fileobj then - local files = info._sub[target].sourcefiles + local files = info._targets[target].sourcefiles table.insert(r, _filter_files(files, {".obj", ".o"})) elseif args.filerc then - local files = info._sub[target].sourcefiles + local files = info._targets[target].sourcefiles table.insert(r, _filter_files(files, {".rc"})) elseif args.incc then - local files = info._sub[target].headerfiles + local files = info._targets[target].headerfiles table.insert(r, _filter_files(files, nil, {".natvis"})) elseif args.incnatvis then - local files = info._sub[target].headerfiles + local files = info._targets[target].headerfiles table.insert(r, _filter_files(files, {".natvis"})) end return r @@ -179,7 +194,7 @@ function make(version) for _, target in ipairs(info.targets) do local paramsprovidertarget = _buildparams(info, target, "") - local proj_dir = info._sub[target].vcxprojdir + local proj_dir = info._targets[target].vcxprojdir -- write project file local proj = path.join(proj_dir, target .. ".vcxproj") -- cgit v1.3.1 From 2982acc6a60e8808b0322d6e7c905442d58a0fe8 Mon Sep 17 00:00:00 2001 From: ruki Date: Wed, 30 Dec 2020 00:08:41 +0800 Subject: fix test --- tests/plugins/project/test.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/plugins/project/test.lua b/tests/plugins/project/test.lua index 1aac20088..0de70cdba 100644 --- a/tests/plugins/project/test.lua +++ b/tests/plugins/project/test.lua @@ -41,7 +41,7 @@ function test_vsxmake(t) { function () print("--- sln file ---") - io.cat(projname .. "_" .. vstype .. ".sln") + io.cat(projname .. ".sln") print("--- vcx file ---") io.cat(projname .. "/" .. projname .. ".vcxproj") print("--- filter file ---") -- cgit v1.3.1 From 9c2899049a52d18afc04fc6a2a591efc3de83371 Mon Sep 17 00:00:00 2001 From: ruki Date: Wed, 30 Dec 2020 00:41:23 +0800 Subject: fix groups for vsxmake --- xmake/plugins/project/vsxmake/getinfo.lua | 32 ++++++++++------------ .../templates/sln/ProjectGroupConfig(group_dep) | 1 + .../vsproj/templates/sln/SubGroupConfig(group) | 1 - .../vsproj/templates/sln/TargetGroupConfig(target) | 1 - .../vsxmake/vsproj/templates/sln/vsxmake.sln | 3 +- xmake/plugins/project/vsxmake/vsxmake.lua | 6 ++++ 6 files changed, 23 insertions(+), 21 deletions(-) create mode 100644 xmake/plugins/project/vsxmake/vsproj/templates/sln/ProjectGroupConfig(group_dep) delete mode 100644 xmake/plugins/project/vsxmake/vsproj/templates/sln/SubGroupConfig(group) delete mode 100644 xmake/plugins/project/vsxmake/vsproj/templates/sln/TargetGroupConfig(target) diff --git a/xmake/plugins/project/vsxmake/getinfo.lua b/xmake/plugins/project/vsxmake/getinfo.lua index b7255bb1c..17131d391 100644 --- a/xmake/plugins/project/vsxmake/getinfo.lua +++ b/xmake/plugins/project/vsxmake/getinfo.lua @@ -267,25 +267,27 @@ end function _make_vsinfo_groups() local groups = {} + local group_deps = {} for targetname, target in pairs(project.targets()) do if not target:isphony() then local group_path = target:get("group") if group_path then + local group_name = path.filename(group_path) local group_names = path.split(group_path) - for idx, group_name in ipairs(group_names) do - local group = groups[group_name] or {} - group.group = group_name - group.group_id = hash.uuid4(group_name) + for idx, name in ipairs(group_names) do + local group = groups["group." .. name] or {} + group.group = name + group.group_id = hash.uuid4(name) if idx > 1 then - local parent_group_name = group_names[idx - 1] - group.parent_group_id = hash.uuid4(parent_group_name) + group_deps["group_dep." .. name] = {current_id = group.group_id, parent_id = hash.uuid4(group_names[idx - 1])} end - groups[group_name] = group + groups["group." .. name] = group end + group_deps["group_dep.target." .. targetname] = {current_id = hash.uuid4(targetname), parent_id = groups["group." .. group_name].group_id} end end end - return groups + return groups, group_deps end -- make vstudio project @@ -318,9 +320,11 @@ function main(outputdir, vsinfo) vsinfo.archs = _make_vsinfo_archs() -- init groups - local groups = _make_vsinfo_groups() - vsinfo.groups = table.keys(groups) - vsinfo._groups = groups + local groups, group_deps = _make_vsinfo_groups() + vsinfo.groups = table.keys(groups) + vsinfo.group_deps = table.keys(group_deps) + vsinfo._groups = groups + vsinfo._group_deps = group_deps -- load targets local targets = {} @@ -397,12 +401,6 @@ function main(outputdir, vsinfo) -- save deps _target.deps = table.unique(table.join(_target.deps or {}, table.keys(target:deps()), nil)) - - -- save group id - local group_path = target:get("group") - if group_path then - _target.group_id = hash.uuid4(path.filename(group_path)) - end end end end diff --git a/xmake/plugins/project/vsxmake/vsproj/templates/sln/ProjectGroupConfig(group_dep) b/xmake/plugins/project/vsxmake/vsproj/templates/sln/ProjectGroupConfig(group_dep) new file mode 100644 index 000000000..d08963bfb --- /dev/null +++ b/xmake/plugins/project/vsxmake/vsproj/templates/sln/ProjectGroupConfig(group_dep) @@ -0,0 +1 @@ + {#current_id#} = {#parent_id#} diff --git a/xmake/plugins/project/vsxmake/vsproj/templates/sln/SubGroupConfig(group) b/xmake/plugins/project/vsxmake/vsproj/templates/sln/SubGroupConfig(group) deleted file mode 100644 index 95015762a..000000000 --- a/xmake/plugins/project/vsxmake/vsproj/templates/sln/SubGroupConfig(group) +++ /dev/null @@ -1 +0,0 @@ - {#group_id#} = {#parent_group_id#} diff --git a/xmake/plugins/project/vsxmake/vsproj/templates/sln/TargetGroupConfig(target) b/xmake/plugins/project/vsxmake/vsproj/templates/sln/TargetGroupConfig(target) deleted file mode 100644 index 278eab9d8..000000000 --- a/xmake/plugins/project/vsxmake/vsproj/templates/sln/TargetGroupConfig(target) +++ /dev/null @@ -1 +0,0 @@ - {#target_id#} = {#group_id#} diff --git a/xmake/plugins/project/vsxmake/vsproj/templates/sln/vsxmake.sln b/xmake/plugins/project/vsxmake/vsproj/templates/sln/vsxmake.sln index 693ed4793..636f59909 100644 --- a/xmake/plugins/project/vsxmake/vsproj/templates/sln/vsxmake.sln +++ b/xmake/plugins/project/vsxmake/vsproj/templates/sln/vsxmake.sln @@ -28,8 +28,7 @@ Global HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution -#Import(TargetGroupConfig)# -#Import(SubGroupConfig)# EndGlobalSection +#Import(ProjectGroupConfig)# EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {#solution_id#} EndGlobalSection diff --git a/xmake/plugins/project/vsxmake/vsxmake.lua b/xmake/plugins/project/vsxmake/vsxmake.lua index 557b0489d..926533dbf 100644 --- a/xmake/plugins/project/vsxmake/vsxmake.lua +++ b/xmake/plugins/project/vsxmake/vsxmake.lua @@ -73,6 +73,9 @@ function _buildparams(info, target, default) if v == nil and i._groups then v = i._groups[k] end + if v == nil and i._group_deps then + v = i._group_deps[k] + end if v == nil then v = i[k] end @@ -103,6 +106,9 @@ function _buildparams(info, target, default) if args.group then table.insert(r, info.groups) end + if args.group_dep then + table.insert(r, info.group_deps) + end if args.dir then table.insert(r, info._targets[target].dirs) end -- cgit v1.3.1