summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author夕伽 <[email protected]>2018-09-04 11:29:24 +0800
committer夕伽 <[email protected]>2018-09-04 11:29:24 +0800
commitaa6cba4025f0a255e24072153c6c55f273b8b7eb (patch)
tree50d18dda95cb33f208f9dae848f3805f851944c5
parent05b6182def036b36c8e4aeac8cdc55441fc4a4db (diff)
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()
-rw-r--r--xmake/rules/winsdk/xmake.lua120
1 files changed, 120 insertions, 0 deletions
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)
+