summaryrefslogtreecommitdiff
path: root/xmake/plugins
diff options
context:
space:
mode:
authorruki <[email protected]>2020-12-29 22:36:03 +0800
committerGitHub <[email protected]>2020-12-29 22:36:03 +0800
commitfb4c70ea1c37c27f5affe6d28de6072e087e83a2 (patch)
tree59efc6b5b686e550e288c7e6e3502f80d1f4763b /xmake/plugins
parent1e5aeb9b1e7b1e949f7bc56f11d405024024c6ca (diff)
parent9c2899049a52d18afc04fc6a2a591efc3de83371 (diff)
Merge pull request #1174 from xmake-io/group
Add group for vs/vsxmake
Diffstat (limited to 'xmake/plugins')
-rw-r--r--xmake/plugins/project/vstudio/impl/vs201x_solution.lua49
-rw-r--r--xmake/plugins/project/vsxmake/getinfo.lua60
-rw-r--r--xmake/plugins/project/vsxmake/vsproj/templates/sln/ProjectGroup(group)2
-rw-r--r--xmake/plugins/project/vsxmake/vsproj/templates/sln/ProjectGroupConfig(group_dep)1
-rw-r--r--xmake/plugins/project/vsxmake/vsproj/templates/sln/vsxmake.sln3
-rw-r--r--xmake/plugins/project/vsxmake/vsxmake.lua49
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")