diff options
| author | ruki <[email protected]> | 2021-10-26 22:14:14 +0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2021-10-26 22:14:14 +0800 |
| commit | 1115732be0fb8f1eb24b37d39b22dc187ed9062f (patch) | |
| tree | f6c06f01cac654338f0d6110e6c3665b23adcb72 /xmake/modules | |
| parent | df89676a5a905ced4cae2be987742c1d4d91c563 (diff) | |
| parent | 63c46927a81593033193b12bbf3a72db5c9726dd (diff) | |
Merge pull request #1773 from xmake-io/keil
Add armcc/armclang support for Keil/MDK
Diffstat (limited to 'xmake/modules')
| -rw-r--r-- | xmake/modules/core/tools/armar.lua | 26 | ||||
| -rw-r--r-- | xmake/modules/core/tools/armasm.lua | 167 | ||||
| -rw-r--r-- | xmake/modules/core/tools/armcc.lua | 176 | ||||
| -rw-r--r-- | xmake/modules/core/tools/armclang.lua | 25 | ||||
| -rw-r--r-- | xmake/modules/core/tools/armlink.lua | 54 | ||||
| -rw-r--r-- | xmake/modules/core/tools/sdcc.lua | 5 | ||||
| -rw-r--r-- | xmake/modules/detect/sdks/find_mdk.lua | 123 | ||||
| -rw-r--r-- | xmake/modules/detect/tools/find_armar.lua | 65 | ||||
| -rw-r--r-- | xmake/modules/detect/tools/find_armasm.lua | 65 | ||||
| -rw-r--r-- | xmake/modules/detect/tools/find_armcc.lua | 60 | ||||
| -rw-r--r-- | xmake/modules/detect/tools/find_armclang.lua | 59 | ||||
| -rw-r--r-- | xmake/modules/detect/tools/find_armlink.lua | 65 |
12 files changed, 888 insertions, 2 deletions
diff --git a/xmake/modules/core/tools/armar.lua b/xmake/modules/core/tools/armar.lua new file mode 100644 index 000000000..66740c11a --- /dev/null +++ b/xmake/modules/core/tools/armar.lua @@ -0,0 +1,26 @@ +--!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 ruki +-- @file armar.lua +-- + +inherit("ar") + +function init(self) + _super.init(self) +end + diff --git a/xmake/modules/core/tools/armasm.lua b/xmake/modules/core/tools/armasm.lua new file mode 100644 index 000000000..181d8b7e8 --- /dev/null +++ b/xmake/modules/core/tools/armasm.lua @@ -0,0 +1,167 @@ +--!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 ruki +-- @file armasm.lua +-- + +-- imports +import("core.base.option") +import("core.base.global") +import("core.language.language") +import("utils.progress") + +-- init it +function init(self) +end + +-- make the symbol flag +function nf_symbol(self, level) + -- only for source kind + local kind = self:kind() + if language.sourcekinds()[kind] then + local maps = _g.symbol_maps + if not maps then + maps = + { + debug = "-g" + } + _g.symbol_maps = maps + end + return maps[level .. '_' .. kind] or maps[level] + end +end + +-- make the optimize flag +function nf_optimize(self, level) + local maps = + { + none = "-O0" + , fast = "-O1" + , faster = "-O2" + , fastest = "-O3" + , smallest = "-Os" + , aggressive = "-Ofast" + } + return maps[level] +end + +-- make the language flag +function nf_language(self, stdname) + + -- the stdc maps + if _g.cmaps == nil then + _g.cmaps = + { + ansi = "-c89" + , c89 = "-c89" + , gnu89 = "-c89" + , c99 = "-c99" + , gnu99 = "-c99" + , c11 = "-c11" + , gnu11 = "-c11" + , clatest = {"-c11", "-c99", "-c89"} + , gnulatest = {"-c11", "-c99", "-c89"} + } + end + local maps = _g.cmaps + local result = maps[stdname] + if type(result) == "table" then + for _, v in ipairs(result) do + if self:has_flags(v, "cxflags") then + result = v + maps[stdname] = result + return result + end + end + else + return result + end +end + +-- make the includedir flag +function nf_includedir(self, dir) + return {"-I" .. dir} +end + +-- make the sysincludedir flag +function nf_sysincludedir(self, dir) + return nf_includedir(self, dir) +end + +-- make the compile arguments list +function compargv(self, sourcefile, objectfile, flags) + return self:program(), table.join(flags, "-o", objectfile, sourcefile) +end + +-- compile the source file +function compile(self, sourcefile, objectfile, dependinfo, flags) + + -- ensure the object directory + os.mkdir(path.directory(objectfile)) + + -- compile it + try + { + function () + local outdata, errdata = os.iorunv(compargv(self, sourcefile, objectfile, flags)) + return (outdata or "") .. (errdata or "") + end, + catch + { + function (errors) + + -- try removing the old object file for forcing to rebuild this source file + os.tryrm(objectfile) + + -- find the start line of error + local lines = tostring(errors):split("\n") + local start = 0 + for index, line in ipairs(lines) do + if line:find("error:", 1, true) or line:find("错误:", 1, true) then + start = index + break + end + end + + -- get 16 lines of errors + if start > 0 or not option.get("verbose") then + if start == 0 then start = 1 end + errors = table.concat(table.slice(lines, start, start + ((#lines - start > 16) and 16 or (#lines - start))), "\n") + end + + -- raise compiling errors + raise(errors) + end + }, + finally + { + function (ok, warnings) + + -- print some warnings + if warnings and #warnings > 0 and (option.get("verbose") or option.get("warning") or global.get("build_warning")) then + if progress.showing_without_scroll() then + print("") + end + cprint("${color.warning}%s", table.concat(table.slice(warnings:split('\n'), 1, 8), '\n')) + end + end + } + } +end + + + diff --git a/xmake/modules/core/tools/armcc.lua b/xmake/modules/core/tools/armcc.lua new file mode 100644 index 000000000..6215242ec --- /dev/null +++ b/xmake/modules/core/tools/armcc.lua @@ -0,0 +1,176 @@ +--!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 ruki +-- @file armcc.lua +-- + +-- imports +import("core.base.option") +import("core.base.global") +import("core.language.language") +import("utils.progress") + +-- init it +function init(self) +end + +-- make the symbol flag +function nf_symbol(self, level) + -- only for source kind + local kind = self:kind() + if language.sourcekinds()[kind] then + local maps = _g.symbol_maps + if not maps then + maps = + { + debug = "-g" + } + _g.symbol_maps = maps + end + return maps[level .. '_' .. kind] or maps[level] + end +end + +-- make the optimize flag +function nf_optimize(self, level) + local maps = + { + none = "-O0" + , fast = "-O1" + , faster = "-O2" + , fastest = "-O3" + , smallest = "-Os" + , aggressive = "-Ofast" + } + return maps[level] +end + +-- make the language flag +function nf_language(self, stdname) + + -- the stdc maps + if _g.cmaps == nil then + _g.cmaps = + { + ansi = "-c89" + , c89 = "-c89" + , gnu89 = "-c89" + , c99 = "-c99" + , gnu99 = "-c99" + , c11 = "-c11" + , gnu11 = "-c11" + , clatest = {"-c11", "-c99", "-c89"} + , gnulatest = {"-c11", "-c99", "-c89"} + } + end + local maps = _g.cmaps + local result = maps[stdname] + if type(result) == "table" then + for _, v in ipairs(result) do + if self:has_flags(v, "cxflags") then + result = v + maps[stdname] = result + return result + end + end + else + return result + end +end + +-- make the define flag +function nf_define(self, macro) + return "-D" .. macro +end + +-- make the undefine flag +function nf_undefine(self, macro) + return "-U" .. macro +end + +-- make the includedir flag +function nf_includedir(self, dir) + return {"-I" .. dir} +end + +-- make the sysincludedir flag +function nf_sysincludedir(self, dir) + return nf_includedir(self, dir) +end + +-- make the compile arguments list +function compargv(self, sourcefile, objectfile, flags) + return self:program(), table.join("-c", flags, "-o", objectfile, sourcefile) +end + +-- compile the source file +function compile(self, sourcefile, objectfile, dependinfo, flags) + + -- ensure the object directory + os.mkdir(path.directory(objectfile)) + + -- compile it + try + { + function () + local outdata, errdata = os.iorunv(compargv(self, sourcefile, objectfile, flags)) + return (outdata or "") .. (errdata or "") + end, + catch + { + function (errors) + + -- try removing the old object file for forcing to rebuild this source file + os.tryrm(objectfile) + + -- find the start line of error + local lines = tostring(errors):split("\n") + local start = 0 + for index, line in ipairs(lines) do + if line:find("error:", 1, true) or line:find("错误:", 1, true) then + start = index + break + end + end + + -- get 16 lines of errors + if start > 0 or not option.get("verbose") then + if start == 0 then start = 1 end + errors = table.concat(table.slice(lines, start, start + ((#lines - start > 16) and 16 or (#lines - start))), "\n") + end + + -- raise compiling errors + raise(errors) + end + }, + finally + { + function (ok, warnings) + + -- print some warnings + if warnings and #warnings > 0 and (option.get("verbose") or option.get("warning") or global.get("build_warning")) then + if progress.showing_without_scroll() then + print("") + end + cprint("${color.warning}%s", table.concat(table.slice(warnings:split('\n'), 1, 8), '\n')) + end + end + } + } +end + + diff --git a/xmake/modules/core/tools/armclang.lua b/xmake/modules/core/tools/armclang.lua new file mode 100644 index 000000000..42bec8fd5 --- /dev/null +++ b/xmake/modules/core/tools/armclang.lua @@ -0,0 +1,25 @@ +--!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 ruki +-- @file armclang.lua +-- + +inherit("gcc") + +function init(self) + _super.init(self) +end diff --git a/xmake/modules/core/tools/armlink.lua b/xmake/modules/core/tools/armlink.lua new file mode 100644 index 000000000..02c2b4800 --- /dev/null +++ b/xmake/modules/core/tools/armlink.lua @@ -0,0 +1,54 @@ +--!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 ruki +-- @file armlink.lua +-- + +-- imports +import("core.base.option") +import("core.base.global") +import("utils.progress") + +function init(self) +end + +-- make the link flag +function nf_link(self, lib) + return "lib" .. lib .. ".a" +end + +-- make the syslink flag +function nf_syslink(self, lib) + return nf_link(self, lib) +end + +-- make the linkdir flag +function nf_linkdir(self, dir) + return {"--userlibpath", dir} +end + +-- make the link arguments list +function linkargv(self, objectfiles, targetkind, targetfile, flags) + return self:program(), table.join("-o", targetfile, objectfiles, flags) +end + +-- link the target file +function link(self, objectfiles, targetkind, targetfile, flags) + os.mkdir(path.directory(targetfile)) + os.runv(linkargv(self, objectfiles, targetkind, targetfile, flags)) +end + diff --git a/xmake/modules/core/tools/sdcc.lua b/xmake/modules/core/tools/sdcc.lua index 82d6cd78a..0153ed652 100644 --- a/xmake/modules/core/tools/sdcc.lua +++ b/xmake/modules/core/tools/sdcc.lua @@ -126,11 +126,12 @@ function nf_language(self, stdname) if self:has_flags(v, "cxflags") then result = v maps[stdname] = result - break + return result end end + else + return result end - return result end -- make the define flag diff --git a/xmake/modules/detect/sdks/find_mdk.lua b/xmake/modules/detect/sdks/find_mdk.lua new file mode 100644 index 000000000..a2af360f1 --- /dev/null +++ b/xmake/modules/detect/sdks/find_mdk.lua @@ -0,0 +1,123 @@ +--!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 ruki +-- @file find_mdk.lua +-- + +-- imports +import("lib.detect.find_path") +import("core.base.option") +import("core.base.semver") +import("core.project.config") +import("core.cache.detectcache") + +-- find MDK directory +function _find_sdkdir(sdkdir) + local paths = { + "$(reg HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\Keil\\Products\\MDK;Path)" + } + if sdkdir then + table.insert(paths, 1, sdkdir) + end + local result = find_path("armcc", paths) or find_path("armclang", paths) + if not result then + -- find it from some logical drives paths + paths = {} + for _, logical_drive in ipairs(winos.logical_drives()) do + table.insert(paths, path.join(logical_drive, "Keil_v5", "ARM")) + end + result = find_path("armcc", paths) or find_path("armclang", paths) + end + return result +end + +-- find MDK toolchains +function _find_mdk(sdkdir) + + -- find mdk directory + sdkdir = _find_sdkdir(sdkdir) + if not sdkdir or not os.isdir(sdkdir) then + return nil + end + local result = {sdkdir = sdkdir} + + -- get sdk version + local sdkver = winos.registry_query("HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\Keil\\Products\\MDK;Version") + if sdkver then + sdkver = semver.match(sdkver, 1, "V%d+%.%d+") + if sdkver then + result.sdkver = sdkver:rawstr() + end + end + + -- armcc sdk directory + local sdkdir_armcc = path.join(sdkdir, "armcc") + if os.isdir(sdkdir_armcc) and os.isfile(path.join(sdkdir_armcc, "bin", "armcc.exe")) then + result.sdkdir_armcc = sdkdir_armcc + end + + -- armclang sdk directory + local sdkdir_armclang = path.join(sdkdir, "armclang") + if os.isdir(sdkdir_armclang) and os.isfile(path.join(sdkdir_armclang, "bin", "armclang.exe")) then + result.sdkdir_armclang = sdkdir_armclang + end + return result +end + +-- find MDK toolchains +-- +-- @param sdkdir the MDK directory +-- @param opt the argument options, e.g. {verbose = true, force = false} +-- +-- @return the MDK toolchains. e.g. {sdkver = ..., sdkdir, sdkdir_armcc, sdkdir_armclang} +-- +-- @code +-- +-- local toolchains = find_mdk("~/mdk") +-- +-- @endcode +-- +function main(sdkdir, opt) + + -- init arguments + opt = opt or {} + + -- attempt to load cache first + local key = "detect.sdks.find_mdk" + local cacheinfo = detectcache:get(key) or {} + if not opt.force and cacheinfo.mdk and cacheinfo.mdk.sdkdir and os.isdir(cacheinfo.mdk.sdkdir) then + return cacheinfo.mdk + end + + -- find mdk + local mdk = _find_mdk(sdkdir or config.get("sdk")) + if mdk then + if opt.verbose or option.get("verbose") then + cprint("checking for MDK directory ... ${color.success}%s", mdk.sdkdir) + end + else + if opt.verbose or option.get("verbose") then + cprint("checking for MDK directory ... ${color.nothing}${text.nothing}") + end + end + + -- save to cache + cacheinfo.mdk = mdk or false + detectcache:set(key, cacheinfo) + detectcache:save() + return mdk +end diff --git a/xmake/modules/detect/tools/find_armar.lua b/xmake/modules/detect/tools/find_armar.lua new file mode 100644 index 000000000..725d6a988 --- /dev/null +++ b/xmake/modules/detect/tools/find_armar.lua @@ -0,0 +1,65 @@ +--!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 ruki +-- @file find_armar.lua +-- + +-- imports +import("lib.detect.find_program") +import("lib.detect.find_programver") +import("detect.sdks.find_mdk") + +-- find armar +-- +-- @param opt the argument options, e.g. {version = true} +-- +-- @return program, version +-- +-- @code +-- +-- local armar = find_armar() +-- local armar, version = find_armar({program = "armar", version = true}) +-- +-- @endcode +-- +function main(opt) + + -- init options + opt = opt or {} + opt.check = "-h" + + -- find program + local program = find_program(opt.program or "armar.exe", opt) + if not program then + local mdk = find_mdk() + if mdk then + if mdk.sdkdir_armcc then + program = find_program(path.join(mdk.sdkdir_armcc, "bin", "armar.exe"), opt) + end + if not program and mdk.sdkdir_armclang then + program = find_program(path.join(mdk.sdkdir_armclang, "bin", "armar.exe"), opt) + end + end + end + + -- find program version + local version = nil + if program and opt.version then + version = find_programver(program, opt) + end + return program, version +end diff --git a/xmake/modules/detect/tools/find_armasm.lua b/xmake/modules/detect/tools/find_armasm.lua new file mode 100644 index 000000000..280333195 --- /dev/null +++ b/xmake/modules/detect/tools/find_armasm.lua @@ -0,0 +1,65 @@ +--!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 ruki +-- @file find_armasm.lua +-- + +-- imports +import("lib.detect.find_program") +import("lib.detect.find_programver") +import("detect.sdks.find_mdk") + +-- find armasm +-- +-- @param opt the argument options, e.g. {version = true} +-- +-- @return program, version +-- +-- @code +-- +-- local armasm = find_armasm() +-- local armasm, version = find_armasm({program = "armasm", version = true}) +-- +-- @endcode +-- +function main(opt) + + -- init options + opt = opt or {} + opt.check = "-h" + + -- find program + local program = find_program(opt.program or "armasm.exe", opt) + if not program then + local mdk = find_mdk() + if mdk then + if mdk.sdkdir_armcc then + program = find_program(path.join(mdk.sdkdir_armcc, "bin", "armasm.exe"), opt) + end + if not program and mdk.sdkdir_armclang then + program = find_program(path.join(mdk.sdkdir_armclang, "bin", "armasm.exe"), opt) + end + end + end + + -- find program version + local version = nil + if program and opt.version then + version = find_programver(program, opt) + end + return program, version +end diff --git a/xmake/modules/detect/tools/find_armcc.lua b/xmake/modules/detect/tools/find_armcc.lua new file mode 100644 index 000000000..584e9b3a9 --- /dev/null +++ b/xmake/modules/detect/tools/find_armcc.lua @@ -0,0 +1,60 @@ +--!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 ruki +-- @file find_armcc.lua +-- + +-- imports +import("lib.detect.find_program") +import("lib.detect.find_programver") +import("detect.sdks.find_mdk") + +-- find armcc +-- +-- @param opt the argument options, e.g. {version = true} +-- +-- @return program, version +-- +-- @code +-- +-- local armcc = find_armcc() +-- local armcc, version = find_armcc({program = "armcc", version = true}) +-- +-- @endcode +-- +function main(opt) + + -- init options + opt = opt or {} + opt.check = "-h" + + -- find program + local program = find_program(opt.program or "armcc.exe", opt) + if not program then + local mdk = find_mdk() + if mdk and mdk.sdkdir_armcc then + program = find_program(path.join(mdk.sdkdir_armcc, "bin", "armcc.exe"), opt) + end + end + + -- find program version + local version = nil + if program and opt.version then + version = find_programver(program, opt) + end + return program, version +end diff --git a/xmake/modules/detect/tools/find_armclang.lua b/xmake/modules/detect/tools/find_armclang.lua new file mode 100644 index 000000000..ed6b0bbfe --- /dev/null +++ b/xmake/modules/detect/tools/find_armclang.lua @@ -0,0 +1,59 @@ +--!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 ruki +-- @file find_armclang.lua +-- + +-- imports +import("lib.detect.find_program") +import("lib.detect.find_programver") +import("detect.sdks.find_mdk") + +-- find armclang +-- +-- @param opt the argument options, e.g. {version = true} +-- +-- @return program, version +-- +-- @code +-- +-- local armclang = find_armclang() +-- local armclang, version = find_armclang({program = "armclang", version = true}) +-- +-- @endcode +-- +function main(opt) + + -- init options + opt = opt or {} + + -- find program + local program = find_program(opt.program or "armclang.exe", opt) + if not program then + local mdk = find_mdk() + if mdk and mdk.sdkdir_armclang then + program = find_program(path.join(mdk.sdkdir_armclang, "bin", "armclang.exe"), opt) + end + end + + -- find program version + local version = nil + if program and opt.version then + version = find_programver(program, opt) + end + return program, version +end diff --git a/xmake/modules/detect/tools/find_armlink.lua b/xmake/modules/detect/tools/find_armlink.lua new file mode 100644 index 000000000..3ab383c86 --- /dev/null +++ b/xmake/modules/detect/tools/find_armlink.lua @@ -0,0 +1,65 @@ +--!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 ruki +-- @file find_armlink.lua +-- + +-- imports +import("lib.detect.find_program") +import("lib.detect.find_programver") +import("detect.sdks.find_mdk") + +-- find armlink +-- +-- @param opt the argument options, e.g. {version = true} +-- +-- @return program, version +-- +-- @code +-- +-- local armlink = find_armlink() +-- local armlink, version = find_armlink({program = "armlink", version = true}) +-- +-- @endcode +-- +function main(opt) + + -- init options + opt = opt or {} + opt.check = "-h" + + -- find program + local program = find_program(opt.program or "armlink.exe", opt) + if not program then + local mdk = find_mdk() + if mdk then + if mdk.sdkdir_armcc then + program = find_program(path.join(mdk.sdkdir_armcc, "bin", "armlink.exe"), opt) + end + if not program and mdk.sdkdir_armclang then + program = find_program(path.join(mdk.sdkdir_armclang, "bin", "armlink.exe"), opt) + end + end + end + + -- find program version + local version = nil + if program and opt.version then + version = find_programver(program, opt) + end + return program, version +end |
