diff options
| author | ruki <[email protected]> | 2021-10-26 23:06:48 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2021-10-26 23:06:48 +0800 |
| commit | f818c0d180bd0e19070dbe03e0cbc1405712b2ed (patch) | |
| tree | 64ebcbe224125fb7ab08a350031e7d07a2f17804 | |
| parent | 59a6225f09410e8e4cdadd224e31f92d575537e3 (diff) | |
impl armcc and armasm
| -rw-r--r-- | tests/projects/mdk/hello/src/RTE/Device/ARMCM3/startup_ARMCM3.c | 150 | ||||
| -rw-r--r-- | tests/projects/mdk/hello/xmake.lua | 2 | ||||
| -rw-r--r-- | xmake/modules/core/tools/armasm.lua | 146 | ||||
| -rw-r--r-- | xmake/modules/core/tools/armcc.lua | 155 | ||||
| -rw-r--r-- | xmake/modules/core/tools/sdcc.lua | 5 | ||||
| -rw-r--r-- | xmake/modules/detect/tools/armcc/has_flags.lua | 23 | ||||
| -rw-r--r-- | xmake/toolchains/armcc/xmake.lua | 3 |
7 files changed, 327 insertions, 157 deletions
diff --git a/tests/projects/mdk/hello/src/RTE/Device/ARMCM3/startup_ARMCM3.c b/tests/projects/mdk/hello/src/RTE/Device/ARMCM3/startup_ARMCM3.c deleted file mode 100644 index da67c87c9..000000000 --- a/tests/projects/mdk/hello/src/RTE/Device/ARMCM3/startup_ARMCM3.c +++ /dev/null @@ -1,150 +0,0 @@ -/******************************************************************************
- * @file startup_ARMCM3.c
- * @brief CMSIS-Core(M) Device Startup File for a Cortex-M3 Device
- * @version V2.0.3
- * @date 31. March 2020
- ******************************************************************************/
-/*
- * Copyright (c) 2009-2020 Arm Limited. All rights reserved.
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * 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
- *
- * 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.
- */
-
-#if defined (ARMCM3)
- #include "ARMCM3.h"
-#else
- #error device not specified!
-#endif
-
-/*----------------------------------------------------------------------------
- External References
- *----------------------------------------------------------------------------*/
-extern uint32_t __INITIAL_SP;
-
-extern __NO_RETURN void __PROGRAM_START(void);
-
-/*----------------------------------------------------------------------------
- Internal References
- *----------------------------------------------------------------------------*/
-__NO_RETURN void Reset_Handler (void);
- void Default_Handler(void);
-
-/*----------------------------------------------------------------------------
- Exception / Interrupt Handler
- *----------------------------------------------------------------------------*/
-/* Exceptions */
-void NMI_Handler (void) __attribute__ ((weak, alias("Default_Handler")));
-void HardFault_Handler (void) __attribute__ ((weak));
-void MemManage_Handler (void) __attribute__ ((weak, alias("Default_Handler")));
-void BusFault_Handler (void) __attribute__ ((weak, alias("Default_Handler")));
-void UsageFault_Handler (void) __attribute__ ((weak, alias("Default_Handler")));
-void SVC_Handler (void) __attribute__ ((weak, alias("Default_Handler")));
-void DebugMon_Handler (void) __attribute__ ((weak, alias("Default_Handler")));
-void PendSV_Handler (void) __attribute__ ((weak, alias("Default_Handler")));
-void SysTick_Handler (void) __attribute__ ((weak, alias("Default_Handler")));
-
-void Interrupt0_Handler (void) __attribute__ ((weak, alias("Default_Handler")));
-void Interrupt1_Handler (void) __attribute__ ((weak, alias("Default_Handler")));
-void Interrupt2_Handler (void) __attribute__ ((weak, alias("Default_Handler")));
-void Interrupt3_Handler (void) __attribute__ ((weak, alias("Default_Handler")));
-void Interrupt4_Handler (void) __attribute__ ((weak, alias("Default_Handler")));
-void Interrupt5_Handler (void) __attribute__ ((weak, alias("Default_Handler")));
-void Interrupt6_Handler (void) __attribute__ ((weak, alias("Default_Handler")));
-void Interrupt7_Handler (void) __attribute__ ((weak, alias("Default_Handler")));
-void Interrupt8_Handler (void) __attribute__ ((weak, alias("Default_Handler")));
-void Interrupt9_Handler (void) __attribute__ ((weak, alias("Default_Handler")));
-
-
-/*----------------------------------------------------------------------------
- Exception / Interrupt Vector table
- *----------------------------------------------------------------------------*/
-
-#if defined ( __GNUC__ )
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wpedantic"
-#endif
-
-extern const VECTOR_TABLE_Type __VECTOR_TABLE[240];
- const VECTOR_TABLE_Type __VECTOR_TABLE[240] __VECTOR_TABLE_ATTRIBUTE = {
- (VECTOR_TABLE_Type)(&__INITIAL_SP), /* Initial Stack Pointer */
- Reset_Handler, /* Reset Handler */
- NMI_Handler, /* -14 NMI Handler */
- HardFault_Handler, /* -13 Hard Fault Handler */
- MemManage_Handler, /* -12 MPU Fault Handler */
- BusFault_Handler, /* -11 Bus Fault Handler */
- UsageFault_Handler, /* -10 Usage Fault Handler */
- 0, /* Reserved */
- 0, /* Reserved */
- 0, /* Reserved */
- 0, /* Reserved */
- SVC_Handler, /* -5 SVCall Handler */
- DebugMon_Handler, /* -4 Debug Monitor Handler */
- 0, /* Reserved */
- PendSV_Handler, /* -2 PendSV Handler */
- SysTick_Handler, /* -1 SysTick Handler */
-
- /* Interrupts */
- Interrupt0_Handler, /* 0 Interrupt 0 */
- Interrupt1_Handler, /* 1 Interrupt 1 */
- Interrupt2_Handler, /* 2 Interrupt 2 */
- Interrupt3_Handler, /* 3 Interrupt 3 */
- Interrupt4_Handler, /* 4 Interrupt 4 */
- Interrupt5_Handler, /* 5 Interrupt 5 */
- Interrupt6_Handler, /* 6 Interrupt 6 */
- Interrupt7_Handler, /* 7 Interrupt 7 */
- Interrupt8_Handler, /* 8 Interrupt 8 */
- Interrupt9_Handler /* 9 Interrupt 9 */
- /* Interrupts 10 .. 223 are left out */
-};
-
-#if defined ( __GNUC__ )
-#pragma GCC diagnostic pop
-#endif
-
-/*----------------------------------------------------------------------------
- Reset Handler called on controller reset
- *----------------------------------------------------------------------------*/
-__NO_RETURN void Reset_Handler(void)
-{
- SystemInit(); /* CMSIS System Initialization */
- __PROGRAM_START(); /* Enter PreMain (C library entry point) */
-}
-
-
-#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)
- #pragma clang diagnostic push
- #pragma clang diagnostic ignored "-Wmissing-noreturn"
-#endif
-
-/*----------------------------------------------------------------------------
- Hard Fault Handler
- *----------------------------------------------------------------------------*/
-void HardFault_Handler(void)
-{
- while(1);
-}
-
-/*----------------------------------------------------------------------------
- Default Handler for Exceptions / Interrupts
- *----------------------------------------------------------------------------*/
-void Default_Handler(void)
-{
- while(1);
-}
-
-#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)
- #pragma clang diagnostic pop
-#endif
-
diff --git a/tests/projects/mdk/hello/xmake.lua b/tests/projects/mdk/hello/xmake.lua index faa68cf5f..af9f2acde 100644 --- a/tests/projects/mdk/hello/xmake.lua +++ b/tests/projects/mdk/hello/xmake.lua @@ -3,4 +3,4 @@ target("hello") set_kind("binary") set_extension(".axf") add_files("src/**.c", "src/**.s") - + add_defines("__EVAL", "__MICROLIB") diff --git a/xmake/modules/core/tools/armasm.lua b/xmake/modules/core/tools/armasm.lua index 7820eea69..98d2bea18 100644 --- a/xmake/modules/core/tools/armasm.lua +++ b/xmake/modules/core/tools/armasm.lua @@ -18,8 +18,150 @@ -- @file armasm.lua -- -inherit("gcc") +-- imports +import("core.base.option") +import("core.base.global") +import("core.language.language") +import("utils.progress") +-- init it function init(self) - _super.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("-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/armcc.lua b/xmake/modules/core/tools/armcc.lua index 40854eb7a..6215242ec 100644 --- a/xmake/modules/core/tools/armcc.lua +++ b/xmake/modules/core/tools/armcc.lua @@ -18,8 +18,159 @@ -- @file armcc.lua -- -inherit("gcc") +-- imports +import("core.base.option") +import("core.base.global") +import("core.language.language") +import("utils.progress") +-- init it function init(self) - _super.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/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/tools/armcc/has_flags.lua b/xmake/modules/detect/tools/armcc/has_flags.lua new file mode 100644 index 000000000..6464e10b6 --- /dev/null +++ b/xmake/modules/detect/tools/armcc/has_flags.lua @@ -0,0 +1,23 @@ +--!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 has_flags.lua +-- + +-- imports +inherit("detect.tools.gcc.has_flags") + diff --git a/xmake/toolchains/armcc/xmake.lua b/xmake/toolchains/armcc/xmake.lua index 95f1d0528..d280d0344 100644 --- a/xmake/toolchains/armcc/xmake.lua +++ b/xmake/toolchains/armcc/xmake.lua @@ -37,4 +37,7 @@ toolchain("armcc") end) on_load(function (toolchain) + toolchain:add("cxflags", "--cpu Cortex-M3", {force = true}) + toolchain:add("asflags", "--cpu Cortex-M3", {force = true}) + toolchain:add("ldflags", "--cpu Cortex-M3", {force = true}) end) |
