diff options
| author | ruki <[email protected]> | 2018-09-21 22:50:30 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2018-09-21 11:03:03 +0800 |
| commit | e4ce9f64923260de45e83ca735d025e19cce45ad (patch) | |
| tree | 9121156fc93b1745a1aeafe164c72ca473d6566d | |
| parent | b05bfd4eb937e7a7d78201921ab86c165af00491 (diff) | |
improve mfc rules
| -rw-r--r-- | xmake/actions/build/trybuild.lua | 14 | ||||
| -rw-r--r-- | xmake/plugins/project/vstudio/impl/vs200x_vcproj.lua | 14 | ||||
| -rw-r--r-- | xmake/plugins/project/vstudio/impl/vs201x.lua | 10 | ||||
| -rw-r--r-- | xmake/plugins/project/vstudio/impl/vs201x_vcxproj.lua | 5 | ||||
| -rw-r--r-- | xmake/rules/winsdk/mfc/env/xmake.lua | 8 | ||||
| -rw-r--r-- | xmake/rules/winsdk/mfc/mfc.lua | 82 | ||||
| -rw-r--r-- | xmake/rules/winsdk/mfc/xmake.lua | 38 |
7 files changed, 99 insertions, 72 deletions
diff --git a/xmake/actions/build/trybuild.lua b/xmake/actions/build/trybuild.lua index b53536788..268e6295a 100644 --- a/xmake/actions/build/trybuild.lua +++ b/xmake/actions/build/trybuild.lua @@ -25,6 +25,7 @@ -- imports import("core.base.option") import("core.platform.environment") +import("lib.detect.find_file") -- try building for makefile function _build_for_makefile(buildfile) @@ -39,13 +40,20 @@ end -- try building for cmakelist function _build_for_cmakelists(buildfile) - os.vrun("cmake .") - os.vrun("make") + os.mkdir("build") + os.cd("build") + os.vrun("cmake -a %s ..", os.arch()) + if is_host("windows") then + local slnfile = assert(find_file("*.sln", os.curdir()), "*.sln file not found!") + os.vrun("msbuild \"%s\" -nologo -t:Rebuild -p:Configuration=Release -p:Platform=%s", slnfile, os.arch() == "x64" and "x64" or "Win32") + else + os.vrun("make") + end end -- build for *.sln function _build_for_sln(buildfile) - os.vrun("msbuild %s -nologo -t:Rebuild -p:Configuration=Release", buildfile) + os.vrun("msbuild \"%s\" -nologo -t:Rebuild -p:Configuration=Release -p:Platform=%s", buildfile, os.arch() == "x64" and "x64" or "Win32") end -- build for *.xcworkspace or *.xcodeproj diff --git a/xmake/plugins/project/vstudio/impl/vs200x_vcproj.lua b/xmake/plugins/project/vstudio/impl/vs200x_vcproj.lua index 2e29b8281..077e96bfa 100644 --- a/xmake/plugins/project/vstudio/impl/vs200x_vcproj.lua +++ b/xmake/plugins/project/vstudio/impl/vs200x_vcproj.lua @@ -279,11 +279,20 @@ function _make_configurations(vcprojfile, vsinfo, target, vcprojdir) end end + -- use mfc? not used: 0, static: 1, shared: 2 + local usemfc = 0 + if target:rule("win.sdk.mfc.shared_app") or target:rule("win.sdk.mfc.shared") then + usemfc = 2 + elseif target:rule("win.sdk.mfc.static_app") or target:rule("win.sdk.mfc.static") then + usemfc = 1 + end + -- set unicode local unicode = false - for _, flag in pairs(compflags) do + for _, flag in ipairs(compflags) do if flag:find("[%-|/]DUNICODE") then unicode = true + break end end @@ -296,7 +305,8 @@ 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=\"%d\"", ifelse(unicode, 1, 2)) -- mbc: 2, wcs: 1 + vcprojfile:print("CharacterSet=\"%d\"", unicode and 1 or 2) -- mbc: 2, wcs: 1 + vcprojfile:print("UseOfMFC=\"%d\"", usemfc) vcprojfile:print(">") -- make VCPreBuildEventTool diff --git a/xmake/plugins/project/vstudio/impl/vs201x.lua b/xmake/plugins/project/vstudio/impl/vs201x.lua index 65c4d1d2a..7f8c619fe 100644 --- a/xmake/plugins/project/vstudio/impl/vs201x.lua +++ b/xmake/plugins/project/vstudio/impl/vs201x.lua @@ -93,10 +93,18 @@ function _make_targetinfo(mode, arch, target) local linkflags = linker.linkflags(target:get("kind"), target:sourcekinds(), {target = target}) targetinfo.linkflags = linkflags + -- use mfc? save the mfc runtime kind + if target:rule("win.sdk.mfc.shared_app") or target:rule("win.sdk.mfc.shared") then + targetinfo.usemfc = "Dynamic" + elseif target:rule("win.sdk.mfc.static_app") or target:rule("win.sdk.mfc.static") then + targetinfo.usemfc = "Static" + end + -- set unicode - for _, flag in pairs(firstcompflags) do + for _, flag in ipairs(firstcompflags) do if flag:find("[%-|/]DUNICODE") then targetinfo.unicode = true + break end end diff --git a/xmake/plugins/project/vstudio/impl/vs201x_vcxproj.lua b/xmake/plugins/project/vstudio/impl/vs201x_vcxproj.lua index 146e74a67..4275dfd8d 100644 --- a/xmake/plugins/project/vstudio/impl/vs201x_vcxproj.lua +++ b/xmake/plugins/project/vstudio/impl/vs201x_vcxproj.lua @@ -172,7 +172,10 @@ 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>%s</CharacterSet>", ifelse(targetinfo.unicode, "Unicode", "MultiByte")) + vcxprojfile:print("<CharacterSet>%s</CharacterSet>", targetinfo.unicode and "Unicode" or "MultiByte") + if targetinfo.usemfc then + vcxprojfile:print("<UseOfMfc>%s</UseOfMfc>", targetinfo.usemfc) + end vcxprojfile:leave("</PropertyGroup>") end diff --git a/xmake/rules/winsdk/mfc/env/xmake.lua b/xmake/rules/winsdk/mfc/env/xmake.lua index 38ce77925..546ee1030 100644 --- a/xmake/rules/winsdk/mfc/env/xmake.lua +++ b/xmake/rules/winsdk/mfc/env/xmake.lua @@ -18,13 +18,13 @@ -- -- Copyright (C) 2015 - 2018, TBOOX Open Source Group. -- --- @author xigal +-- @author xigal, ruki -- @file xmake.lua -- -- define rule: mfc.env rule("win.sdk.mfc.env") - -- FIXME: before load need check of vs's minverion, if defined - --before_load(function (target) - --end)
\ No newline at end of file + -- TODO: before load need check of vs's minverion, if defined + before_load(function (target) + end) diff --git a/xmake/rules/winsdk/mfc/mfc.lua b/xmake/rules/winsdk/mfc/mfc.lua index b51ab0733..52b515c0d 100644 --- a/xmake/rules/winsdk/mfc/mfc.lua +++ b/xmake/rules/winsdk/mfc/mfc.lua @@ -18,12 +18,12 @@ -- -- Copyright (C) 2015 - 2018, TBOOX Open Source Group. -- --- @author xigal +-- @author xigal, ruki -- @file xmake.lua -- -- remove exists md or mt -function _mfc_remove_mt_md_flags(target, flagsname) +function _remove_mt_md_flags(target, flagsname) local flags = table.wrap(target:get(flagsname)) for i = #flags, 1, -1 do flag = flags[i]:lower():trim() @@ -35,7 +35,7 @@ function _mfc_remove_mt_md_flags(target, flagsname) end -- remove exists settings -function _mfc_remove_flags(target) +function _remove_flags(target) local ldflags = table.wrap(target:get("ldflags")) for i = #ldflags, 1, -1 do ldflag = ldflags[i]:lower():trim() @@ -57,51 +57,63 @@ function _mfc_remove_flags(target) target:set("defines", defines) -- remove c /MD,/MT - _mfc_remove_mt_md_flags(target, "cflags") + _remove_mt_md_flags(target, "cflags") -- remove c,cpp /MD,/MT - _mfc_remove_mt_md_flags(target, "cxflags") + _remove_mt_md_flags(target, "cxflags") -- remove cpp /MD,/MT - _mfc_remove_mt_md_flags(target, "cxxflags") + _remove_mt_md_flags(target, "cxxflags") end --- get application entry -function mfc_application_entry(target) - local defines = target:get("defines") - for key, define in pairs(defines) do - define = define:lower():trim() - if define:find("^[_]?unicode$") then - return "-entry:wWinMainCRTStartup" - end +-- apply mfc library settings +function library(target, kind) + + -- set kind: static/shared + target:set("kind", kind) + + -- set runtime library + if kind == "static" then + target:add("cxflags", is_mode("debug") and "-MTd" or "-MT") + else + target:add("cxflags", is_mode("debug") and "-MDd" or "-MD") + target:add("defines", "AFX", "_AFXDLL") end - return "-entry:WinMainCRTStartup" end --- apply shared mfc settings -function mfc_shared(target) +-- apply mfc application settings +function application(target, mfc_kind) + + -- set kind: binary + target:set("kind", "binary") -- remove some exists flags - _mfc_remove_flags(target) + _remove_flags(target) - -- add flags + -- set windows subsystem target:add("ldflags", "-subsystem:windows", {force = true}) - -- set runtimelibrary - target:add("cxflags", ifelse(is_mode("debug"), "-MDd", "-MD")) - target:add("defines", "AFX", "_AFXDLL") -end - --- apply static mfc settings -function mfc_static(target) - - -- remove some exists flags - _mfc_remove_flags(target) + -- forces a link to complete even with unresolved symbols + if mfc_kind == "static" then + target:add("ldflags", "-force", {force = true}) + end - -- add flags - target:add("ldflags", "-subsystem:windows", {force = true}) - target:add("ldflags", "-force", {force = true}) + -- set runtime library + if mfc_kind == "static" then + target:add("cxflags", is_mode("debug") and "-MTd" or "-MT") + else + target:add("cxflags", is_mode("debug") and "-MDd" or "-MD") + target:add("defines", "AFX", "_AFXDLL") + end - -- set runtimelibrary - target:add("cxflags", ifelse(is_mode("debug"), "-MTd", "-MT")) -end
\ No newline at end of file + -- set startup entry + local unicode = false + for _, define in ipairs(target:get("defines")) do + define = define:lower():trim() + if define:find("^[_]?unicode$") then + unicode = true + break + end + end + target:add("ldflags", unicode and "-entry:wWinMainCRTStartup" or "-entry:WinMainCRTStartup", {force = true}) +end diff --git a/xmake/rules/winsdk/mfc/xmake.lua b/xmake/rules/winsdk/mfc/xmake.lua index d22752a94..14380c332 100644 --- a/xmake/rules/winsdk/mfc/xmake.lua +++ b/xmake/rules/winsdk/mfc/xmake.lua @@ -18,11 +18,11 @@ -- -- Copyright (C) 2015 - 2018, TBOOX Open Source Group. -- --- @author xigal +-- @author xigal, ruki -- @file xmake.lua -- --- define rule: shared +-- define rule: the mfc shared library rule("win.sdk.mfc.shared") -- add mfc base rule @@ -30,12 +30,10 @@ rule("win.sdk.mfc.shared") -- after load after_load(function (target) - - -- apply mfc settings - import("mfc").mfc_shared(target) + import("mfc").library(target, "shared") end) --- define rule: static +-- define rule: the mfc static library rule("win.sdk.mfc.static") -- add mfc base rule @@ -43,39 +41,27 @@ rule("win.sdk.mfc.static") -- after load after_load(function (target) - - -- apply mfc settings - import("mfc").mfc_static(target) + import("mfc").library(target, "static") end) --- define rule: sharedcapp +-- define rule: the application with shared mfc libraries rule("win.sdk.mfc.shared_app") -- add mfc base rule - add_deps("win.sdk.mfc.shared") + add_deps("win.sdk.mfc.env") -- after load after_load(function (target) - - -- set kind: binary - target:set("kind", "binary") - - -- set entry - target:add("ldflags", import("mfc").mfc_application_entry(target), {force = true}) + import("mfc").application(target, "shared") end) --- define rule: staticapp +-- define rule: the application with static mfc libraries rule("win.sdk.mfc.static_app") -- add mfc base rule - add_deps("win.sdk.mfc.static") + add_deps("win.sdk.mfc.env") -- after load after_load(function (target) - - -- set kind: binary - target:set("kind", "binary") - - -- set entry - target:add("ldflags", import("mfc").mfc_application_entry(target), {force = true}) - end)
\ No newline at end of file + import("mfc").application(target, "static") + end) |
