summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2018-11-12 23:10:19 +0800
committerruki <[email protected]>2018-11-12 13:01:54 +0800
commit0d6defd8520b2a93e02a5872a067a611d1b839cc (patch)
treee65c3bd8a99326bd33ec5010f56d3a8fe0939f7c
parent377840c51da27c07f9d94caf458f99eb197798e3 (diff)
lazy loading platform
-rw-r--r--xmake/core/base/table.lua2
-rw-r--r--xmake/core/base/task.lua11
-rw-r--r--xmake/core/platform/platform.lua38
-rw-r--r--xmake/platforms/iphoneos/load.lua27
-rw-r--r--xmake/platforms/watchos/load.lua27
5 files changed, 61 insertions, 44 deletions
diff --git a/xmake/core/base/table.lua b/xmake/core/base/table.lua
index de024ff2b..f6e34c628 100644
--- a/xmake/core/base/table.lua
+++ b/xmake/core/base/table.lua
@@ -267,8 +267,6 @@ function table.unwrap(object)
if type(object) == "table" then
if #object == 1 then
return object[1]
- elseif #object == 0 then
- return
end
end
return object
diff --git a/xmake/core/base/task.lua b/xmake/core/base/task.lua
index b6a5d7d15..b2b5b25a0 100644
--- a/xmake/core/base/task.lua
+++ b/xmake/core/base/task.lua
@@ -437,7 +437,10 @@ function task.menu(tasks)
menu.main = function ()
-- translate main menu
- local mainmenu = task._translate_menu(taskinst:get("menu"))
+ local mainmenu, errors = task._translate_menu(taskinst:get("menu"))
+ if not mainmenu then
+ os.raise(errors)
+ end
-- make tasks for the main menu
mainmenu.tasks = {}
@@ -464,7 +467,11 @@ function task.menu(tasks)
-- delay to load task menu
menu[taskname] = function ()
- return task._translate_menu(taskinst:get("menu"))
+ local taskmenu, errors = task._translate_menu(taskinst:get("menu"))
+ if not taskmenu then
+ os.raise(errors)
+ end
+ return taskmenu
end
end
end
diff --git a/xmake/core/platform/platform.lua b/xmake/core/platform/platform.lua
index dc16bf0d4..325935a38 100644
--- a/xmake/core/platform/platform.lua
+++ b/xmake/core/platform/platform.lua
@@ -51,6 +51,11 @@ function _instance.new(name, info, rootdir)
return instance
end
+-- get platform name
+function _instance:name()
+ return self._NAME
+end
+
-- set the value to the platform info
function _instance:set(name, ...)
self._INFO[name] = table.unwrap(table.unique({...}))
@@ -64,6 +69,26 @@ end
-- get the platform configure
function _instance:get(name)
+
+ -- attempt to get the static configure value
+ local value = self._INFO[name]
+ if value ~= nil then
+ return value
+ end
+
+ -- lazy loading platform
+ if not self._LOADED then
+ local on_load = self._INFO.load
+ if on_load then
+ local ok, errors = sandbox.load(on_load, self)
+ if not ok then
+ os.raise(errors)
+ end
+ end
+ self._LOADED = true
+ end
+
+ -- get other platform info
return self._INFO[name]
end
@@ -204,15 +229,6 @@ function platform.load(plat)
return nil, errors
end
- -- do load
- local on_load = instance:get("load")
- if on_load then
- local ok, errors = sandbox.load(on_load, instance)
- if not ok then
- return nil, errors
- end
- end
-
-- save instance to the cache
platform._PLATFORMS[plat] = instance
@@ -225,9 +241,11 @@ end
function platform.get(name, plat)
-- get the current platform configure
- local instance = platform.load(plat)
+ local instance, errors = platform.load(plat)
if instance then
return instance:get(name)
+ else
+ os.raise(errors)
end
end
diff --git a/xmake/platforms/iphoneos/load.lua b/xmake/platforms/iphoneos/load.lua
index aaa295ad9..80e12eba9 100644
--- a/xmake/platforms/iphoneos/load.lua
+++ b/xmake/platforms/iphoneos/load.lua
@@ -26,21 +26,21 @@
import("core.project.config")
-- load it
-function main()
+function main(platform)
-- init architecture
local arch = config.get("arch") or "arm64"
local simulator = (arch == "i386" or arch == "x86_64")
-- init platform name
- local platname = ifelse(simulator, "iPhoneSimulator", "iPhoneOS")
+ local platname = simulator and "iPhoneSimulator" or "iPhoneOS"
-- init target minimal version
local target_minver = config.get("target_minver")
if target_minver and tonumber(target_minver) > 10 and (arch == "armv7" or arch == "armv7s" or arch == "i386") then
target_minver = "10" -- iOS 10 is the maximum deployment target for 32-bit targets
end
- local target_minver_flags = ifelse(simulator, "-mios-simulator-version-min=", "-miphoneos-version-min=") .. target_minver
+ local target_minver_flags = (simulator and "-mios-simulator-version-min=" or "-miphoneos-version-min=") .. target_minver
-- init the xcode sdk directory
local xcode_dir = config.get("xcode")
@@ -48,22 +48,19 @@ function main()
local xcode_sdkdir = format("%s/Contents/Developer/Platforms/%s.platform/Developer/SDKs/%s%s.sdk", xcode_dir, platname, platname, xcode_sdkver)
-- init flags for c/c++
- _g.cxflags = { "-arch " .. arch, target_minver_flags, "-isysroot " .. xcode_sdkdir }
- _g.ldflags = { "-arch " .. arch, "-ObjC", "-lstdc++", "-fobjc-link-runtime", target_minver_flags, "-isysroot " .. xcode_sdkdir }
- _g.shflags = { "-arch " .. arch, "-ObjC", "-lstdc++", "-fobjc-link-runtime", target_minver_flags, "-isysroot " .. xcode_sdkdir }
+ platform:add("cxflags", "-arch " .. arch, target_minver_flags, "-isysroot " .. xcode_sdkdir)
+ platform:add("ldflags", "-arch " .. arch, "-ObjC", "-lstdc++", "-fobjc-link-runtime", target_minver_flags, "-isysroot " .. xcode_sdkdir)
+ platform:add("shflags", "-arch " .. arch, "-ObjC", "-lstdc++", "-fobjc-link-runtime", target_minver_flags, "-isysroot " .. xcode_sdkdir)
-- init flags for objc/c++
- _g.mxflags = { "-arch " .. arch, target_minver_flags, "-isysroot " .. xcode_sdkdir }
+ platform:add("mxflags", "-arch " .. arch, target_minver_flags, "-isysroot " .. xcode_sdkdir)
-- init flags for asm
- _g.asflags = { "-arch " .. arch, target_minver_flags, "-isysroot " .. xcode_sdkdir }
+ platform:add("asflags", "-arch " .. arch, target_minver_flags, "-isysroot " .. xcode_sdkdir)
- -- init flags for swift (with _g.ldflags and _g.shflags)
- _g.scflags = { format("-target %s-apple-ios%s", arch, target_minver) , "-sdk " .. xcode_sdkdir }
- _g["sc-shflags"] = { format("-target %s-apple-ios%s", arch, target_minver) , "-sdk " .. xcode_sdkdir }
- _g["sc-ldflags"] = { format("-target %s-apple-ios%s", arch, target_minver) , "-sdk " .. xcode_sdkdir }
-
- -- ok
- return _g
+ -- init flags for swift (with platform:add("ldflags and platform:add("shflags)
+ platform:add("scflags", format("-target %s-apple-ios%s", arch, target_minver) , "-sdk " .. xcode_sdkdir)
+ platform:add("sc-shflags", format("-target %s-apple-ios%s", arch, target_minver) , "-sdk " .. xcode_sdkdir)
+ platform:add("sc-ldflags", format("-target %s-apple-ios%s", arch, target_minver) , "-sdk " .. xcode_sdkdir)
end
diff --git a/xmake/platforms/watchos/load.lua b/xmake/platforms/watchos/load.lua
index df84202c4..45931c620 100644
--- a/xmake/platforms/watchos/load.lua
+++ b/xmake/platforms/watchos/load.lua
@@ -26,18 +26,18 @@
import("core.project.config")
-- load it
-function main()
+function main(platform)
-- init architecture
local arch = config.get("arch")
local simulator = arch == "i386"
-- init platform name
- local platname = ifelse(simulator, "WatchSimulator", "WatchOS")
+ local platname = simulator and "WatchSimulator" or "WatchOS"
-- init target minimal version
local target_minver = config.get("target_minver")
- local target_minver_flags = ifelse(simulator, "-mwatchos-simulator-version-min=", "-mwatchos-version-min=") .. target_minver
+ local target_minver_flags = (simulator and "-mwatchos-simulator-version-min=" or "-mwatchos-version-min=") .. target_minver
-- init the xcode sdk directory
local xcode_dir = config.get("xcode")
@@ -45,22 +45,19 @@ function main()
local xcode_sdkdir = format("%s/Contents/Developer/Platforms/%s.platform/Developer/SDKs/%s%s.sdk", xcode_dir, platname, platname, xcode_sdkver)
-- init flags for c/c++
- _g.cxflags = { "-arch " .. arch, target_minver_flags, "-isysroot " .. xcode_sdkdir }
- _g.ldflags = { "-arch " .. arch, "-ObjC", "-lstdc++", "-fobjc-link-runtime", target_minver_flags, "-isysroot " .. xcode_sdkdir }
- _g.shflags = { "-arch " .. arch, "-ObjC", "-lstdc++", "-fobjc-link-runtime", target_minver_flags, "-isysroot " .. xcode_sdkdir }
+ platform:add("cxflags", "-arch " .. arch, target_minver_flags, "-isysroot " .. xcode_sdkdir)
+ platform:add("ldflags", "-arch " .. arch, "-ObjC", "-lstdc++", "-fobjc-link-runtime", target_minver_flags, "-isysroot " .. xcode_sdkdir)
+ platform:add("shflags", "-arch " .. arch, "-ObjC", "-lstdc++", "-fobjc-link-runtime", target_minver_flags, "-isysroot " .. xcode_sdkdir)
-- init flags for objc/c++
- _g.mxflags = { "-arch " .. arch, target_minver_flags, "-isysroot " .. xcode_sdkdir }
+ platform:add("mxflags", "-arch " .. arch, target_minver_flags, "-isysroot " .. xcode_sdkdir)
-- init flags for asm
- _g.asflags = { "-arch " .. arch, target_minver_flags, "-isysroot " .. xcode_sdkdir }
+ platform:add("asflags", "-arch " .. arch, target_minver_flags, "-isysroot " .. xcode_sdkdir)
- -- init flags for swift (with _g.ldflags and _g.shflags)
- _g.scflags = { format("-target %s-apple-ios%s", arch, target_minver) , "-sdk " .. xcode_sdkdir }
- _g["sc-shflags"] = { format("-target %s-apple-ios%s", arch, target_minver) , "-sdk " .. xcode_sdkdir }
- _g["sc-ldflags"] = { format("-target %s-apple-ios%s", arch, target_minver) , "-sdk " .. xcode_sdkdir }
-
- -- ok
- return _g
+ -- init flags for swift (with platform:add("ldflags and platform:add("shflags)
+ platform:add("scflags", format("-target %s-apple-ios%s", arch, target_minver) , "-sdk " .. xcode_sdkdir)
+ platform:add("sc-shflags", format("-target %s-apple-ios%s", arch, target_minver) , "-sdk " .. xcode_sdkdir)
+ platform:add("sc-ldflags", format("-target %s-apple-ios%s", arch, target_minver) , "-sdk " .. xcode_sdkdir)
end