summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2018-09-21 22:50:30 +0800
committerruki <[email protected]>2018-09-21 11:03:03 +0800
commite4ce9f64923260de45e83ca735d025e19cce45ad (patch)
tree9121156fc93b1745a1aeafe164c72ca473d6566d
parentb05bfd4eb937e7a7d78201921ab86c165af00491 (diff)
improve mfc rules
-rw-r--r--xmake/actions/build/trybuild.lua14
-rw-r--r--xmake/plugins/project/vstudio/impl/vs200x_vcproj.lua14
-rw-r--r--xmake/plugins/project/vstudio/impl/vs201x.lua10
-rw-r--r--xmake/plugins/project/vstudio/impl/vs201x_vcxproj.lua5
-rw-r--r--xmake/rules/winsdk/mfc/env/xmake.lua8
-rw-r--r--xmake/rules/winsdk/mfc/mfc.lua82
-rw-r--r--xmake/rules/winsdk/mfc/xmake.lua38
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)