summaryrefslogtreecommitdiff
path: root/xmake
diff options
context:
space:
mode:
authorruki <[email protected]>2017-03-20 00:17:34 +0800
committerruki <[email protected]>2017-03-20 00:17:34 +0800
commit3efb4e5bb65e0d39f2f3571ca0eaaf76c8af8cc7 (patch)
tree561817552fd6dedbfc7ea6cff571acec34dd1554 /xmake
parentfb83e4e10d99bb6d7b95898dee0ef8b6b5024896 (diff)
optimize vs201x project plugin
Diffstat (limited to 'xmake')
-rw-r--r--[-rwxr-xr-x]xmake/plugins/project/vstudio/impl/vs201x_vcxproj.lua163
-rw-r--r--xmake/tools/cl.lua3
2 files changed, 130 insertions, 36 deletions
diff --git a/xmake/plugins/project/vstudio/impl/vs201x_vcxproj.lua b/xmake/plugins/project/vstudio/impl/vs201x_vcxproj.lua
index 2fc5058c0..fcb41cf11 100755..100644
--- a/xmake/plugins/project/vstudio/impl/vs201x_vcxproj.lua
+++ b/xmake/plugins/project/vstudio/impl/vs201x_vcxproj.lua
@@ -36,13 +36,13 @@ function _make_compflags(sourcefile, targetinfo, vcxprojdir)
-- switch to the given mode and arch
config.set("mode", targetinfo.mode)
- config.set("arch", targetinfo.arch)
+ config.set("arch", ifelse(targetinfo.arch == "Win32", "x86", "x64"))
- -- replace -Idir or /Idir, -Fdsymbol.pdb or /Fdsymbol.pdb
+ -- translate path for -Idir or /Idir, -Fdsymbol.pdb or /Fdsymbol.pdb
local flags = {}
for _, flag in ipairs(compflags) do
- -- replace -Idir or /Idir
+ -- -Idir or /Idir
flag = flag:gsub("[%-|/]I(.*)", function (dir)
dir = dir:trim()
if not path.is_absolute(dir) then
@@ -51,7 +51,7 @@ function _make_compflags(sourcefile, targetinfo, vcxprojdir)
return "/I" .. dir
end)
- -- replace -Fdsymbol.pdb or /Fdsymbol.pdb
+ -- -Fdsymbol.pdb or /Fdsymbol.pdb
flag = flag:gsub("[%-|/]Fd(.*)", function (dir)
dir = dir:trim()
if not path.is_absolute(dir) then
@@ -64,9 +64,6 @@ function _make_compflags(sourcefile, targetinfo, vcxprojdir)
table.insert(flags, flag)
end
- -- concat flags
- flags = table.concat(flags, " "):trim()
-
-- ok?
return flags
end
@@ -76,7 +73,7 @@ function _make_linkflags(targetinfo, vcxprojdir)
-- switch to the given mode and arch
config.set("mode", targetinfo.mode)
- config.set("arch", targetinfo.arch)
+ config.set("arch", ifelse(targetinfo.arch == "Win32", "x86", "x64"))
-- make the linking flags
local _, linkflags = linker.linkflags(targetinfo.target)
@@ -107,9 +104,6 @@ function _make_linkflags(targetinfo, vcxprojdir)
table.insert(flags, flag)
end
- -- concat flags
- flags = table.concat(flags, " "):trim()
-
-- ok?
return flags
end
@@ -231,8 +225,8 @@ function _make_configurations(vcxprojfile, vsinfo, target, vcxprojdir)
end
end
--- make link item
-function _make_link_item(vcxprojfile, vsinfo, targetinfo, vcxprojdir)
+-- make common item
+function _make_common_item(vcxprojfile, vsinfo, targetinfo, vcxprojdir)
-- enter ItemDefinitionGroup
vcxprojfile:enter("<ItemDefinitionGroup Condition=\"\'%$(Configuration)|%$(Platform)\'==\'%s|%s\'\">", targetinfo.mode, targetinfo.arch)
@@ -241,8 +235,11 @@ function _make_link_item(vcxprojfile, vsinfo, targetinfo, vcxprojdir)
if targetinfo.kind == "binary" then
vcxprojfile:enter("<Link>")
+ -- make linker flags
+ local flags = table.concat(_make_linkflags(targetinfo, vcxprojdir), " "):trim()
+
-- make AdditionalOptions
- vcxprojfile:print("<AdditionalOptions>%s %%(AdditionalOptions)</AdditionalOptions>", _make_linkflags(targetinfo, vcxprojdir))
+ vcxprojfile:print("<AdditionalOptions>%s %%(AdditionalOptions)</AdditionalOptions>", flags)
-- generate debug infomation?
local debug = false
@@ -265,18 +262,91 @@ function _make_link_item(vcxprojfile, vsinfo, targetinfo, vcxprojdir)
-- for compiler?
vcxprojfile:enter("<ClCompile>")
- vcxprojfile:print("<Optimization>Disabled</Optimization>") -- disable optimization default
- vcxprojfile:print("<ProgramDataBaseFileName></ProgramDataBaseFileName>") -- disable pdb file default
+
+ -- get compiler flags
+ local flags = table.concat(targetinfo.commonflags, " "):trim()
+
+ -- make AdditionalOptions
+ vcxprojfile:print("<AdditionalOptions>%s %%(AdditionalOptions)</AdditionalOptions>", flags)
+
+ -- make Optimization
+ if flags:find("[%-|/]Od") then
+ vcxprojfile:print("<Optimization>Disabled</Optimization>")
+ elseif flags:find("[%-|/]Os") or flags:find("[%-|/]O1") then
+ vcxprojfile:print("<Optimization>MinSpace</Optimization>")
+ elseif flags:find("[%-|/]O2") or flags:find("[%-|/]Ot") then
+ vcxprojfile:print("<Optimization>MaxSpeed</Optimization>")
+ elseif flags:find("[%-|/]Ox") then
+ vcxprojfile:print("<Optimization>Full</Optimization>")
+ end
+
+ -- make ProgramDataBaseFileName (default: empty)
+ vcxprojfile:print("<ProgramDataBaseFileName></ProgramDataBaseFileName>")
+
+ -- complie as c++ if exists flag: /TP
+ if flags:find("[%-|/]TP") then
+ vcxprojfile:print("<CompileAs>CompileAsCpp</CompileAs>")
+ end
vcxprojfile:leave("</ClCompile>")
-- leave ItemDefinitionGroup
vcxprojfile:leave("</ItemDefinitionGroup>")
end
--- make link items
-function _make_link_items(vcxprojfile, vsinfo, target, vcxprojdir)
+-- make common items
+function _make_common_items(vcxprojfile, vsinfo, target, vcxprojdir)
+
+ -- for each mode and arch
for _, targetinfo in ipairs(target.info) do
- _make_link_item(vcxprojfile, vsinfo, targetinfo, vcxprojdir)
+
+ -- make source flags
+ local flags_stats = {}
+ local files_count = 0
+ local first_flags = nil
+ targetinfo.sourceflags = {}
+ for _, sourcefile in ipairs(targetinfo.target:sourcefiles()) do
+
+ -- make compiler flags
+ local flags = _make_compflags(sourcefile, targetinfo, vcxprojdir)
+ for _, flag in ipairs(flags) do
+ flags_stats[flag] = (flags_stats[flag] or 0) + 1
+ end
+
+ -- update files count
+ files_count = files_count + 1
+
+ -- save first flags
+ if first_flags == nil then
+ first_flags = flags
+ end
+
+ -- save source flags
+ targetinfo.sourceflags[sourcefile] = flags
+ end
+
+ -- make common flags
+ targetinfo.commonflags = {}
+ for _, flag in ipairs(first_flags) do
+ if flags_stats[flag] == files_count then
+ table.insert(targetinfo.commonflags, flag)
+ end
+ end
+
+ -- remove common flags from source flags
+ local sourceflags = {}
+ for sourcefile, flags in pairs(targetinfo.sourceflags) do
+ local otherflags = {}
+ for _, flag in ipairs(flags) do
+ if flags_stats[flag] ~= files_count then
+ table.insert(otherflags, flag)
+ end
+ end
+ sourceflags[sourcefile] = otherflags
+ end
+ targetinfo.sourceflags = sourceflags
+
+ -- make common item
+ _make_common_item(vcxprojfile, vsinfo, targetinfo, vcxprojdir)
end
end
@@ -288,20 +358,41 @@ end
-- make source file
function _make_source_file(vcxprojfile, vsinfo, sourcefile, sourceinfo, vcxprojdir)
+ -- no AdditionalOptions?
+ local additional = false
+ local objectfile = nil
+ for _, info in ipairs(sourceinfo) do
+ if table.concat(info.flags, " "):trim() ~= "" or (objectfile and info.objectfile ~= objectfile) then
+ additional = true
+ break
+ end
+ objectfile = info.objectfile
+ end
+
-- add source file
vcxprojfile:enter("<ClCompile Include=\"%s\">", path.relative(path.absolute(sourcefile), vcxprojdir))
- for _, info in ipairs(sourceinfo) do
+ if additional then
+ for _, info in ipairs(sourceinfo) do
- -- add compiler flags
- vcxprojfile:print("<AdditionalOptions Condition=\"\'%$(Configuration)|%$(Platform)\'==\'%s|%s\'\">%s %%(AdditionalOptions)</AdditionalOptions>", info.mode, info.arch, info.flags)
+ -- get source flags
+ local flags = table.concat(info.flags, " "):trim()
- -- add object file
- vcxprojfile:print("<ObjectFileName Condition=\"\'%$(Configuration)|%$(Platform)\'==\'%s|%s\'\">%s</ObjectFileName>", info.mode, info.arch, path.relative(path.absolute(info.objectfile), vcxprojdir))
+ -- make AdditionalOptions
+ if flags ~= "" then
+ vcxprojfile:print("<AdditionalOptions Condition=\"\'%$(Configuration)|%$(Platform)\'==\'%s|%s\'\">%s %%(AdditionalOptions)</AdditionalOptions>", info.mode, info.arch, flags)
+ end
+
+ -- make ObjectFileName
+ vcxprojfile:print("<ObjectFileName Condition=\"\'%$(Configuration)|%$(Platform)\'==\'%s|%s\'\">%s</ObjectFileName>", info.mode, info.arch, path.relative(path.absolute(info.objectfile), vcxprojdir))
- -- complie as c++ if exists flag: /TP
- if info.flags:find("[%-|/]TP") then
- vcxprojfile:print("<CompileAs Condition=\"\'%$(Configuration)|%$(Platform)\'==\'%s|%s\'\">CompileAsCpp</CompileAs>", info.mode, info.arch)
+ -- complie as c++ if exists flag: /TP
+ if flags:find("[%-|/]TP") then
+ vcxprojfile:print("<CompileAs Condition=\"\'%$(Configuration)|%$(Platform)\'==\'%s|%s\'\">CompileAsCpp</CompileAs>", info.mode, info.arch)
+ end
end
+ else
+ -- make ObjectFileName
+ vcxprojfile:print("<ObjectFileName>%s</ObjectFileName>", path.relative(path.absolute(objectfile), vcxprojdir))
end
vcxprojfile:leave("</ClCompile>")
end
@@ -315,12 +406,14 @@ function _make_source_files(vcxprojfile, vsinfo, target, vcxprojdir)
-- make source file infos
local sourceinfos = {}
for _, targetinfo in ipairs(target.info) do
- local objectfiles = targetinfo.target:objectfiles()
- for idx, sourcefile in ipairs(targetinfo.target:sourcefiles()) do
- local objectfile = objectfiles[idx]
- local flags = _make_compflags(sourcefile, targetinfo, vcxprojdir)
- sourceinfos[sourcefile] = sourceinfos[sourcefile] or {}
- table.insert(sourceinfos[sourcefile], {mode = targetinfo.mode, arch = targetinfo.arch, objectfile = objectfile, flags = flags})
+ for _, sourcebatch in pairs(targetinfo.target:sourcebatches()) do
+ local objectfiles = sourcebatch.objectfiles
+ for idx, sourcefile in ipairs(sourcebatch.sourcefiles) do
+ local objectfile = objectfiles[idx]
+ local flags = targetinfo.sourceflags[sourcefile]
+ sourceinfos[sourcefile] = sourceinfos[sourcefile] or {}
+ table.insert(sourceinfos[sourcefile], {mode = targetinfo.mode, arch = targetinfo.arch, objectfile = objectfile, flags = flags})
+ end
end
end
@@ -362,8 +455,8 @@ function make(vsinfo, target)
-- make Configurations
_make_configurations(vcxprojfile, vsinfo, target, vcxprojdir)
- -- make link items
- _make_link_items(vcxprojfile, vsinfo, target, vcxprojdir)
+ -- make common items
+ _make_common_items(vcxprojfile, vsinfo, target, vcxprojdir)
-- make source files
_make_source_files(vcxprojfile, vsinfo, target, vcxprojdir)
diff --git a/xmake/tools/cl.lua b/xmake/tools/cl.lua
index 3986fac90..591e40f7d 100644
--- a/xmake/tools/cl.lua
+++ b/xmake/tools/cl.lua
@@ -23,6 +23,7 @@
--
-- imports
+import("core.project.config")
import("core.project.project")
-- init it
@@ -196,7 +197,7 @@ function nf_language(stdname)
-- select maps
local maps = cmaps
- if _g.kind == "cxx" or _g.kind == "mxx" then
+ if _g.kind == "cxx" or _g.kind == "mxx" or config.get("vs") >= "2015" then
maps = {}
end