diff options
| author | ruki <[email protected]> | 2018-10-09 22:56:09 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2018-10-09 11:37:00 +0800 |
| commit | 73ce4108bed43f4844be5b7a9fb0d25c612cb4ff (patch) | |
| tree | dd86387184c66f41a92aba3e6ad58d038f2d8119 | |
| parent | aecf4e3f816fcd2432522f1a6d337df5a1257739 (diff) | |
improve winos.version comparator
| -rw-r--r-- | xmake/core/base/os.lua | 2 | ||||
| -rw-r--r-- | xmake/core/base/semver.lua | 40 | ||||
| -rw-r--r-- | xmake/core/base/winos.lua | 72 |
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 |
