Skip to content

Commit

Permalink
improve iccarm
Browse files Browse the repository at this point in the history
  • Loading branch information
waruqi committed Jan 26, 2025
1 parent ecc6544 commit 9472fb3
Showing 1 changed file with 102 additions and 8 deletions.
110 changes: 102 additions & 8 deletions xmake/modules/core/tools/iccarm.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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



0 comments on commit 9472fb3

Please sign in to comment.