summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2017-03-16 16:08:19 +0800
committerruki <[email protected]>2017-03-16 16:08:19 +0800
commit831509cea9c280d0274b1d309f82b370be2c9a23 (patch)
treeb8aaafdf56e8eb28743c2e477954078072144801
parentac990329138fc0aa054f5da173b34bf29daa450b (diff)
add multi-modes and archs for vs201x project
-rwxr-xr-xxmake/plugins/project/vstudio/impl/vs201x.lua53
-rwxr-xr-xxmake/plugins/project/vstudio/impl/vs201x_vcxproj.lua102
-rw-r--r--xmake/plugins/project/vstudio/impl/vs201x_vcxproj_filters.lua18
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()