diff options
| author | 夕伽 <[email protected]> | 2018-09-04 11:29:24 +0800 |
|---|---|---|
| committer | 夕伽 <[email protected]> | 2018-09-04 11:29:24 +0800 |
| commit | aa6cba4025f0a255e24072153c6c55f273b8b7eb (patch) | |
| tree | 50d18dda95cb33f208f9dae848f3805f851944c5 | |
| parent | 05b6182def036b36c8e4aeac8cdc55441fc4a4db (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.lua | 120 |
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) + |
