From ce0b97dd29e0cf29b81f4fbef51b64ad925ffdf4 Mon Sep 17 00:00:00 2001 From: ruki Date: Tue, 21 Mar 2017 16:13:51 +0800 Subject: merge vs201x flags for mode and arch --- .../project/vstudio/impl/vs201x_vcxproj.lua | 93 ++++++++++++++++++---- 1 file changed, 78 insertions(+), 15 deletions(-) diff --git a/xmake/plugins/project/vstudio/impl/vs201x_vcxproj.lua b/xmake/plugins/project/vstudio/impl/vs201x_vcxproj.lua index 2da7da53c..5b1c8c43e 100644 --- a/xmake/plugins/project/vstudio/impl/vs201x_vcxproj.lua +++ b/xmake/plugins/project/vstudio/impl/vs201x_vcxproj.lua @@ -393,32 +393,91 @@ function _make_header_file(vcxprojfile, includefile, vcxprojdir) vcxprojfile:print("", path.relative(path.absolute(includefile), vcxprojdir)) end --- make source file -function _make_source_file(vcxprojfile, vsinfo, sourcefile, sourceinfo, vcxprojdir) +-- make source file for all modes +function _make_source_file_forall(vcxprojfile, vsinfo, sourcefile, sourceinfo, vcxprojdir) + + -- get object file + local objectfile = nil + for _, info in ipairs(sourceinfo) do + objectfile = info.objectfile + break + end - -- add source file + -- enter it vcxprojfile:enter("", path.relative(path.absolute(sourcefile), vcxprojdir)) - for _, info in ipairs(sourceinfo) do - -- get source flags - local flags = table.concat(info.flags, " "):trim() + -- make ObjectFileName + vcxprojfile:print("%s", path.relative(path.absolute(objectfile), vcxprojdir)) - -- make AdditionalOptions + -- make AdditionalOptions + local mergeflags = {} + for _, info in ipairs(sourceinfo) do + local flags = table.concat(info.flags, " "):trim() if flags ~= "" then - vcxprojfile:print("%s %%(AdditionalOptions)", info.mode, info.arch, flags) + mergeflags[flags] = mergeflags[flags] or {} + mergeflags[flags][info.mode .. '|' .. info.arch] = true + end + end + for flags, mergeinfos in pairs(mergeflags) do + + -- merge mode and arch first + local count = 0 + for _, mode in ipairs(vsinfo.modes) do + if mergeinfos[mode .. "|Win32"] and mergeinfos[mode .. "|x64"] then + mergeinfos[mode .. "|Win32"] = nil + mergeinfos[mode .. "|x64"] = nil + mergeinfos[mode] = true + end + if mergeinfos[mode] then + count = count + 1 + end end - -- make ObjectFileName - vcxprojfile:print("%s", info.mode, info.arch, path.relative(path.absolute(info.objectfile), vcxprojdir)) - - -- complie as c++ if exists flag: /TP - if flags:find("[%-|/]TP") then - vcxprojfile:print("CompileAsCpp", info.mode, info.arch) + -- all modes and archs exist? + if count == #vsinfo.modes then + vcxprojfile:print("%s %%(AdditionalOptions)", flags) + else + for cond, _ in pairs(mergeinfos) do + if cond:find('|', 1, true) then + -- for mode | arch + vcxprojfile:print("%s %%(AdditionalOptions)", cond, flags) + else + -- only for mode + vcxprojfile:print("%s %%(AdditionalOptions)", cond, flags) + end + end end end + + -- leave it vcxprojfile:leave("") end +-- make source file for specific modes +function _make_source_file_forspec(vcxprojfile, vsinfo, sourcefile, sourceinfo, vcxprojdir) + + -- add source file + for _, info in ipairs(sourceinfo) do + + -- enter it + vcxprojfile:enter("", info.mode, info.arch, path.relative(path.absolute(sourcefile), vcxprojdir)) + + -- make ObjectFileName + vcxprojfile:print("%s", path.relative(path.absolute(info.objectfile), vcxprojdir)) + + -- get source flags + local flags = table.concat(info.flags, " "):trim() + + -- make AdditionalOptions + if flags ~= "" then + vcxprojfile:print("%s %%(AdditionalOptions)", flags) + end + + -- leave it + vcxprojfile:leave("") + end +end + -- make source files function _make_source_files(vcxprojfile, vsinfo, target, vcxprojdir) @@ -441,7 +500,11 @@ function _make_source_files(vcxprojfile, vsinfo, target, vcxprojdir) -- make source files for sourcefile, sourceinfo in pairs(sourceinfos) do - _make_source_file(vcxprojfile, vsinfo, sourcefile, sourceinfo, vcxprojdir) + if #sourceinfo == #target.info then + _make_source_file_forall(vcxprojfile, vsinfo, sourcefile, sourceinfo, vcxprojdir) + else + _make_source_file_forspec(vcxprojfile, vsinfo, sourcefile, sourceinfo, vcxprojdir) + end end vcxprojfile:leave("") -- cgit v1.3.1