summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2023-08-01 15:18:53 +0800
committerGitHub <[email protected]>2023-08-01 15:18:53 +0800
commitae1dd341b914d6fd81f974251cfe278f660452d9 (patch)
tree725b5f739e39084f9f44e38fbe4eed475e374c44
parentc252ce12fb66373fca38e96f3fd0b968c667d1ba (diff)
parentd21afdc15f81b84913ba6d8f19275d0afeec32b2 (diff)
Merge pull request #4029 from SirLynix/vsproject_filegroups
vsproject generation: handle filegroups merging
-rw-r--r--xmake/plugins/project/vstudio/impl/vs201x.lua20
-rw-r--r--xmake/plugins/project/vstudio/impl/vs201x_vcxproj_filters.lua49
-rw-r--r--xmake/plugins/project/vsxmake/getinfo.lua69
3 files changed, 92 insertions, 46 deletions
diff --git a/xmake/plugins/project/vstudio/impl/vs201x.lua b/xmake/plugins/project/vstudio/impl/vs201x.lua
index 39cfcc65c..cc00c6b8e 100644
--- a/xmake/plugins/project/vstudio/impl/vs201x.lua
+++ b/xmake/plugins/project/vstudio/impl/vs201x.lua
@@ -589,8 +589,24 @@ function make(outputdir, vsinfo)
table.sort(_target.headerfiles)
-- save file groups
- _target.filegroups = target:get("filegroups")
- _target.filegroups_extraconf = target:extraconf("filegroups")
+ _target.filegroups = table.unique(table.join(_target.filegroups or {}, target:get("filegroups")))
+
+ for filegroup, groupconf in pairs(target:extraconf("filegroups")) do
+ _target.filegroups_extraconf = _target.filegroups_extraconf or {}
+ local mergedconf = _target.filegroups_extraconf[filegroup]
+ if not mergedconf then
+ mergedconf = {}
+ _target.filegroups_extraconf[filegroup] = mergedconf
+ end
+
+ if groupconf.rootdir then
+ mergedconf.rootdir = table.unique(table.join(mergedconf.rootdir or {}, table.wrap(groupconf.rootdir)))
+ end
+ if groupconf.files then
+ mergedconf.files = table.unique(table.join(mergedconf.files or {}, table.wrap(groupconf.files)))
+ end
+ mergedconf.plain = groupconf.plain or mergedconf.plain
+ end
-- make target headers
_make_targetheaders(mode, arch, target, mode_idx == #vsinfo.modes and arch_idx == 2)
diff --git a/xmake/plugins/project/vstudio/impl/vs201x_vcxproj_filters.lua b/xmake/plugins/project/vstudio/impl/vs201x_vcxproj_filters.lua
index eda9518d1..572ec0622 100644
--- a/xmake/plugins/project/vstudio/impl/vs201x_vcxproj_filters.lua
+++ b/xmake/plugins/project/vstudio/impl/vs201x_vcxproj_filters.lua
@@ -76,32 +76,39 @@ function _make_filter(filepath, target, vcxprojdir)
local extraconf = filegroups_extraconf[filegroup] or {}
local rootdir = extraconf.rootdir
assert(rootdir, "please set root directory, e.g. add_filegroups(%s, {rootdir = 'xxx'})", filegroup)
- if not path.is_absolute(rootdir) then
- rootdir = path.absolute(rootdir, scriptdir)
- end
- local fileitem = path.relative(filepath, rootdir)
- local files = extraconf.files or "**"
- local mode = extraconf.mode
- for _, filepattern in ipairs(files) do
- filepattern = path.pattern(path.absolute(path.join(rootdir, filepattern)))
- if filepath:match(filepattern) then
- if mode == "plain" then
- filter = path.normalize(filegroup)
- is_plain = true
- else
- -- file tree mode (default)
- if filegroup ~= "" then
- filter = path.normalize(path.join(filegroup, path.directory(fileitem)))
+ for _, rootdir in ipairs(table.wrap(rootdir)) do
+ if not path.is_absolute(rootdir) then
+ rootdir = path.absolute(rootdir, scriptdir)
+ end
+ local fileitem = path.relative(filepath, rootdir)
+ local files = extraconf.files or "**"
+ local mode = extraconf.mode
+ for _, filepattern in ipairs(files) do
+ filepattern = path.pattern(path.absolute(path.join(rootdir, filepattern)))
+ if filepath:match(filepattern) then
+ if mode == "plain" then
+ filter = path.normalize(filegroup)
+ is_plain = true
else
- filter = path.normalize(path.directory(fileitem))
+ -- file tree mode (default)
+ if filegroup ~= "" then
+ filter = path.normalize(path.join(filegroup, path.directory(fileitem)))
+ else
+ filter = path.normalize(path.directory(fileitem))
+ end
end
+ if filter and filter == '.' then
+ filter = nil
+ end
+ goto found_filter
end
- if filter and filter == '.' then
- filter = nil
- end
- break
+ end
+ -- stop once a rootdir matches
+ if filter then
+ goto found_filter
end
end
+ ::found_filter::
end
end
if not filter and not is_plain then
diff --git a/xmake/plugins/project/vsxmake/getinfo.lua b/xmake/plugins/project/vsxmake/getinfo.lua
index 031cbd66c..66537f059 100644
--- a/xmake/plugins/project/vsxmake/getinfo.lua
+++ b/xmake/plugins/project/vsxmake/getinfo.lua
@@ -325,32 +325,39 @@ function _make_filter(filepath, target, vcxprojdir)
local extraconf = filegroups_extraconf[filegroup] or {}
local rootdir = extraconf.rootdir
assert(rootdir, "please set root directory, e.g. add_filegroups(%s, {rootdir = 'xxx'})", filegroup)
- if not path.is_absolute(rootdir) then
- rootdir = path.absolute(rootdir, scriptdir)
- end
- local fileitem = path.relative(filepath, rootdir)
- local files = extraconf.files or "**"
- local mode = extraconf.mode
- for _, filepattern in ipairs(files) do
- filepattern = path.pattern(path.absolute(path.join(rootdir, filepattern)))
- if filepath:match(filepattern) then
- if mode == "plain" then
- filter = path.normalize(filegroup)
- is_plain = true
- else
- -- file tree mode (default)
- if filegroup ~= "" then
- filter = path.normalize(path.join(filegroup, path.directory(fileitem)))
+ for _, rootdir in ipairs(table.wrap(rootdir)) do
+ if not path.is_absolute(rootdir) then
+ rootdir = path.absolute(rootdir, scriptdir)
+ end
+ local fileitem = path.relative(filepath, rootdir)
+ local files = extraconf.files or "**"
+ local mode = extraconf.mode
+ for _, filepattern in ipairs(files) do
+ filepattern = path.pattern(path.absolute(path.join(rootdir, filepattern)))
+ if filepath:match(filepattern) then
+ if mode == "plain" then
+ filter = path.normalize(filegroup)
+ is_plain = true
else
- filter = path.normalize(path.directory(fileitem))
+ -- file tree mode (default)
+ if filegroup ~= "" then
+ filter = path.normalize(path.join(filegroup, path.directory(fileitem)))
+ else
+ filter = path.normalize(path.directory(fileitem))
+ end
end
+ if filter and filter == '.' then
+ filter = nil
+ end
+ goto found_filter
end
- if filter and filter == '.' then
- filter = nil
- end
- break
+ end
+ -- stop once a rootdir matches
+ if filter then
+ goto found_filter
end
end
+ ::found_filter::
end
end
if not filter and not is_plain then
@@ -497,8 +504,24 @@ function main(outputdir, vsinfo)
table.sort(_target.headerfiles)
-- save file groups
- _target.filegroups = target:get("filegroups")
- _target.filegroups_extraconf = target:extraconf("filegroups")
+ _target.filegroups = table.unique(table.join(_target.filegroups or {}, target:get("filegroups")))
+
+ for filegroup, groupconf in pairs(target:extraconf("filegroups")) do
+ _target.filegroups_extraconf = _target.filegroups_extraconf or {}
+ local mergedconf = _target.filegroups_extraconf[filegroup]
+ if not mergedconf then
+ mergedconf = {}
+ _target.filegroups_extraconf[filegroup] = mergedconf
+ end
+
+ if groupconf.rootdir then
+ mergedconf.rootdir = table.unique(table.join(mergedconf.rootdir or {}, table.wrap(groupconf.rootdir)))
+ end
+ if groupconf.files then
+ mergedconf.files = table.unique(table.join(mergedconf.files or {}, table.wrap(groupconf.files)))
+ end
+ mergedconf.plain = groupconf.plain or mergedconf.plain
+ end
-- save deps
_target.deps = table.unique(table.join(_target.deps or {}, table.orderkeys(target:deps()), nil))