diff options
| author | ruki <[email protected]> | 2018-09-03 15:22:51 +0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2018-09-03 15:22:51 +0800 |
| commit | da9fbc4a72b996aab4e959fd524c210433aa4add (patch) | |
| tree | a2f201607c06904f67cb92436728ac4287ad4fc5 | |
| parent | d8639b6713432cffe9f03bb12d83fc074ac54d7d (diff) | |
| parent | 9ee12112e49db451a49a66d77dd2990d9f6ddab9 (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.lua | 54 | ||||
| -rw-r--r-- | xmake/plugins/project/vstudio/impl/vs201x.lua | 13 | ||||
| -rw-r--r-- | xmake/plugins/project/vstudio/impl/vs201x_vcxproj.lua | 14 |
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 |
