summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2025-01-26 13:23:15 +0800
committerruki <[email protected]>2025-01-26 13:23:15 +0800
commit9472fb3d2c57ecadf66efec734372bb7d46a4443 (patch)
treee980a55352cb9f9408f5beb5df2a0eebce3eb82d
parentecc654470545c28fabd2a5c2c192f83e0926964c (diff)
improve iccarm
-rw-r--r--xmake/modules/core/tools/iccarm.lua110
1 files changed, 102 insertions, 8 deletions
diff --git a/xmake/modules/core/tools/iccarm.lua b/xmake/modules/core/tools/iccarm.lua
index 9bfe4447b..ae706a448 100644
--- a/xmake/modules/core/tools/iccarm.lua
+++ b/xmake/modules/core/tools/iccarm.lua
@@ -18,26 +18,120 @@
-- @file iccarm.lua
--
+-- imports
+import("core.base.option")
+import("core.base.global")
+import("core.project.policy")
import("core.language.language")
-inherit("gcc")
+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"
+ maps =
+ {
+ debug = "--debug"
}
_g.symbol_maps = maps
end
return maps[level .. '_' .. kind] or maps[level]
- elseif kind == "ld" or kind == "sh" then
- local plat = self:plat()
- if level == "debug" and is_host("windows") then
- return "-g"
- end
end
end
+-- make the optimize flag
+function nf_optimize(self, level)
+ local maps =
+ {
+ none = "-On"
+ , fast = "-Ol"
+ , faster = "-Om"
+ , fastest = "-Oh"
+ , smallest = "-Ohz"
+ , aggressive = "-Ohs"
+ }
+ return maps[level]
+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 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, opt)
+ os.mkdir(path.directory(objectfile))
+ try
+ {
+ function ()
+ local compflags = flags
+ local outdata, errdata = os.iorunv(compargv(self, sourcefile, objectfile, compflags))
+ 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 policy.build_warnings(opt) 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
+
+
+