diff options
| author | ruki <[email protected]> | 2016-09-16 22:07:11 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2016-09-16 22:07:11 +0800 |
| commit | 388f45327004d82fa2261f680a2b89a4620609a4 (patch) | |
| tree | e1a0075e1017680c4fd64b3e84fd1ba3105c8759 /xmake/plugins/project/vstudio/impl | |
| parent | 31db753d4526e309241a5d6d4777de9a2c04535b (diff) | |
modify vs201x filters
Diffstat (limited to 'xmake/plugins/project/vstudio/impl')
| -rwxr-xr-x | xmake/plugins/project/vstudio/impl/vs201x_vcxproj.lua | 2 | ||||
| -rw-r--r-- | xmake/plugins/project/vstudio/impl/vs201x_vcxproj_filters.lua | 181 |
2 files changed, 109 insertions, 74 deletions
diff --git a/xmake/plugins/project/vstudio/impl/vs201x_vcxproj.lua b/xmake/plugins/project/vstudio/impl/vs201x_vcxproj.lua index 53ab72d01..dc62aa656 100755 --- a/xmake/plugins/project/vstudio/impl/vs201x_vcxproj.lua +++ b/xmake/plugins/project/vstudio/impl/vs201x_vcxproj.lua @@ -291,7 +291,7 @@ function _make_source_code_list(vcxprojfile, vsinfo, target, vcxprojdir) vcxprojfile:enter("<ItemGroup>") -- add headers - for idx, includefile in ipairs(target:headerfiles()) do + for _, includefile in ipairs(target:headerfiles()) do _make_header_file(vcxprojfile, includefile, vcxprojdir) end vcxprojfile:leave("</ItemGroup>") diff --git a/xmake/plugins/project/vstudio/impl/vs201x_vcxproj_filters.lua b/xmake/plugins/project/vstudio/impl/vs201x_vcxproj_filters.lua index f8ffaaa17..675664c51 100644 --- a/xmake/plugins/project/vstudio/impl/vs201x_vcxproj_filters.lua +++ b/xmake/plugins/project/vstudio/impl/vs201x_vcxproj_filters.lua @@ -1,111 +1,146 @@ --- importes
+--!The Make-like Build Utility based on Lua
+--
+-- XMake is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU Lesser General Public License as published by
+-- the Free Software Foundation; either version 2.1 of the License, or
+-- (at your option) any later version.
+--
+-- XMake is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU Lesser General Public License for more details.
+--
+-- You should have received a copy of the GNU Lesser General Public License
+-- along with XMake;
+-- If not, see <a href="http://www.gnu.org/licenses/"> http://www.gnu.org/licenses/</a>
+--
+-- Copyright (C) 2015 - 2016, ruki All rights reserved.
+--
+-- @author EnoroF, ruki
+-- @file vs201x_vcxproj_filters.lua
+--
+
+-- imports
import("core.tool.compiler")
import("vsfile")
-- make header
function _make_header(filtersfile, vsinfo, target)
-
- -- the versions
+
+ -- the versions
local versions =
{
- vs2010 = '10'
- , vs2012 = '11'
- , vs2013 = '12'
- , vs2015 = '14'
+ vs2010 = '10.0'
+ , vs2012 = '11.0'
+ , vs2013 = '12.0'
+ , vs2015 = '14.0'
}
-- make header
filtersfile:print("<?xml version=\"1.0\" encoding=\"utf-8\"?>")
- filtersfile:enter("<Project ToolsVersion=\"%s.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">", assert(versions["vs" .. vsinfo.vstudio_version]))
+ filtersfile:enter("<Project ToolsVersion=\"%s\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">", vsinfo.filters_version or version[vsinfo.vstudio_version])
end
-- make tailer
function _make_tailer(filtersfile, vsinfo, target)
- filtersfile:leave("</Project>")
+ filtersfile:leave("</Project>")
end
-local include_list = {}
-local sources_list = {}
-local filters_list = {}
-
--- add to file list
-function _add_to_list(source, list, vcxprojdir)
- table.insert(list, source)
- _add_to_filter(source, vcxprojdir)
-end
+-- make filter
+function _make_filter(filepath, target, vcxprojdir)
--- make filters
-function _add_to_filter(source, vcxprojdir)
+ -- make filter
+ local filter = path.relative(path.absolute(path.directory(filepath)), target:scriptdir() or vcxprojdir)
- local filter = path.relative(path.directory(source), "Sources")
+ -- is '.'? no filter
+ if filter and filter == '.' then
+ filter = nil
+ end
- if filters_list[filter] == nil then
- filters_list[filter] = true
- end
+ -- ok?
+ return filter
end
--- make source list
-function _make_source_list(filtersfile, vsinfo, target, vcxprojdir)
-
- for _, includefile in ipairs(target:headerfiles()) do
- _add_to_list(includefile, include_list, vcxprojdir)
- end
- for _, sourcefile in ipairs(target:sourcefiles()) do
- _add_to_list(sourcefile, include_list, vcxprojdir)
- end
-
- -- and includes
- filtersfile:enter("<ItemGroup>")
- for _, includeFile in ipairs(include_list) do
- filtersfile:enter("<ClInclude Include=\"%s\">", path.relative(includeFile, vcxprojdir))
- filtersfile:print("<Filter>%s</Filter>", path.relative(path.directory(includeFile), "Sources"))
- filtersfile:leave("</ClInclude>")
- end
- filtersfile:leave("</ItemGroup>")
+-- make filters
+function _make_filters(filtersfile, vsinfo, target, vcxprojdir)
+
+ -- add filters
+ filtersfile:enter("<ItemGroup>")
+ local exists = {}
+ for _, filepath in pairs(table.join(target:sourcefiles(), target:headerfiles())) do
+ local filter = _make_filter(filepath, target, vcxprojdir)
+ if filter and not exists[filter] then
+ filtersfile:enter("<Filter Include=\"%s\">", filter)
+ filtersfile:print("<UniqueIdentifier>{%s}</UniqueIdentifier>", os.uuid(filter))
+ filtersfile:leave("</Filter>")
+ exists[filter] = true
+ end
+ end
+ filtersfile:leave("</ItemGroup>")
+end
- -- and sources
- filtersfile:enter("<ItemGroup>")
- for _, sourceFile in ipairs(sources_list) do
- filtersfile:enter("<ClCompile Include=\"%s\">", path.relative(sourceFile, vcxprojdir))
- filtersfile:print("<Filter>%s</Filter>", path.relative(path.directory(sourceFile), "Sources"))
- filtersfile:leave("</ClCompile>")
- end
- filtersfile:leave("</ItemGroup>")
+-- make sources
+function _make_sources(filtersfile, vsinfo, target, vcxprojdir)
+
+ -- and sources
+ filtersfile:enter("<ItemGroup>")
+ for _, sourcefile in ipairs(target:sourcefiles()) do
+ local filter = _make_filter(sourcefile, target, vcxprojdir)
+ if filter then
+ filtersfile:enter("<ClCompile Include=\"%s\">", path.relative(path.absolute(sourcefile), vcxprojdir))
+ filtersfile:print("<Filter>%s</Filter>", filter)
+ filtersfile:leave("</ClCompile>")
+ end
+ end
+ filtersfile:leave("</ItemGroup>")
+end
- -- add filters
- filtersfile:enter("<ItemGroup>")
- for sourceFile, _ in pairs(filters_list) do
- filtersfile:enter("<Filter Include=\"%s\">", sourceFile)
- filtersfile:print("<UniqueIdentifier>{%s}</UniqueIdentifier>", os.uuid())
- filtersfile:leave("</Filter>")
- end
- filtersfile:leave("</ItemGroup>")
+-- make headers
+function _make_headers(filtersfile, vsinfo, target, vcxprojdir)
+
+ -- and headers
+ filtersfile:enter("<ItemGroup>")
+ for _, headerfile in ipairs(target:headerfiles()) do
+ local filter = _make_filter(headerfile, target, vcxprojdir)
+ if filter then
+ filtersfile:enter("<ClInclude Include=\"%s\">", path.relative(path.absolute(headerfile), vcxprojdir))
+ filtersfile:print("<Filter>%s</Filter>", _make_filter(headerfile, target, vcxprojdir))
+ filtersfile:leave("</ClInclude>")
+ end
+ end
+ filtersfile:leave("</ItemGroup>")
end
-- main filters
function make(vsinfo, target)
- -- the target name
- local targetname = target:name()
+ -- the target name
+ local targetname = target:name()
+
+ -- the vcxproj directory
+ local vcxprojdir = path.join(vsinfo.solution_dir, targetname)
- -- the vcxproj directory
- local vcxprojdir = path.join(vsinfo.solution_dir, targetname)
+ -- open vcxproj.filters file
+ local filtersfile = vsfile.open(path.join(vcxprojdir, targetname .. ".vcxproj.filters"), "w")
- -- open vcxproj file
- local filtersfile = vsfile.open(path.join(vcxprojdir, targetname .. ".vcxproj.filters"), "w")
+ -- init indent character
+ vsfile.indentchar(' ')
+
+ -- make header
+ _make_header(filtersfile, vsinfo, target)
- -- init indent character
- vsfile.indentchar(' ')
+ -- make filters
+ _make_filters(filtersfile, vsinfo, target, vcxprojdir)
- -- make header
- _make_header(filtersfile, vsinfo, target)
+ -- make sources
+ _make_sources(filtersfile, vsinfo, target, vcxprojdir)
- -- make source list
- _make_source_list(filtersfile, vsinfo, target, vcxprojdir)
+ -- make headers
+ _make_headers(filtersfile, vsinfo, target, vcxprojdir)
- -- make tailer
- _make_tailer(filtersfile, vsinfo, target)
+ -- make tailer
+ _make_tailer(filtersfile, vsinfo, target)
- -- exit solution file
+ -- exit solution file
filtersfile:close()
end
|
