diff options
| author | ruki <[email protected]> | 2020-12-29 22:36:03 +0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2020-12-29 22:36:03 +0800 |
| commit | fb4c70ea1c37c27f5affe6d28de6072e087e83a2 (patch) | |
| tree | 59efc6b5b686e550e288c7e6e3502f80d1f4763b /xmake/plugins | |
| parent | 1e5aeb9b1e7b1e949f7bc56f11d405024024c6ca (diff) | |
| parent | 9c2899049a52d18afc04fc6a2a591efc3de83371 (diff) | |
Merge pull request #1174 from xmake-io/group
Add group for vs/vsxmake
Diffstat (limited to 'xmake/plugins')
6 files changed, 130 insertions, 34 deletions
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 diff --git a/xmake/plugins/project/vsxmake/getinfo.lua b/xmake/plugins/project/vsxmake/getinfo.lua index 1cc3efac2..17131d391 100644 --- a/xmake/plugins/project/vsxmake/getinfo.lua +++ b/xmake/plugins/project/vsxmake/getinfo.lua @@ -265,6 +265,31 @@ function _make_vsinfo_archs() return vsinfo_archs 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, 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 + group_deps["group_dep." .. name] = {current_id = group.group_id, parent_id = hash.uuid4(group_names[idx - 1])} + end + 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, group_deps +end + -- make vstudio project function main(outputdir, vsinfo) @@ -290,16 +315,24 @@ function main(outputdir, vsinfo) -- init modes vsinfo.modes = _make_vsinfo_modes() + -- init archs vsinfo.archs = _make_vsinfo_archs() + -- init 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 = {} - 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) @@ -356,33 +389,32 @@ 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 _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 = {} + 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) @@ -398,14 +430,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/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/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/vsxmake.sln b/xmake/plugins/project/vsxmake/vsproj/templates/sln/vsxmake.sln index fa719dfff..636f59909 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 @@ -26,6 +27,8 @@ Global GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(NestedProjects) = preSolution +#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 cb238ca12..926533dbf 100644 --- a/xmake/plugins/project/vsxmake/vsxmake.lua +++ b/xmake/plugins/project/vsxmake/vsxmake.lua @@ -57,7 +57,28 @@ 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 and i._group_deps then + v = i._group_deps[k] + end + if v == nil then + v = i[k] + end if v == nil then raise("key '" .. k .. "' not found") end @@ -82,32 +103,38 @@ 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.group_dep then + table.insert(r, info.group_deps) + 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 @@ -173,7 +200,7 @@ function make(version) for _, target in ipairs(info.targets) do local paramsprovidertarget = _buildparams(info, target, "<!-- nil -->") - 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") |
