summaryrefslogtreecommitdiff
path: root/xmake/plugins/project/vstudio/impl
diff options
context:
space:
mode:
authorruki <[email protected]>2022-04-20 00:52:54 +0800
committerruki <[email protected]>2022-04-20 00:52:54 +0800
commite71bc3a2e6d2f71784cdbf5463706311cb25efb2 (patch)
treeda26349c0142fcfdaa4fd608ad5bee64b5f1987b /xmake/plugins/project/vstudio/impl
parente807230557aac69e4d583c75626e3a7ebdb922f8 (diff)
improve filter and support file group for vsxmake
Diffstat (limited to 'xmake/plugins/project/vstudio/impl')
-rw-r--r--xmake/plugins/project/vstudio/impl/vs201x.lua5
-rw-r--r--xmake/plugins/project/vstudio/impl/vs201x_vcxproj_filters.lua26
2 files changed, 25 insertions, 6 deletions
diff --git a/xmake/plugins/project/vstudio/impl/vs201x.lua b/xmake/plugins/project/vstudio/impl/vs201x.lua
index 52ef5c7f3..29d4b3f53 100644
--- a/xmake/plugins/project/vstudio/impl/vs201x.lua
+++ b/xmake/plugins/project/vstudio/impl/vs201x.lua
@@ -576,13 +576,16 @@ function make(outputdir, vsinfo)
_target.kind = target:kind()
_target.scriptdir = target:scriptdir()
_target.info = _target.info or {}
- _target.instance = target
table.insert(_target.info, _make_targetinfo(mode, arch, target, _target.project_dir))
-- 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 file groups
+ _target.filegroups = target:get("filegroups")
+ _target.filegroups_extraconf = target:extraconf("filegroups")
+
-- make target headers
_make_targetheaders(mode, arch, target, mode_idx == #vsinfo.modes and arch_idx == 2)
end
diff --git a/xmake/plugins/project/vstudio/impl/vs201x_vcxproj_filters.lua b/xmake/plugins/project/vstudio/impl/vs201x_vcxproj_filters.lua
index a1647093f..b8dc48534 100644
--- a/xmake/plugins/project/vstudio/impl/vs201x_vcxproj_filters.lua
+++ b/xmake/plugins/project/vstudio/impl/vs201x_vcxproj_filters.lua
@@ -51,24 +51,36 @@ function _make_tailer(filtersfile, vsinfo)
filtersfile:leave("</Project>")
end
+-- strip dot directories, e.g. ..\..\.. => ..
+-- @see https://github.com/xmake-io/xmake/issues/2039
+function _strip_dotdirs(dir)
+ local count
+ dir, count = dir:gsub("%.%.[\\/]%.%.", "..")
+ if count > 0 then
+ dir = _strip_dotdirs(dir)
+ end
+ return dir
+end
+
-- make filter
function _make_filter(filepath, target, vcxprojdir)
local filter
- local targetinst = assert(target.instance, "target instance not found!")
- local filegroups = targetinst:get("filegroups")
+ local filegroups = target.filegroups
if filegroups then
-- @see https://github.com/xmake-io/xmake/issues/2282
filepath = path.absolute(filepath)
local scriptdir = target.scriptdir
+ local filegroups_extraconf = target.filegroups_extraconf or {}
for _, filegroup in ipairs(filegroups) do
- local rootdir = targetinst:extraconf("filegroups", filegroup, "rootdir")
+ 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 = targetinst:extraconf("filegroups", filegroup, "files") or "**"
- local mode = targetinst:extraconf("filegroups", filegroup, "mode")
+ local files = extraconf.files or "**"
+ local mode = extraconf.mode
for _, filepattern in ipairs(files) do
filepattern = path.pattern(path.translate(filepattern))
if fileitem:match(filepattern) then
@@ -89,6 +101,10 @@ function _make_filter(filepath, target, vcxprojdir)
if not filter then
-- use the default filter rule
filter = path.relative(path.absolute(path.directory(filepath)), target.scriptdir or vcxprojdir)
+ -- @see https://github.com/xmake-io/xmake/issues/2039
+ if filter then
+ filter = _strip_dotdirs(filter)
+ end
if filter and filter == '.' then
filter = nil
end