diff options
| author | ruki <[email protected]> | 2017-03-16 16:08:19 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2017-03-16 16:08:19 +0800 |
| commit | 831509cea9c280d0274b1d309f82b370be2c9a23 (patch) | |
| tree | b8aaafdf56e8eb28743c2e477954078072144801 | |
| parent | ac990329138fc0aa054f5da173b34bf29daa450b (diff) | |
add multi-modes and archs for vs201x project
| -rwxr-xr-x | xmake/plugins/project/vstudio/impl/vs201x.lua | 53 | ||||
| -rwxr-xr-x | xmake/plugins/project/vstudio/impl/vs201x_vcxproj.lua | 102 | ||||
| -rw-r--r-- | xmake/plugins/project/vstudio/impl/vs201x_vcxproj_filters.lua | 18 |
3 files changed, 111 insertions, 62 deletions
diff --git a/xmake/plugins/project/vstudio/impl/vs201x.lua b/xmake/plugins/project/vstudio/impl/vs201x.lua index 8d97bdaae..389152f01 100755 --- a/xmake/plugins/project/vstudio/impl/vs201x.lua +++ b/xmake/plugins/project/vstudio/impl/vs201x.lua @@ -26,6 +26,7 @@ import("core.base.option") import("core.project.config") import("core.project.project") +import("core.platform.platform") import("vs201x_solution") import("vs201x_vcxproj") import("vs201x_vcxproj_filters") @@ -53,11 +54,59 @@ function make(outputdir, vsinfo) vsinfo.modes = { config.mode() } end + -- load targets + 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 + + -- modify config + config.set("mode", mode) + config.set("arch", arch) + + -- recheck configure + config.check() + + -- recheck project options + project.check() + + -- reload platform + platform.load(config.plat()) + + -- reload project + project.load() + + -- ensure to enter project directory + os.cd(project.directory()) + + -- 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] + + -- 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 + end + end + end + -- make solution vs201x_solution.make(vsinfo) - -- make vsprojs - for _, target in pairs(project.targets()) do + -- make .vcxproj + for _, target in pairs(targets) do vs201x_vcxproj.make(vsinfo, target) vs201x_vcxproj_filters.make(vsinfo, target) end diff --git a/xmake/plugins/project/vstudio/impl/vs201x_vcxproj.lua b/xmake/plugins/project/vstudio/impl/vs201x_vcxproj.lua index 527540098..a8fc7fa1b 100755 --- a/xmake/plugins/project/vstudio/impl/vs201x_vcxproj.lua +++ b/xmake/plugins/project/vstudio/impl/vs201x_vcxproj.lua @@ -107,7 +107,7 @@ function _make_linkflags(target, vcxprojdir) end -- make header -function _make_header(vcxprojfile, vsinfo, target) +function _make_header(vcxprojfile, vsinfo) -- the versions local versions = @@ -125,7 +125,7 @@ function _make_header(vcxprojfile, vsinfo, target) end -- make tailer -function _make_tailer(vcxprojfile, vsinfo, target) +function _make_tailer(vcxprojfile, vsinfo) vcxprojfile:print("<Import Project=\"%$(VCTargetsPath)\\Microsoft.Cpp.targets\" />") vcxprojfile:enter("<ImportGroup Label=\"ExtensionTargets\">") vcxprojfile:leave("</ImportGroup>") @@ -136,7 +136,7 @@ end function _make_configurations(vcxprojfile, vsinfo, target, vcxprojdir) -- the target name - local targetname = target:name() + local targetname = target.name -- init configuration type local configuration_types = @@ -158,13 +158,11 @@ function _make_configurations(vcxprojfile, vsinfo, target, vcxprojdir) -- make ProjectConfigurations vcxprojfile:enter("<ItemGroup Label=\"ProjectConfigurations\">") - for _, mode in ipairs(vsinfo.modes) do - for _, arch in ipairs({"x86", "x64"}) do - vcxprojfile:enter("<ProjectConfiguration Include=\"%s|%s\">", mode, arch) - vcxprojfile:print("<Configuration>%s</Configuration>", mode) - vcxprojfile:print("<Platform>%s</Platform>", arch) - vcxprojfile:leave("</ProjectConfiguration>") - end + for _, targetinfo in ipairs(target.info) do + vcxprojfile:enter("<ProjectConfiguration Include=\"%s|%s\">", targetinfo.mode, targetinfo.arch) + vcxprojfile:print("<Configuration>%s</Configuration>", targetinfo.mode) + vcxprojfile:print("<Platform>%s</Platform>", targetinfo.arch) + vcxprojfile:leave("</ProjectConfiguration>") end vcxprojfile:leave("</ItemGroup>") @@ -178,14 +176,12 @@ function _make_configurations(vcxprojfile, vsinfo, target, vcxprojdir) vcxprojfile:print("<Import Project=\"%$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />") -- make Configuration - for _, mode in ipairs(vsinfo.modes) do - for _, arch in ipairs({"x86", "x64"}) do - vcxprojfile:enter("<PropertyGroup Condition=\"\'%$(Configuration)|%$(Platform)\'==\'%s|%s\'\" Label=\"Configuration\">", mode, arch) - vcxprojfile:print("<ConfigurationType>%s</ConfigurationType>", assert(configuration_types[target:get("kind")])) - vcxprojfile:print("<PlatformToolset>v%s</PlatformToolset>", assert(versions["vs" .. vsinfo.vstudio_version])) - vcxprojfile:print("<CharacterSet>MultiByte</CharacterSet>") - vcxprojfile:leave("</PropertyGroup>") - end + for _, targetinfo in ipairs(target.info) do + vcxprojfile:enter("<PropertyGroup Condition=\"\'%$(Configuration)|%$(Platform)\'==\'%s|%s\'\" Label=\"Configuration\">", targetinfo.mode, targetinfo.arch) + vcxprojfile:print("<ConfigurationType>%s</ConfigurationType>", assert(configuration_types[target.kind])) + vcxprojfile:print("<PlatformToolset>v%s</PlatformToolset>", assert(versions["vs" .. vsinfo.vstudio_version])) + vcxprojfile:print("<CharacterSet>MultiByte</CharacterSet>") + vcxprojfile:leave("</PropertyGroup>") end -- import Microsoft.Cpp.props @@ -196,34 +192,35 @@ function _make_configurations(vcxprojfile, vsinfo, target, vcxprojdir) vcxprojfile:leave("</ImportGroup>") -- make PropertySheets - for _, mode in ipairs(vsinfo.modes) do - for _, arch in ipairs({"x86", "x64"}) do - vcxprojfile:enter("<ImportGroup Condition=\"\'%$(Configuration)|%$(Platform)\'==\'%s|%s\'\" Label=\"PropertySheets\">", mode, arch) - vcxprojfile:print("<Import Project=\"%$(UserRootDir)\\Microsoft.Cpp.%$(Platform).user.props\" Condition=\"exists(\'%$(UserRootDir)\\Microsoft.Cpp.%$(Platform).user.props\')\" Label=\"LocalAppDataPlatform\" />") - vcxprojfile:leave("</ImportGroup>") - end + for _, targetinfo in ipairs(target.info) do + vcxprojfile:enter("<ImportGroup Condition=\"\'%$(Configuration)|%$(Platform)\'==\'%s|%s\'\" Label=\"PropertySheets\">", targetinfo.mode, targetinfo.arch) + vcxprojfile:print("<Import Project=\"%$(UserRootDir)\\Microsoft.Cpp.%$(Platform).user.props\" Condition=\"exists(\'%$(UserRootDir)\\Microsoft.Cpp.%$(Platform).user.props\')\" Label=\"LocalAppDataPlatform\" />") + vcxprojfile:leave("</ImportGroup>") end -- make UserMacros vcxprojfile:print("<PropertyGroup Label=\"UserMacros\" />") -- make OutputDirectory and IntermediateDirectory - vcxprojfile:enter("<PropertyGroup Condition=\"\'%$(Configuration)|%$(Platform)\'==\'$(mode)|Win32\'\">") - vcxprojfile:print("<OutDir>%s\\</OutDir>", path.relative(path.absolute(config.get("buildir")), vcxprojdir)) - vcxprojfile:print("<IntDir>%$(Configuration)\\</IntDir>") - if target:get("kind") == "binary" then - vcxprojfile:print("<LinkIncremental>true</LinkIncremental>") - end - vcxprojfile:leave("</PropertyGroup>") + for _, targetinfo in ipairs(target.info) do + vcxprojfile:enter("<PropertyGroup Condition=\"\'%$(Configuration)|%$(Platform)\'==\'%s|%s\'\">", targetinfo.mode, targetinfo.arch) + vcxprojfile:print("<OutDir>%s\\</OutDir>", path.relative(path.absolute(config.get("buildir")), vcxprojdir)) + vcxprojfile:print("<IntDir>%$(Configuration)\\</IntDir>") + if target.kind == "binary" then + vcxprojfile:print("<LinkIncremental>true</LinkIncremental>") + end + vcxprojfile:leave("</PropertyGroup>") + end end -- make ItemDefinitionGroup -function _make_item_define_group(vcxprojfile, vsinfo, target, vcxprojdir, mode, arch) +function _make_item_define_group(vcxprojfile, vsinfo, targetinfo, vcxprojdir) -- enter ItemDefinitionGroup - vcxprojfile:enter("<ItemDefinitionGroup Condition=\"\'%$(Configuration)|%$(Platform)\'==\'%s|%s\'\">", mode, arch) + vcxprojfile:enter("<ItemDefinitionGroup Condition=\"\'%$(Configuration)|%$(Platform)\'==\'%s|%s\'\">", targetinfo.mode, targetinfo.arch) -- for linker? + local target = targetinfo.target if target:get("kind") == "binary" then vcxprojfile:enter("<Link>") @@ -244,7 +241,7 @@ function _make_item_define_group(vcxprojfile, vsinfo, target, vcxprojdir, mode, vcxprojfile:print("<SubSystem>Console</SubSystem>") -- make TargetMachine - vcxprojfile:print("<TargetMachine>%s</TargetMachine>", ifelse(arch == "x64", "MachineX64", "MachineX86")) + vcxprojfile:print("<TargetMachine>%s</TargetMachine>", ifelse(targetinfo.arch == "x64", "MachineX64", "MachineX86")) vcxprojfile:leave("</Link>") end @@ -265,7 +262,10 @@ function _make_header_file(vcxprojfile, includefile, vcxprojdir) end -- make source file -function _make_source_file(vcxprojfile, vsinfo, target, sourcefile, objectfile, vcxprojdir, mode, arch) +function _make_source_file(vcxprojfile, vsinfo, targetinfo, sourcefile, objectfile, vcxprojdir) + + -- get target + local target = targetinfo.target -- get the target key local key = tostring(target) @@ -279,19 +279,22 @@ function _make_source_file(vcxprojfile, vsinfo, target, sourcefile, objectfile, -- add file vcxprojfile:enter("<ClCompile Include=\"%s\">", path.relative(path.absolute(sourcefile), vcxprojdir)) - vcxprojfile:print("<AdditionalOptions Condition=\"\'%$(Configuration)|%$(Platform)\'==\'%s|%s\'\">%s %%(AdditionalOptions)</AdditionalOptions>", mode, arch, flags) - vcxprojfile:print("<ObjectFileName Condition=\"\'%$(Configuration)|%$(Platform)\'==\'%s|%s\'\">%s</ObjectFileName>", mode, arch, path.relative(path.absolute(objectfile), 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)) -- complie as c++ if exists flag: /TP if flags:find("[%-|/]TP") then - vcxprojfile:print("<CompileAs Condition=\"\'%$(Configuration)|%$(Platform)\'==\'%s|%s\'\">CompileAsCpp</CompileAs>", mode, arch) + vcxprojfile:print("<CompileAs Condition=\"\'%$(Configuration)|%$(Platform)\'==\'%s|%s\'\">CompileAsCpp</CompileAs>", targetinfo.mode, targetinfo.arch) end vcxprojfile:leave("</ClCompile>") end -- make source files -function _make_source_files(vcxprojfile, vsinfo, target, vcxprojdir, mode, arch) +function _make_source_files(vcxprojfile, vsinfo, targetinfo, vcxprojdir) + + -- get target + local target = targetinfo.target -- enter ItemGroup vcxprojfile:enter("<ItemGroup>") @@ -299,7 +302,7 @@ function _make_source_files(vcxprojfile, vsinfo, target, vcxprojdir, mode, arch) -- add files local objectfiles = target:objectfiles() for idx, sourcefile in ipairs(target:sourcefiles()) do - _make_source_file(vcxprojfile, vsinfo, target, sourcefile, objectfiles[idx], vcxprojdir, mode, arch) + _make_source_file(vcxprojfile, vsinfo, targetinfo, sourcefile, objectfiles[idx], vcxprojdir) end vcxprojfile:leave("</ItemGroup>") @@ -318,7 +321,7 @@ end function make(vsinfo, target) -- the target name - local targetname = target:name() + local targetname = target.name -- the vcxproj directory local vcxprojdir = path.join(vsinfo.solution_dir, targetname) @@ -330,26 +333,23 @@ function make(vsinfo, target) vsfile.indentchar(' ') -- make header - _make_header(vcxprojfile, vsinfo, target) + _make_header(vcxprojfile, vsinfo) -- make Configurations _make_configurations(vcxprojfile, vsinfo, target, vcxprojdir) -- make compiler and linker options for the source files - for _, mode in ipairs(vsinfo.modes) do - for _, arch in ipairs({"x86", "x64"}) do + for _, targetinfo in ipairs(target.info) do - -- make ItemDefinitionGroup - _make_item_define_group(vcxprojfile, vsinfo, target, vcxprojdir, mode, arch) + -- make ItemDefinitionGroup + _make_item_define_group(vcxprojfile, vsinfo, targetinfo, vcxprojdir) - -- make source files - _make_source_files(vcxprojfile, vsinfo, target, vcxprojdir) - - end + -- make source files + _make_source_files(vcxprojfile, vsinfo, targetinfo, vcxprojdir) end -- make tailer - _make_tailer(vcxprojfile, vsinfo, target) + _make_tailer(vcxprojfile, vsinfo) -- exit solution file vcxprojfile:close() diff --git a/xmake/plugins/project/vstudio/impl/vs201x_vcxproj_filters.lua b/xmake/plugins/project/vstudio/impl/vs201x_vcxproj_filters.lua index b96339f58..c10137303 100644 --- a/xmake/plugins/project/vstudio/impl/vs201x_vcxproj_filters.lua +++ b/xmake/plugins/project/vstudio/impl/vs201x_vcxproj_filters.lua @@ -27,7 +27,7 @@ import("core.tool.compiler") import("vsfile")
-- make header
-function _make_header(filtersfile, vsinfo, target)
+function _make_header(filtersfile, vsinfo)
-- the versions
local versions =
@@ -45,7 +45,7 @@ function _make_header(filtersfile, vsinfo, target) end
-- make tailer
-function _make_tailer(filtersfile, vsinfo, target)
+function _make_tailer(filtersfile, vsinfo)
filtersfile:leave("</Project>")
end
@@ -53,7 +53,7 @@ end function _make_filter(filepath, target, vcxprojdir)
-- make filter
- local filter = path.relative(path.absolute(path.directory(filepath)), target:scriptdir() or vcxprojdir)
+ local filter = path.relative(path.absolute(path.directory(filepath)), target.scriptdir or vcxprojdir)
-- is '.'? no filter
if filter and filter == '.' then
@@ -70,7 +70,7 @@ 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
+ for _, filepath in pairs(table.join(target.sourcefiles, target.headerfiles)) do
local filter = _make_filter(filepath, target, vcxprojdir)
while filter and filter ~= '.' do
if not exists[filter] then
@@ -90,7 +90,7 @@ function _make_sources(filtersfile, vsinfo, target, vcxprojdir) -- and sources
filtersfile:enter("<ItemGroup>")
- for _, sourcefile in ipairs(target:sourcefiles()) do
+ 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))
@@ -106,7 +106,7 @@ function _make_headers(filtersfile, vsinfo, target, vcxprojdir) -- and headers
filtersfile:enter("<ItemGroup>")
- for _, headerfile in ipairs(target:headerfiles()) do
+ 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))
@@ -121,7 +121,7 @@ end function make(vsinfo, target)
-- the target name
- local targetname = target:name()
+ local targetname = target.name
-- the vcxproj directory
local vcxprojdir = path.join(vsinfo.solution_dir, targetname)
@@ -133,7 +133,7 @@ function make(vsinfo, target) vsfile.indentchar(' ')
-- make header
- _make_header(filtersfile, vsinfo, target)
+ _make_header(filtersfile, vsinfo)
-- make filters
_make_filters(filtersfile, vsinfo, target, vcxprojdir)
@@ -145,7 +145,7 @@ function make(vsinfo, target) _make_headers(filtersfile, vsinfo, target, vcxprojdir)
-- make tailer
- _make_tailer(filtersfile, vsinfo, target)
+ _make_tailer(filtersfile, vsinfo)
-- exit solution file
filtersfile:close()
|
