diff options
| author | DawnManget <[email protected]> | 2022-05-09 22:24:35 +0800 |
|---|---|---|
| committer | DawnManget <[email protected]> | 2022-05-09 22:24:35 +0800 |
| commit | a0a57a74cc301468d21f11cd5d78a272cce561b5 (patch) | |
| tree | 3c905bdf1a18cc188ae73915d3d840ff4e924974 /xmake/modules/detect | |
| parent | 6f789c9db16eadf5c81b63221cddff59988da465 (diff) | |
add keil-c51 toolchain & rules
Diffstat (limited to 'xmake/modules/detect')
| -rw-r--r-- | xmake/modules/detect/sdks/find_c51.lua | 124 | ||||
| -rw-r--r-- | xmake/modules/detect/tools/find_bl51.lua | 80 | ||||
| -rw-r--r-- | xmake/modules/detect/tools/find_c51.lua | 73 | ||||
| -rw-r--r-- | xmake/modules/detect/tools/find_oh51.lua | 87 |
4 files changed, 364 insertions, 0 deletions
diff --git a/xmake/modules/detect/sdks/find_c51.lua b/xmake/modules/detect/sdks/find_c51.lua new file mode 100644 index 000000000..3de478507 --- /dev/null +++ b/xmake/modules/detect/sdks/find_c51.lua @@ -0,0 +1,124 @@ +--!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. +-- Based On template file xmake\modules\detect\sdks\find_mdk.lua +-- +-- @author DawnMagnet +-- @file find_c51.lua +-- + +-- imports +import("lib.detect.find_path") +import("core.base.option") +import("core.base.semver") +import("core.project.config") +import("core.cache.detectcache") + +-- find C51 directory +function _find_sdkdir(sdkdir) + local paths = { + "$(reg HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\Keil\\Products\\C51;Path)" + } + if sdkdir then + table.insert(paths, 1, sdkdir) + end + local result = find_path("C51", 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", "C51", "BIN")) + end + result = find_path("C51.exe", paths) + end + return result +end + +-- find C51 toolchains +function _find_c51(sdkdir) + -- find C51 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\\C51;Version") + if sdkver then + sdkver = semver.match(sdkver, 1, "V%d+%.%d+") + if sdkver then + result.sdkver = sdkver:rawstr() + end + end + + -- c51(exe) sdk directory + local sdkdir_c51 = path.join(sdkdir, "c51") + if os.isdir(sdkdir_c51) and os.isfile(path.join(sdkdir_c51, "bin", "c51.exe")) then + result.sdkdir_c51 = sdkdir_c51 + end + + -- a51 sdk directory + local sdkdir_a51 = path.join(sdkdir, "a51") + if os.isdir(sdkdir_a51) and os.isfile(path.join(sdkdir_a51, "bin", "a51.exe")) then + result.sdkdir_a51 = sdkdir_a51 + end + return result +end + +-- find c51 toolchains +-- +-- @param sdkdir the C51 directory +-- @param opt the argument options, e.g. {verbose = true, force = false} +-- +-- @return the C51 toolchains. e.g. {sdkver = ..., sdkdir, sdkdir_armcc, sdkdir_armclang, sdkdir_c51} +-- +-- @code +-- +-- local toolchains = find_c51("~/c51") +-- +-- @endcode +-- +function main(sdkdir, opt) + + -- init arguments + opt = opt or {} + + -- attempt to load cache first + local key = "detect.sdks.find_c51" + + local cacheinfo = detectcache:get(key) or {} + if not opt.force and cacheinfo.c51 and cacheinfo.c51.sdkdir and os.isdir(cacheinfo.c51.sdkdir) then + return cacheinfo.c51 + end + + -- find c51 + local c51 = _find_c51(sdkdir or config.get("sdk")) + if c51 then + if opt.verbose or option.get("verbose") then + cprint("checking for c51 directory ... ${color.success}%s", c51.sdkdir) + end + else + if opt.verbose or option.get("verbose") then + cprint("checking for c51 directory ... ${color.nothing}${text.nothing}") + end + end + + -- save to cache + cacheinfo.c51 = c51 or false + detectcache:set(key, cacheinfo) + detectcache:save() + return c51 +end
\ No newline at end of file diff --git a/xmake/modules/detect/tools/find_bl51.lua b/xmake/modules/detect/tools/find_bl51.lua new file mode 100644 index 000000000..d44a1eb3c --- /dev/null +++ b/xmake/modules/detect/tools/find_bl51.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 DawnMagnet +-- @file find_bl51.lua + +-- imports +import("lib.detect.find_program") +import("lib.detect.find_programver") +import("detect.sdks.find_c51") + +function _check(program) + import("detect.tools.find_c51") + -- make temp source file + local c51 = assert(find_c51()) + local temp_prefix = os.tmpfile() + local cfile = temp_prefix .. ".c" + local objfile = temp_prefix .. ".obj" + local lstfile = temp_prefix .. ".lst" + local tmpfile = "." .. temp_prefix .. ".un~" + local binfile = temp_prefix .. "" + local m51file = temp_prefix .. ".m51" + -- write test code + io.writefile(cfile, "void main() {}") + -- archive it + os.runv(c51, {cfile}) + os.runv(program, {objfile, "TO", binfile}) + -- remove files + os.rm(cfile) + os.rm(objfile) + os.rm(lstfile) + os.rm(tmpfile) + os.rm(binfile) + os.rm(m51file) +end +-- find bl51 +-- +-- @param opt the argument options, e.g. {version = true} +-- +-- @return program, version +-- +-- @code +-- +-- local bl51 = find_bl51() +-- local bl51, version = find_bl51() +-- +-- @endcode +-- +function main(opt) + + -- init options + opt = opt or {} + opt.check = opt.check or _check + local program = find_program(opt.program or "bl51.exe", opt) + if not program then + local c51 = find_c51() + if c51 then + if c51.sdkdir_c51 then + program = find_program(path.join(c51.sdkdir_c51, "bin", "bl51.exe"), opt) + end + if not program and c51.sdkdir_a51 then + program = find_program(path.join(c51.sdkdir_a51, "bin", "bl51.exe"), opt) + end + end + end + return program, nil +end
\ No newline at end of file diff --git a/xmake/modules/detect/tools/find_c51.lua b/xmake/modules/detect/tools/find_c51.lua new file mode 100644 index 000000000..954f03df6 --- /dev/null +++ b/xmake/modules/detect/tools/find_c51.lua @@ -0,0 +1,73 @@ +--!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 DawnMagnet +-- @file find_c51.lua +-- + +-- imports +import("lib.detect.find_program") +import("lib.detect.find_programver") +local c51_module = import("detect.sdks.find_c51") + +function _check(program) + -- make temp source file + local cfile = os.tmpfile() .. ".c" + local objfile = os.tmpfile() .. ".obj" + local lstfile = os.tmpfile() .. ".c" + local tmpfile = "." .. os.tmpfile() .. ".un~" + -- write test code + io.writefile(cfile, "void main() {}") + -- archive it + os.runv(program, {cfile}) + -- remove files + os.rm(cfile) + os.rm(objfile) + os.rm(lstfile) + os.rm(tmpfile) +end +-- find c51 +-- +-- @param opt the argument options, e.g. {version = true} +-- +-- @return program, version +-- +-- @code +-- +-- local c51 = find_c51() +-- local c51, version = find_c51() +-- +-- @endcode +-- +function main(opt) + + -- init options + opt = opt or {} + opt.check = opt.check or _check + local program = find_program(opt.program or "c51.exe", opt) + if not program then + local c51_module = c51_module.find_c51() + if c51_module then + if c51_module.sdkdir_c51 then + program = find_program(path.join(c51_module.sdkdir_c51, "bin", "c51.exe"), opt) + end + if not program and c51_module.sdkdir_a51 then + program = find_program(path.join(c51_module.sdkdir_a51, "bin", "c51.exe"), opt) + end + end + end + return program, nil +end
\ No newline at end of file diff --git a/xmake/modules/detect/tools/find_oh51.lua b/xmake/modules/detect/tools/find_oh51.lua new file mode 100644 index 000000000..df2a985b8 --- /dev/null +++ b/xmake/modules/detect/tools/find_oh51.lua @@ -0,0 +1,87 @@ +--!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 DawnMagnet +-- @file find_oh51.lua +-- OBJECT TO HEX FILE CONVERTER OH51 + +-- imports +import("lib.detect.find_program") +import("lib.detect.find_programver") +import("detect.sdks.find_c51") + +function _check(program) + import("detect.tools.find_c51") + import("detect.tools.find_bl51") + + -- make temp source file + local c51 = assert(find_c51()) + local bl51 = assert(find_bl51()) + local temp_prefix = os.tmpfile() + local cfile = temp_prefix .. ".c" + local objfile = temp_prefix .. ".obj" + local lstfile = temp_prefix .. ".lst" + local tmpfile = "." .. temp_prefix .. ".un~" + local binfile = temp_prefix .. "" + local m51file = temp_prefix .. ".m51" + local hexfile = temp_prefix .. ".hex" + -- write test code + io.writefile(cfile, "void main() {}") + -- archive it + os.runv(c51, {cfile}) + os.runv(bl51, {objfile, "TO", binfile}) + os.runv(program, {binfile}) + -- remove files + os.rm(cfile) + os.rm(objfile) + os.rm(lstfile) + os.rm(tmpfile) + os.rm(binfile) + os.rm(m51file) + os.rm(hexfile) +end +-- find oh51 +-- +-- @param opt the argument options, e.g. {version = true} +-- +-- @return program, version +-- +-- @code +-- +-- local oh51 = find_oh51() +-- local oh51, version = find_oh51() +-- +-- @endcode +-- +function main(opt) + + -- init options + opt = opt or {} + opt.check = opt.check or _check + local program = find_program(opt.program or "oh51.exe", opt) + if not program then + local c51 = find_c51() + if c51 then + if c51.sdkdir_c51 then + program = find_program(path.join(c51.sdkdir_c51, "bin", "oh51.exe"), opt) + end + if not program and c51.sdkdir_a51 then + program = find_program(path.join(c51.sdkdir_a51, "bin", "oh51.exe"), opt) + end + end + end + return program, nil +end
\ No newline at end of file |
