diff options
| author | ruki <[email protected]> | 2022-04-20 00:52:54 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2022-04-20 00:52:54 +0800 |
| commit | e71bc3a2e6d2f71784cdbf5463706311cb25efb2 (patch) | |
| tree | da26349c0142fcfdaa4fd608ad5bee64b5f1987b /xmake/plugins/project/vstudio/impl | |
| parent | e807230557aac69e4d583c75626e3a7ebdb922f8 (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.lua | 5 | ||||
| -rw-r--r-- | xmake/plugins/project/vstudio/impl/vs201x_vcxproj_filters.lua | 26 |
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 |
