summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2018-10-09 22:56:09 +0800
committerruki <[email protected]>2018-10-09 11:37:00 +0800
commit73ce4108bed43f4844be5b7a9fb0d25c612cb4ff (patch)
treedd86387184c66f41a92aba3e6ad58d038f2d8119
parentaecf4e3f816fcd2432522f1a6d337df5a1257739 (diff)
improve winos.version comparator
-rw-r--r--xmake/core/base/os.lua2
-rw-r--r--xmake/core/base/semver.lua40
-rw-r--r--xmake/core/base/winos.lua72
3 files changed, 92 insertions, 22 deletions
diff --git a/xmake/core/base/os.lua b/xmake/core/base/os.lua
index 6df38bb1c..ef9455955 100644
--- a/xmake/core/base/os.lua
+++ b/xmake/core/base/os.lua
@@ -982,8 +982,6 @@ end
-- get version info
function os.versioninfo()
-
- -- cache it
os._VERSIONINFO = os._VERSIONINFO or os._versioninfo()
return os._VERSIONINFO
end
diff --git a/xmake/core/base/semver.lua b/xmake/core/base/semver.lua
index d2c094da5..b52ac5769 100644
--- a/xmake/core/base/semver.lua
+++ b/xmake/core/base/semver.lua
@@ -67,54 +67,54 @@ end
-- v1 == v2 (str/ver)?
function _instance:eq(version)
- return _instance.__eq(self, version)
+ if type(version) == "string" then
+ return semver.compare(self:rawstr(), version) == 0
+ elseif type(version) == "table" then
+ return semver.compare(self:rawstr(), version:rawstr()) == 0
+ end
end
-- v1 < v2 (str/ver)?
function _instance:lt(version)
- return _instance.__lt(self, version)
+ if type(version) == "string" then
+ return semver.compare(self:rawstr(), version) < 0
+ elseif type(version) == "table" then
+ return semver.compare(self:rawstr(), version:rawstr()) < 0
+ end
end
-- v1 <= v2 (str/ver)?
function _instance:le(version)
- return _instance.__le(self, version)
+ if type(version) == "string" then
+ return semver.compare(self:rawstr(), version) <= 0
+ elseif type(version) == "table" then
+ return semver.compare(self:rawstr(), version:rawstr()) <= 0
+ end
end
-- v1 > v2 (str/ver)?
function _instance:gt(version)
- return not _instance.__le(self, version)
+ return not self:le(version)
end
-- v1 >= v2 (str/ver)?
function _instance:ge(version)
- return not _instance.__lt(self, version)
+ return not self:lt(version)
end
-- v1 == v2?
function _instance:__eq(version)
- if type(version) == "string" then
- return semver.compare(self:rawstr(), version) == 0
- elseif type(version) == "table" then
- return semver.compare(self:rawstr(), version:rawstr()) == 0
- end
+ return self:eq(version)
end
-- v1 < v2?
function _instance:__lt(version)
- if type(version) == "string" then
- return semver.compare(self:rawstr(), version) < 0
- elseif type(version) == "table" then
- return semver.compare(self:rawstr(), version:rawstr()) < 0
- end
+ return self:lt(version)
end
-- v1 <= v2?
function _instance:__le(version)
- if type(version) == "string" then
- return semver.compare(self:rawstr(), version) <= 0
- elseif type(version) == "table" then
- return semver.compare(self:rawstr(), version:rawstr()) <= 0
- end
+ return self:le(version)
end
-- new an instance
diff --git a/xmake/core/base/winos.lua b/xmake/core/base/winos.lua
index 40bcf3823..07f838faa 100644
--- a/xmake/core/base/winos.lua
+++ b/xmake/core/base/winos.lua
@@ -29,6 +29,71 @@ local winos = winos or {}
local os = require("base/os")
local semver = require("base/semver")
+-- get windows version from name
+function winos._version_from_name(name)
+
+ -- make defined values
+ winos._VERSIONS = winos._VERSIONS or
+ {
+ nt4 = "4.0"
+ , win2k = "5.0"
+ , winxp = "5.1"
+ , ws03 = "5.2"
+ , win6 = "6.0"
+ , vista = "6.0"
+ , ws08 = "6.0"
+ , longhorn = "6.0"
+ , win7 = "6.1"
+ , win8 = "6.2"
+ , winblue = "6.3"
+ , win81 = "6.3"
+ , win10 = "10.0"
+ }
+ return winos._VERSIONS[name]
+end
+
+-- v1 == v2 with name (winxp, win10, ..)?
+function winos._version_eq(self, version)
+ if type(version) == "string" then
+ local namever = winos._version_from_name(version)
+ if namever then
+ return semver.compare(self:major() .. '.' .. self:minor(), namever) == 0
+ else
+ return semver.compare(self:rawstr(), version) == 0
+ end
+ elseif type(version) == "table" then
+ return semver.compare(self:rawstr(), version:rawstr()) == 0
+ end
+end
+
+-- v1 < v2 with name (winxp, win10, ..)?
+function winos._version_lt(self, version)
+ if type(version) == "string" then
+ local namever = winos._version_from_name(version)
+ if namever then
+ return semver.compare(self:major() .. '.' .. self:minor(), namever) < 0
+ else
+ return semver.compare(self:rawstr(), version) < 0
+ end
+ elseif type(version) == "table" then
+ return semver.compare(self:rawstr(), version:rawstr()) < 0
+ end
+end
+
+-- v1 <= v2 with name (winxp, win10, ..)?
+function winos._version_le(self, version)
+ if type(version) == "string" then
+ local namever = winos._version_from_name(version)
+ if namever then
+ return semver.compare(self:major() .. '.' .. self:minor(), namever) <= 0
+ else
+ return semver.compare(self:rawstr(), version) <= 0
+ end
+ elseif type(version) == "table" then
+ return semver.compare(self:rawstr(), version:rawstr()) <= 0
+ end
+end
+
-- get system version
function winos.version()
@@ -48,6 +113,13 @@ function winos.version()
winver = semver.new(winver)
end
+ -- rewrite comparator
+ if winver then
+ winver.eq = winos._version_eq
+ winver.lt = winos._version_lt
+ winver.le = winos._version_le
+ end
+
-- save to cache
winos._VERSION = winver or false