diff options
Diffstat (limited to 'xmake/plugins')
| -rwxr-xr-x | xmake/plugins/project/vstudio/impl/vs201x.lua | 40 | ||||
| -rwxr-xr-x | xmake/plugins/project/vstudio/impl/vs201x_vcxproj.lua | 81 |
2 files changed, 61 insertions, 60 deletions
diff --git a/xmake/plugins/project/vstudio/impl/vs201x.lua b/xmake/plugins/project/vstudio/impl/vs201x.lua index 389152f01..ce20ae182 100755 --- a/xmake/plugins/project/vstudio/impl/vs201x.lua +++ b/xmake/plugins/project/vstudio/impl/vs201x.lua @@ -58,6 +58,7 @@ function make(outputdir, vsinfo) local targets = {} for _, mode in ipairs(vsinfo.modes) do for _, arch in ipairs({"x86", "x64"}) do + -- reload config, project and platform if mode ~= config.mode() or arch ~= config.arch() then @@ -65,39 +66,36 @@ function make(outputdir, vsinfo) config.set("mode", mode) config.set("arch", arch) - -- recheck configure - config.check() - -- recheck project options - project.check() + project.check(true) -- reload platform platform.load(config.plat()) -- reload project project.load() + end - -- ensure to enter project directory - os.cd(project.directory()) + -- ensure to enter project directory + os.cd(project.directory()) - -- save targets - for targetname, target in pairs(project.targets()) do + -- save targets + for targetname, target in pairs(project.targets()) do - -- make target with the given mode and arch - targets[targetname] = targets[targetname] or {} - local _target = targets[targetname] + -- make target with the given mode and arch + targets[targetname] = targets[targetname] or {} + local _target = targets[targetname] - -- init target info - _target.name = targetname - _target.kind = target:get("kind") - _target.scriptdir = scriptdir - _target.info = _target.info or {} - table.insert(_target.info, { mode = mode, arch = arch, target = target }) + -- init target info + _target.name = targetname + _target.kind = target:get("kind") + _target.scriptdir = scriptdir + _target.info = _target.info or {} + table.insert(_target.info, { mode = mode, arch = arch, target = target }) - -- 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()))) - end + -- 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()))) end end end diff --git a/xmake/plugins/project/vstudio/impl/vs201x_vcxproj.lua b/xmake/plugins/project/vstudio/impl/vs201x_vcxproj.lua index a8fc7fa1b..3bae5607d 100755 --- a/xmake/plugins/project/vstudio/impl/vs201x_vcxproj.lua +++ b/xmake/plugins/project/vstudio/impl/vs201x_vcxproj.lua @@ -213,8 +213,8 @@ function _make_configurations(vcxprojfile, vsinfo, target, vcxprojdir) end end --- make ItemDefinitionGroup -function _make_item_define_group(vcxprojfile, vsinfo, targetinfo, vcxprojdir) +-- make link item +function _make_link_item(vcxprojfile, vsinfo, targetinfo, vcxprojdir) -- enter ItemDefinitionGroup vcxprojfile:enter("<ItemDefinitionGroup Condition=\"\'%$(Configuration)|%$(Platform)\'==\'%s|%s\'\">", targetinfo.mode, targetinfo.arch) @@ -256,53 +256,60 @@ function _make_item_define_group(vcxprojfile, vsinfo, targetinfo, vcxprojdir) vcxprojfile:leave("</ItemDefinitionGroup>") end +-- make link items +function _make_link_items(vcxprojfile, vsinfo, target, vcxprojdir) + for _, targetinfo in ipairs(target.info) do + _make_link_item(vcxprojfile, vsinfo, targetinfo, vcxprojdir) + end +end + -- make header file function _make_header_file(vcxprojfile, includefile, vcxprojdir) vcxprojfile:print("<ClInclude Include=\"%s\" />", path.relative(path.absolute(includefile), vcxprojdir)) end -- make source file -function _make_source_file(vcxprojfile, vsinfo, targetinfo, sourcefile, objectfile, vcxprojdir) - - -- get target - local target = targetinfo.target +function _make_source_file(vcxprojfile, vsinfo, sourcefile, sourceinfo, vcxprojdir) - -- get the target key - local key = tostring(target) - - -- make flags cache - _g.flags = _g.flags or {} + -- add source file + vcxprojfile:enter("<ClCompile Include=\"%s\">", path.relative(path.absolute(sourcefile), vcxprojdir)) + for _, info in ipairs(sourceinfo) do - -- make flags - local flags = _g.flags[key] or _make_compflags(sourcefile, target, vcxprojdir) - _g.flags[key] = flags + -- add compiler flags + vcxprojfile:print("<AdditionalOptions Condition=\"\'%$(Configuration)|%$(Platform)\'==\'%s|%s\'\">%s %%(AdditionalOptions)</AdditionalOptions>", info.mode, info.arch, info.flags) - -- add file - vcxprojfile:enter("<ClCompile Include=\"%s\">", path.relative(path.absolute(sourcefile), vcxprojdir)) - vcxprojfile:print("<AdditionalOptions Condition=\"\'%$(Configuration)|%$(Platform)\'==\'%s|%s\'\">%s %%(AdditionalOptions)</AdditionalOptions>", targetinfo.mode, targetinfo.arch, flags) - vcxprojfile:print("<ObjectFileName Condition=\"\'%$(Configuration)|%$(Platform)\'==\'%s|%s\'\">%s</ObjectFileName>", targetinfo.mode, targetinfo.arch, path.relative(path.absolute(objectfile), vcxprojdir)) + -- add object file + 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 flags:find("[%-|/]TP") then - vcxprojfile:print("<CompileAs Condition=\"\'%$(Configuration)|%$(Platform)\'==\'%s|%s\'\">CompileAsCpp</CompileAs>", targetinfo.mode, targetinfo.arch) + -- 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) + end end - vcxprojfile:leave("</ClCompile>") end -- make source files -function _make_source_files(vcxprojfile, vsinfo, targetinfo, vcxprojdir) - - -- get target - local target = targetinfo.target +function _make_source_files(vcxprojfile, vsinfo, target, vcxprojdir) -- enter ItemGroup vcxprojfile:enter("<ItemGroup>") - -- add files - local objectfiles = target:objectfiles() - for idx, sourcefile in ipairs(target:sourcefiles()) do - _make_source_file(vcxprojfile, vsinfo, targetinfo, sourcefile, objectfiles[idx], 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.target, vcxprojdir) + sourceinfos[sourcefile] = sourceinfos[sourcefile] or {} + table.insert(sourceinfos[sourcefile], {mode = targetinfo.mode, arch = targetinfo.arch, objectfile = objectfile, flags = flags}) + end + end + + -- make source files + for sourcefile, sourceinfo in pairs(sourceinfos) do + _make_source_file(vcxprojfile, vsinfo, sourcefile, sourceinfo, vcxprojdir) end vcxprojfile:leave("</ItemGroup>") @@ -311,7 +318,7 @@ function _make_source_files(vcxprojfile, vsinfo, targetinfo, vcxprojdir) vcxprojfile:enter("<ItemGroup>") -- add headers - for _, includefile in ipairs(target:headerfiles()) do + for _, includefile in ipairs(target.headerfiles) do _make_header_file(vcxprojfile, includefile, vcxprojdir) end vcxprojfile:leave("</ItemGroup>") @@ -338,15 +345,11 @@ function make(vsinfo, target) -- make Configurations _make_configurations(vcxprojfile, vsinfo, target, vcxprojdir) - -- make compiler and linker options for the source files - for _, targetinfo in ipairs(target.info) do - - -- make ItemDefinitionGroup - _make_item_define_group(vcxprojfile, vsinfo, targetinfo, vcxprojdir) + -- make link items + _make_link_items(vcxprojfile, vsinfo, target, vcxprojdir) - -- make source files - _make_source_files(vcxprojfile, vsinfo, targetinfo, vcxprojdir) - end + -- make source files + _make_source_files(vcxprojfile, vsinfo, target, vcxprojdir) -- make tailer _make_tailer(vcxprojfile, vsinfo) |
