summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2018-09-03 15:22:51 +0800
committerGitHub <[email protected]>2018-09-03 15:22:51 +0800
commitda9fbc4a72b996aab4e959fd524c210433aa4add (patch)
treea2f201607c06904f67cb92436728ac4287ad4fc5
parentd8639b6713432cffe9f03bb12d83fc074ac54d7d (diff)
parent9ee12112e49db451a49a66d77dd2990d9f6ddab9 (diff)
Merge pull request #210 from xigalto/dev
vsproject add some configs to support UNICODE/subsystem
-rw-r--r--xmake/plugins/project/vstudio/impl/vs200x_vcproj.lua54
-rw-r--r--xmake/plugins/project/vstudio/impl/vs201x.lua13
-rw-r--r--xmake/plugins/project/vstudio/impl/vs201x_vcxproj.lua14
3 files changed, 72 insertions, 9 deletions
diff --git a/xmake/plugins/project/vstudio/impl/vs200x_vcproj.lua b/xmake/plugins/project/vstudio/impl/vs200x_vcproj.lua
index d1dd0d06e..393c3d43e 100644
--- a/xmake/plugins/project/vstudio/impl/vs200x_vcproj.lua
+++ b/xmake/plugins/project/vstudio/impl/vs200x_vcproj.lua
@@ -180,10 +180,22 @@ end
-- WarningLevel="3"
-- DebugInformationFormat="4"
-- />
-function _make_VCCLCompilerTool(vcprojfile, vsinfo, target)
+function _make_VCCLCompilerTool(vcprojfile, vsinfo, target, compflags)
vcprojfile:enter("<Tool")
vcprojfile:print("Name=\"VCCLCompilerTool\"")
vcprojfile:print("ProgramDataBaseFileName=\"\"") -- disable pdb file default
+ -- MT:0, MTd:1, MD:2, MDd:3, ML:4, MLd:5
+ local runtime = 0
+ for _,flag in pairs(compflags) do
+ if flag:find("[%-|/]MD") then
+ runtime = 2
+ break
+ elseif flag:find("[%-|/]MT") then
+ runtime = 0
+ break
+ end
+ end
+ vcprojfile:print("RuntimeLibrary=\"%d\"", ifelse(val("mode") == "debug", runtime + 1, runtime))
vcprojfile:leave("/>")
end
@@ -219,15 +231,22 @@ function _make_VCLinkerTool(vcprojfile, vsinfo, target, vcprojdir)
end
end
+ -- subsystem, console: 1, windows: 2
+ local subsystem = 1
+ local flags = _make_linkflags(target, vcprojdir)
+ if flags:lower():find("[%-/]subsystem:windows") then
+ subsystem = 2
+ end
+
-- make it
vcprojfile:enter("<Tool")
vcprojfile:print("Name=\"VCLinkerTool\"")
- vcprojfile:print("AdditionalOptions=\"%s\"", _make_linkflags(target, vcprojdir))
+ vcprojfile:print("AdditionalOptions=\"%s\"", flags)
vcprojfile:print("AdditionalDependencies=\"\"")
vcprojfile:print("AdditionalLibraryDirectories=\"\"")
vcprojfile:print("LinkIncremental=\"2\"") -- enable: 2, disable: 1
vcprojfile:print("GenerateDebugInformation=\"%s\"", tostring(debug))
- vcprojfile:print("SubSystem=\"1\"") -- console: 1, windows: 2
+ vcprojfile:print("SubSystem=\"%d\"", subsystem) -- console: 1, windows: 2
vcprojfile:print("TargetMachine=\"%d\"", ifelse(config.arch() == "x64", 17, 1))
vcprojfile:leave("/>")
end
@@ -243,6 +262,31 @@ function _make_configurations(vcprojfile, vsinfo, target, vcprojdir)
, static = 4
}
+ -- save compiler flags
+ local compflags=nil
+ for sourcekind, sourcebatch in pairs(target:sourcebatches()) do
+ if not sourcebatch.rulename then
+ for _, sourcefile in ipairs(sourcebatch.sourcefiles) do
+ local flags = compiler.compflags(sourcefile, {target = target})
+ if sourcekind == "cc" or sourcekind == "cxx" then
+ compflags = flags
+ break
+ end
+ end
+ end
+ if compflags then
+ break
+ end
+ end
+
+ -- set unicode
+ local unicode = false
+ for _, flag in pairs(compflags) do
+ if flag:find("[%-|/]DUNICODE") then
+ unicode = true
+ end
+ end
+
-- enter configurations
vcprojfile:enter("<Configurations>")
@@ -252,7 +296,7 @@ function _make_configurations(vcprojfile, vsinfo, target, vcprojdir)
vcprojfile:print("OutputDirectory=\"%s\"", path.relative(path.absolute(target:targetdir()), vcprojdir))
vcprojfile:print("IntermediateDirectory=\"%s\"", path.relative(path.absolute(target:objectdir()), vcprojdir))
vcprojfile:print("ConfigurationType=\"%d\"", assert(configuration_types[target:get("kind")]))
- vcprojfile:print("CharacterSet=\"2\"") -- mbc: 2, wcs: 1
+ vcprojfile:print("CharacterSet=\"%d\"", ifelse(unicode, 1, 2)) -- mbc: 2, wcs: 1
vcprojfile:print(">")
-- make VCPreBuildEventTool
@@ -281,7 +325,7 @@ function _make_configurations(vcprojfile, vsinfo, target, vcprojdir)
vcprojfile:leave("/>")
-- make VCCLCompilerTool
- _make_VCCLCompilerTool(vcprojfile, vsinfo, target)
+ _make_VCCLCompilerTool(vcprojfile, vsinfo, target, compflags)
-- make VCManagedResourceCompilerTool
vcprojfile:enter("<Tool")
diff --git a/xmake/plugins/project/vstudio/impl/vs201x.lua b/xmake/plugins/project/vstudio/impl/vs201x.lua
index 8ef5681d2..65c4d1d2a 100644
--- a/xmake/plugins/project/vstudio/impl/vs201x.lua
+++ b/xmake/plugins/project/vstudio/impl/vs201x.lua
@@ -75,11 +75,15 @@ function _make_targetinfo(mode, arch, target)
targetinfo.objectdir = target:objectdir()
-- save compiler flags
+ local firstcompflags=nil
targetinfo.compflags = {}
- for _, sourcebatch in pairs(target:sourcebatches()) do
+ for sourcekind, sourcebatch in pairs(target:sourcebatches()) do
if not sourcebatch.rulename then
for _, sourcefile in ipairs(sourcebatch.sourcefiles) do
local compflags = compiler.compflags(sourcefile, {target = target})
+ if not firstcompflags and (sourcekind == "cc" or sourcekind == "cxx") then
+ firstcompflags = compflags
+ end
targetinfo.compflags[sourcefile] = compflags
end
end
@@ -89,6 +93,13 @@ function _make_targetinfo(mode, arch, target)
local linkflags = linker.linkflags(target:get("kind"), target:sourcekinds(), {target = target})
targetinfo.linkflags = linkflags
+ -- set unicode
+ for _, flag in pairs(firstcompflags) do
+ if flag:find("[%-|/]DUNICODE") then
+ targetinfo.unicode = true
+ end
+ end
+
-- ok
return targetinfo
end
diff --git a/xmake/plugins/project/vstudio/impl/vs201x_vcxproj.lua b/xmake/plugins/project/vstudio/impl/vs201x_vcxproj.lua
index 3a9ccc6f6..a7f151abd 100644
--- a/xmake/plugins/project/vstudio/impl/vs201x_vcxproj.lua
+++ b/xmake/plugins/project/vstudio/impl/vs201x_vcxproj.lua
@@ -172,7 +172,7 @@ function _make_configurations(vcxprojfile, vsinfo, target, vcxprojdir)
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(toolset_versions["vs" .. vsinfo.vstudio_version]))
- vcxprojfile:print("<CharacterSet>MultiByte</CharacterSet>")
+ vcxprojfile:print("<CharacterSet>%s</CharacterSet>", ifelse(targetinfo.unicode, "Unicode", "MultiByte"))
vcxprojfile:leave("</PropertyGroup>")
end
@@ -328,12 +328,20 @@ function _make_common_item(vcxprojfile, vsinfo, target, targetinfo, vcxprojdir)
-- for linker?
vcxprojfile:enter("<%s>", linkerkinds[targetinfo.targetkind])
+ -- save subsystem
+ local subsystem = "Console"
+
-- make linker flags
local flags = {}
for _, flag in ipairs(_make_linkflags(targetinfo, vcxprojdir)) do
+ local flag_lower = flag:lower()
+
+ -- remove "-subsystem:windows"
+ if flag_lower:find("[%-/]subsystem:windows") then
+ subsystem = "Windows"
-- remove "-machine:[x86|x64]", "-pdb:*.pdb" and "-debug"
- if not flag:find("[%-/]machine:%w+") and not flag:find("[%-/]pdb:.+%.pdb") and not flag:find("[%-/]debug") then
+ elseif not flag_lower:find("[%-/]machine:%w+") and not flag_lower:find("[%-/]pdb:.+%.pdb") and not flag_lower:find("[%-/]debug") then
table.insert(flags, flag)
end
end
@@ -358,7 +366,7 @@ function _make_common_item(vcxprojfile, vsinfo, target, targetinfo, vcxprojdir)
-- make SubSystem
if targetinfo.targetkind == "binary" then
- vcxprojfile:print("<SubSystem>Console</SubSystem>")
+ vcxprojfile:print("<SubSystem>%s</SubSystem>", subsystem)
end
-- make TargetMachine