From aa6cba4025f0a255e24072153c6c55f273b8b7eb Mon Sep 17 00:00:00 2001 From: 夕伽 Date: Tue, 4 Sep 2018 11:29:24 +0800 Subject: add windows mfc rule useage: target("test") add_files("*.cpp") add_files("*.rc") -- use sharedmfc add_rules("win.sdk.mfcapp.shared") -- or add_rules("win.sdk.mfcapp.static") to use staticmfc target_end() --- xmake/rules/winsdk/xmake.lua | 120 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 120 insertions(+) diff --git a/xmake/rules/winsdk/xmake.lua b/xmake/rules/winsdk/xmake.lua index 9e389de36..2ae7f7955 100644 --- a/xmake/rules/winsdk/xmake.lua +++ b/xmake/rules/winsdk/xmake.lua @@ -22,6 +22,69 @@ -- @file xmake.lua -- +-- remove exists md or mt +function _rule_remove_mt_md_flags(target, flagsname) + local flags = target:get(flagsname) + if type(flags) == "table" then + for key, flag in pairs(flags) do + flag = flag:lower() + if flag:find("[/%-]mt") or flag:find("[/%-]md") then + flags[key] = nil + end + end + elseif type(flags) == "string" then + local flag = flags:lower() + if flag:find("[/%-]mt") or flag:find("[/%-]md") then + flags = {} + end + end + target:set(flagsname, flags) +end + +-- remove exists settings +function _rule_remove_exists_flags(target) + local ldflags = target:get("ldflags") + for key, ldflag in pairs(ldflags) do + ldflag = ldflag:lower() + if ldflag:find("[/%-]subsystem:") then + ldflags[key] = nil + break + end + end + target:set("ldflags", ldflags) + + -- remove defines /DMT /DMTd /DMD /DMDd + local defines = target:get("defines") + for key, define in pairs(defines) do + define = define:lower() + if define:find("[/%-]dmt") or define:find("[/%-]dmd") then + defines[key] = nil + end + end + target:set("defines", defines) + + -- remove c /MD,/MT + _rule_remove_mt_md_flags(target, "cflags") + + -- remove c,cpp /MD,/MT + _rule_remove_mt_md_flags(target, "cxflags") + + -- remove cpp /MD,/MT + _rule_remove_mt_md_flags(target, "cxxflags") +end + +-- check unicode +function _rule_check_is_unicode(target) + local defines = target:get("defines") + for key, define in pairs(defines) do + define = define:lower() + if define:find("unicode") or define:find("_unicode") then + return true + end + end + return false +end + -- define rule: application rule("win.sdk.application") @@ -53,3 +116,60 @@ rule("win.sdk.application") target:add("links", "cfgmgr32", "comdlg32", "setupapi", "strsafe", "shlwapi") end) +-- define rule: sharedmfcapp +rule("win.sdk.mfcapp.shared") + + -- save local functions + local remove_exists_flags = _rule_remove_exists_flags + local check_is_unicode = _rule_check_is_unicode + + -- after load + after_load(function (target) + + -- set kind: binary + target:set("kind", "binary") + + -- remove some exists flags + remove_exists_flags(target) + + -- add flags + target:add("ldflags", "-subsystem:windows", {force = true}) + target:add("ldflags", ifelse(check_is_unicode(target), "-entry:wWinMainCRTStartup", "-entry:WinMainCRTStartup"), {force = true}) + + -- set runtimelibrary + target:add("cxflags", ifelse(is_mode("debug"), "-MDd", "-MD")) + target:add("defines", "AFX", "_AFXDLL") + + -- add mfc flags + target:values_set("project.vs.mfc", true) + end) + + +-- define rule: staticmfcapp +rule("win.sdk.mfcapp.static") + + -- save local functions + local remove_exists_flags = _rule_remove_exists_flags + local check_is_unicode = _rule_check_is_unicode + + -- after load + after_load(function (target) + + -- set kind: binary + target:set("kind", "binary") + + -- remove some exists flags + remove_exists_flags(target) + + -- add flags + target:add("ldflags", "-subsystem:windows", {force = true}) + target:add("ldflags", "-force", {force = true}) + target:add("ldflags", ifelse(check_is_unicode(target), "-entry:wWinMainCRTStartup", "-entry:WinMainCRTStartup"), {force = true}) + + -- set runtimelibrary + target:add("cxflags", ifelse(is_mode("debug"), "-MTd", "-MT")) + + -- add mfc flags + target:values_set("project.vs.mfc", true) + end) + -- cgit v1.3.1