summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDawnManget <[email protected]>2022-05-10 10:45:43 +0800
committerDawnManget <[email protected]>2022-05-10 10:45:43 +0800
commit8d0fb42d11874dd59bac82b45d1ca81e0df01780 (patch)
treefd0e8c7db3ee43fc434fe089cf56f0eeed261fa6
parenta0a57a74cc301468d21f11cd5d78a272cce561b5 (diff)
review: add keil-c51 toolchain & rules
-rw-r--r--xmake/modules/core/tools/bl51.lua24
-rw-r--r--xmake/modules/core/tools/c51.lua93
-rw-r--r--xmake/modules/core/tools/oh51.lua61
-rw-r--r--xmake/modules/detect/tools/find_bl51.lua25
-rw-r--r--xmake/modules/detect/tools/find_c51.lua28
-rw-r--r--xmake/modules/detect/tools/find_oh51.lua33
-rw-r--r--xmake/rules/c51/xmake.lua8
-rw-r--r--xmake/toolchains/c51/xmake.lua41
8 files changed, 57 insertions, 256 deletions
diff --git a/xmake/modules/core/tools/bl51.lua b/xmake/modules/core/tools/bl51.lua
index 3b49bf0e3..70c04385b 100644
--- a/xmake/modules/core/tools/bl51.lua
+++ b/xmake/modules/core/tools/bl51.lua
@@ -25,29 +25,7 @@ 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 runtime flag
---function nf_runtime(self, runtime)
--- if runtime == "microlib" then
--- return "--library_type=microlib"
--- end
---end
---
+
-- make the link arguments list
function linkargv(self, objectfiles, targetkind, targetfile, flags)
return self:program(), table.join(objectfiles, "TO", targetfile)
diff --git a/xmake/modules/core/tools/c51.lua b/xmake/modules/core/tools/c51.lua
index 31f09188c..1c87bbb28 100644
--- a/xmake/modules/core/tools/c51.lua
+++ b/xmake/modules/core/tools/c51.lua
@@ -27,98 +27,13 @@ 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
---
-
--- compile the source file
----- make the compile arguments list
+-- make the compile arguments list
function compargv(self, sourcefile, objectfile, flags)
return self:program(), table.join(sourcefile, flags)
end
+
+-- compile the source file
function compile(self, sourcefile, objectfile, dependinfo, flags)
-- ensure the object directory
@@ -128,7 +43,7 @@ function compile(self, sourcefile, objectfile, dependinfo, flags)
try
{
function ()
- local realsourcefile = string.gsub(objectfile, "\\.obj$", "")
+ local realsourcefile = objectfile:gsub("\\.obj$", "")
os.cp(sourcefile, realsourcefile)
local outdata, errdata = os.iorunv(compargv(self, realsourcefile, objectfile, dependinfo, flags))
return (outdata or "") .. (errdata or "")
diff --git a/xmake/modules/core/tools/oh51.lua b/xmake/modules/core/tools/oh51.lua
deleted file mode 100644
index 2db696488..000000000
--- a/xmake/modules/core/tools/oh51.lua
+++ /dev/null
@@ -1,61 +0,0 @@
---!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 oh51.lua
--- OBJECT TO HEX FILE CONVERTER OH51 V2.7.0.0
-
--- imports
-import("core.tool.compiler")
-import("utils.progress")
-
--- init it
-function init(self)
-end
-
--- make the strip flag
-function strip(self, level)
- local maps =
- {
- debug = "-S"
- , all = "-s"
- }
- return maps[level]
-end
-
--- make the link arguments list
-function linkargv(self, objectfiles, targetkind, targetfile, flags, opt)
- opt = opt or {}
- local argv = table.join(flags, targetfile, objectfiles)
- if is_host("windows") and not opt.rawargs then
- argv = winos.cmdargv(argv, {escape = true})
- end
- return self:program(), argv
-end
-
--- link the library file
-function link(self, objectfiles, targetkind, targetfile, flags)
- os.mkdir(path.directory(targetfile))
-
- -- @note remove the previous archived file first to force recreating a new file
- os.tryrm(targetfile)
-
- -- link it
- local program, argv = linkargv(self, objectfiles, targetkind, targetfile, flags)
- os.runv(program, argv, {envs = self:runenvs()})
-end
-
-
diff --git a/xmake/modules/detect/tools/find_bl51.lua b/xmake/modules/detect/tools/find_bl51.lua
index d44a1eb3c..001d1ed13 100644
--- a/xmake/modules/detect/tools/find_bl51.lua
+++ b/xmake/modules/detect/tools/find_bl51.lua
@@ -21,30 +21,23 @@
import("lib.detect.find_program")
import("lib.detect.find_programver")
import("detect.sdks.find_c51")
+import("lib.detect.find_tool")
function _check(program)
- import("detect.tools.find_c51")
+ local c51 = assert(find_tool("c51"), "c51 not found")
-- 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"
+ local tmpdir = os.tmpfile()
+ os.mkdir(tmpdir)
+ local cfile = path.join(tmpdir, "test.c")
+ local objfile = path.join(tmpdir, "test.obj")
+ local binfile = path.join(tmpdir, "test")
-- write test code
io.writefile(cfile, "void main() {}")
-- archive it
- os.runv(c51, {cfile})
+ os.runv(c51.program, {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)
+ os.rmdir(tmpdir)
end
-- find bl51
--
diff --git a/xmake/modules/detect/tools/find_c51.lua b/xmake/modules/detect/tools/find_c51.lua
index 954f03df6..616b81a4d 100644
--- a/xmake/modules/detect/tools/find_c51.lua
+++ b/xmake/modules/detect/tools/find_c51.lua
@@ -21,23 +21,19 @@
-- imports
import("lib.detect.find_program")
import("lib.detect.find_programver")
-local c51_module = import("detect.sdks.find_c51")
+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~"
+ local tmpdir = os.tmpfile()
+ os.mkdir(tmpdir)
+ local cfile = path.join(tmpdir, "test.c")
-- 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)
+ os.rmdir(tmpdir)
end
-- find c51
--
@@ -57,15 +53,15 @@ function main(opt)
-- init options
opt = opt or {}
opt.check = opt.check or _check
- local program = find_program(opt.program or "c51.exe", opt)
+ local program = find_program(opt.program or "c51", 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)
+ local c51 = find_c51()
+ if c51 then
+ if c51.sdkdir_c51 then
+ program = find_program(path.join(c51.sdkdir_c51, "bin", "c51"), opt)
end
- if not program and c51_module.sdkdir_a51 then
- program = find_program(path.join(c51_module.sdkdir_a51, "bin", "c51.exe"), opt)
+ if not program and c51.sdkdir_a51 then
+ program = find_program(path.join(c51.sdkdir_a51, "bin", "c51"), opt)
end
end
end
diff --git a/xmake/modules/detect/tools/find_oh51.lua b/xmake/modules/detect/tools/find_oh51.lua
index df2a985b8..dc3310efe 100644
--- a/xmake/modules/detect/tools/find_oh51.lua
+++ b/xmake/modules/detect/tools/find_oh51.lua
@@ -22,36 +22,25 @@
import("lib.detect.find_program")
import("lib.detect.find_programver")
import("detect.sdks.find_c51")
+import("lib.detect.find_tool")
function _check(program)
- import("detect.tools.find_c51")
- import("detect.tools.find_bl51")
-
+ local c51 = assert(find_tool("c51"), "c51 not found")
+ local bl51 = assert(find_tool("bl51"), "bl51 not found")
-- 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"
+ local tmpdir = os.tmpfile()
+ os.mkdir(tmpdir)
+ local cfile = path.join(tmpdir, "test.c")
+ local objfile = path.join(tmpdir, "test.obj")
+ local binfile = path.join(tmpdir, "test")
-- write test code
io.writefile(cfile, "void main() {}")
-- archive it
- os.runv(c51, {cfile})
- os.runv(bl51, {objfile, "TO", binfile})
+ os.runv(c51.program, {cfile})
+ os.runv(bl51.program, {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)
+ os.rmdir(tmpdir)
end
-- find oh51
--
diff --git a/xmake/rules/c51/xmake.lua b/xmake/rules/c51/xmake.lua
index 5f47de159..c274b2333 100644
--- a/xmake/rules/c51/xmake.lua
+++ b/xmake/rules/c51/xmake.lua
@@ -1,7 +1,5 @@
rule("c51.static")
on_load(function (target)
-
-
-- we disable checking flags for cross toolchain automatically
target:set("policy", "check.auto_ignore_flags", false)
target:set("policy", "check.auto_map_flags", false)
@@ -14,8 +12,8 @@ rule("c51.static")
end)
after_link(function(target)
- import("detect.tools.find_oh51")
- oh = find_oh51()
- os.iorunv(oh, {target:targetfile()})
+ import("lib.detect.find_tool")
+ local oh = assert(find_tool("oh51"), "oh51 not found")
+ os.iorunv(oh.program, {target:targetfile()})
cprint("${color.warning} hex file generated %s", target:targetfile() .. ".hex")
end) \ No newline at end of file
diff --git a/xmake/toolchains/c51/xmake.lua b/xmake/toolchains/c51/xmake.lua
index fd6ef11dd..dc24b02ac 100644
--- a/xmake/toolchains/c51/xmake.lua
+++ b/xmake/toolchains/c51/xmake.lua
@@ -20,31 +20,24 @@
toolchain("c51")
-set_homepage("https://www.keil.com/c51/")
-set_description("Keil development tools for the 8051 Microcontroller Architecture")
+ set_homepage("https://www.keil.com/c51/")
+ set_description("Keil development tools for the 8051 Microcontroller Architecture")
-set_kind("cross")
-set_kind("standalone")
+ set_kind("cross")
+ set_kind("standalone")
-set_toolset("cc", "c51")
-set_toolset("cxx", "c51")
-set_toolset("ld", "bl51")
---set_toolset("ar", "oh51")
---set_toolset("ex", "armar")
---set_toolset("as", "a51")
+ set_toolset("cc", "c51")
+ set_toolset("cxx", "c51")
+ set_toolset("ld", "bl51")
-on_check(function (toolchain)
- --import("lib.detect.find_tool")
- import("detect.sdks.find_c51")
- local c51_module = find_c51()
- import("detect.tools.find_c51")
- if c51_module and c51_module.sdkdir and find_c51() then
- toolchain:config_set("sdkdir", c51_module.sdkdir)
- toolchain:configs_save()
- return true
- end
-end)
+ on_check(function (toolchain)
+ import("lib.detect.find_tool")
+ import("detect.sdks.find_c51")
+ local c51 = find_c51()
-
-on_load(function (toolchain)
-end) \ No newline at end of file
+ if c51 and c51.sdkdir and find_tool("c51") then
+ toolchain:config_set("sdkdir", c51.sdkdir)
+ toolchain:configs_save()
+ return true
+ end
+ end) \ No newline at end of file