summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2022-09-06 23:32:08 +0800
committerGitHub <[email protected]>2022-09-06 23:32:08 +0800
commit400b22bf9ace156aa901d4aab8c46551f194ba50 (patch)
treef0a634bafdd80a6100be60535e5678fb45b84746
parent82d8ff1eb80e394ecbe135391405bede241bf889 (diff)
parent2c84d9fdfff81222e5d1bf78f9a70e7456dbd99a (diff)
Merge pull request #2782 from WubiCookie/matlab
Update find_matlab and add find_matlab_runtime
-rw-r--r--xmake/modules/detect/sdks/find_matlab.lua33
-rw-r--r--xmake/modules/detect/sdks/find_matlab_runtime.lua102
-rw-r--r--xmake/modules/detect/sdks/matlab.lua80
3 files changed, 212 insertions, 3 deletions
diff --git a/xmake/modules/detect/sdks/find_matlab.lua b/xmake/modules/detect/sdks/find_matlab.lua
index a29e17399..1980ea960 100644
--- a/xmake/modules/detect/sdks/find_matlab.lua
+++ b/xmake/modules/detect/sdks/find_matlab.lua
@@ -18,17 +18,23 @@
-- @file find_matlab.lua
--
+-- imports
+import("detect.sdks.matlab")
+
-- find matlab sdk toolchains
--
-- @return the matlab sdk toolchains. e.g. {sdkdir = ..., includedirs = ..., linkdirs = ..., .. }
--
-- @code
--
--- local toolchains = find_matlab()
+-- local toolchains = find_matlab(opt)
--
-- @endcode
--
-function main()
+function main(opt)
+ opt = opt or {}
+ local runtime_version = opt.runtime_version and tostring(opt.runtime_version) or nil
+
local result = {sdkdir = "", includedirs = {}, linkdirs = {}, links = {}}
if is_host("windows") then
local matlabkey = "HKEY_LOCAL_MACHINE\\SOFTWARE\\MathWorks\\MATLAB"
@@ -36,7 +42,28 @@ function main()
if #valuekeys == 0 then
return nil
end
- local itemkey = valuekeys[1] .. ";MATLABROOT"
+
+ local itemkey = nil
+ if runtime_version == nil then
+ itemkey = valuekeys[1] .. ";MATLABROOT"
+ else
+ local versionname = matlab.versions()[runtime_version]
+ if versionname ~= nil then
+ itemkey = matlabkey .. "\\" .. runtime_version .. ";MATLABROOT"
+ else
+ local versionvalue = matlab.versions_names()[runtime_version:lower()]
+ if versionvalue ~= nil then
+ itemkey = matlabkey .. "\\" .. versionvalue .. ";MATLABROOT"
+ else
+ print("allowed values are:")
+ for k, v in pairs(matlab.versions()) do
+ print(" ", k, v)
+ end
+ raise("MATLAB Runtime version does not exist: " .. runtime_version)
+ end
+ end
+ end
+
local sdkdir = try {function () return winos.registry_query(itemkey) end}
if not sdkdir then
return nil
diff --git a/xmake/modules/detect/sdks/find_matlab_runtime.lua b/xmake/modules/detect/sdks/find_matlab_runtime.lua
new file mode 100644
index 000000000..27852d2f0
--- /dev/null
+++ b/xmake/modules/detect/sdks/find_matlab_runtime.lua
@@ -0,0 +1,102 @@
+--!A cross-platform build utility based on Lua
+--
+-- Licensed under the Apache License, Version 2.0 (the "License");
+-- you may not use this file except in compliance with the License.
+-- You may obtain a copy of the License at
+--
+-- http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+-- See the License for the specific language governing permissions and
+-- limitations under the License.
+--
+-- Copyright (C) 2015-present, TBOOX Open Source Group.
+--
+-- @author WubiCookie
+-- @file find_matlab_runtime.lua
+--
+
+-- imports
+import("detect.sdks.matlab")
+
+-- find matlab runtime sdk
+--
+-- @return the matlab runtime sdk. e.g. {sdkdir = ..., includedirs = ..., linkdirs = ..., .. }
+--
+-- @code
+--
+-- local sdk = find_matlab_runtime(opt)
+--
+-- @endcode
+--
+function main(opt)
+ opt = opt or {}
+ local runtime_version = opt.runtime_version and tostring(opt.runtime_version) or nil
+
+ local result = {sdkdir = "", includedirs = {}, linkdirs = {}, links = {}, bindirs = {}}
+ if is_host("windows") then
+ local matlabkey = "HKEY_LOCAL_MACHINE\\SOFTWARE\\MathWorks\\MATLAB Runtime"
+ local valuekeys = winos.registry_keys(matlabkey)
+ if #valuekeys == 0 then
+ return nil
+ end
+
+ local versionname = nil
+ local versionvalue = nil
+
+ local itemkey = nil
+ if runtime_version == nil then
+ local splitvaluekeys = valuekeys[1]:split("\\")
+ versionvalue = splitvaluekeys[#splitvaluekeys - 1]
+ versionname = matlab.versions()[versionvalue]
+ itemkey = valuekeys[1] .. ";MATLABROOT"
+ else
+ versionname = matlab.versions()[runtime_version]
+ if versionname ~= nil then
+ versionvalue = matlab.versions_names()[versionname:lower()]
+ itemkey = matlabkey .. "\\" .. runtime_version .. ";MATLABROOT"
+ else
+ versionvalue = matlab.versions_names()[runtime_version:lower()]
+ versionname = matlab.versions()[versionvalue]
+ if versionvalue ~= nil then
+ itemkey = matlabkey .. "\\" .. versionvalue .. ";MATLABROOT"
+ else
+ print("allowed values are:")
+ for k, v in pairs(matlab.versions()) do
+ print(" ", k, v)
+ end
+ raise("MATLAB Runtime version does not exist: " .. runtime_version)
+ end
+ end
+ end
+
+ local sdkdir = try {function () return winos.registry_query(itemkey) end}
+ if not sdkdir then
+ return nil
+ end
+
+ sdkdir = sdkdir .. "\\v" .. versionvalue:gsub("%.", "")
+
+ result.sdkdir = sdkdir
+ result.includedirs = path.join(sdkdir, "extern", "include")
+ result.bindirs = {
+ path.join(sdkdir, "bin", "win64"),
+ path.join(sdkdir, "runtime", "win64"),
+ }
+ -- find lib dirs
+ for _, value in ipairs(os.dirs(path.join(sdkdir, "extern", "lib", "**"))) do
+ local dirbasename = path.basename(value)
+ if not dirbasename:startswith("win") then
+ result.linkdirs[dirbasename] = value
+ end
+ end
+ -- find lib
+ for _, value in pairs(result.linkdirs) do
+ local dirbasename = path.basename(value)
+ result.links[dirbasename] = path.join(value, "*")
+ end
+ end
+ return result
+end
diff --git a/xmake/modules/detect/sdks/matlab.lua b/xmake/modules/detect/sdks/matlab.lua
new file mode 100644
index 000000000..1a654d633
--- /dev/null
+++ b/xmake/modules/detect/sdks/matlab.lua
@@ -0,0 +1,80 @@
+--!A cross-platform build utility based on Lua
+--
+-- Licensed under the Apache License, Version 2.0 (the "License");
+-- you may not use this file except in compliance with the License.
+-- You may obtain a copy of the License at
+--
+-- http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+-- See the License for the specific language governing permissions and
+-- limitations under the License.
+--
+-- Copyright (C) 2015-present, TBOOX Open Source Group.
+--
+-- @author WubiCookie
+-- @file matlab.lua
+--
+
+-- get matlab versions
+function versions()
+
+ -- see https://www.mathworks.com/products/compiler/matlab-runtime.html
+ return
+ {
+ ["9.12"] = "R2022a"
+ , ["9.11"] = "R2021b"
+ , ["9.10"] = "R2021a"
+ , ["9.9"] = "R2020b"
+ , ["9.8"] = "R2020a"
+ , ["9.7"] = "R2019b"
+ , ["9.6"] = "R2019a"
+ , ["9.5"] = "R2018b"
+ , ["9.4"] = "R2018a"
+ , ["9.3"] = "R2017b"
+ , ["9.2"] = "R2017a"
+ , ["9.1"] = "R2016b"
+ , ["9.0.1"] = "R2016a"
+ , ["9.0"] = "R2015b"
+ , ["8.5.1"] = "R2015aSP1"
+ , ["8.5"] = "R2015a"
+ , ["8.4"] = "R2014b"
+ , ["8.3"] = "R2014a"
+ , ["8.2"] = "R2013b"
+ , ["8.1"] = "R2013a"
+ , ["8.0"] = "R2012b"
+ , ["7.17"] = "R2012a"
+ }
+end
+
+-- get matlab versions names
+function versions_names()
+
+ return
+ {
+ r2022a = "9.12"
+ , r2021b = "9.11"
+ , r2021a = "9.10"
+ , r2020b = "9.9"
+ , r2020a = "9.8"
+ , r2019b = "9.7"
+ , r2019a = "9.6"
+ , r2018b = "9.5"
+ , r2018a = "9.4"
+ , r2017b = "9.3"
+ , r2017a = "9.2"
+ , r2016b = "9.1"
+ , r2016a = "9.0.1"
+ , r2015b = "9.0"
+ , r2015asp1 = "8.5.1"
+ , r2015a = "8.5"
+ , r2014b = "8.4"
+ , r2014a = "8.3"
+ , r2013b = "8.2"
+ , r2013a = "8.1"
+ , r2012b = "8.0"
+ , r2012a = "7.17"
+ }
+end