From 9826d12a0b2d2c40f40c52c102f698e8a904ccf5 Mon Sep 17 00:00:00 2001 From: robinson <18656133516@gmail.com> Date: Thu, 28 Nov 2024 15:58:17 +0800 Subject: [PATCH 1/7] add feature: add support in windows platform --- armgcc.lua | 40 +++++++++++++++++++++++++++++----------- 1 file changed, 29 insertions(+), 11 deletions(-) diff --git a/armgcc.lua b/armgcc.lua index c5957f2..a306603 100644 --- a/armgcc.lua +++ b/armgcc.lua @@ -21,10 +21,17 @@ function use_toolchain(sdk_path) set_kind("cross") set_description("Stm32 Arm Embedded Compiler") set_sdkdir(sdk_path) - set_toolset("cc", "arm-none-eabi-gcc") - set_toolset("ld", "arm-none-eabi-gcc") - set_toolset("ar", "arm-none-eabi-ar") - set_toolset("as", "arm-none-eabi-gcc") + if is_plat("windows") then + set_toolset("cc", "arm-none-eabi-gcc.exe") + set_toolset("ld", "arm-none-eabi-gcc.exe") + set_toolset("ar", "arm-none-eabi-ar.exe") + set_toolset("as", "arm-none-eabi-gcc.exe") + else + set_toolset("cc", "arm-none-eabi-gcc") + set_toolset("ld", "arm-none-eabi-gcc") + set_toolset("ar", "arm-none-eabi-ar") + set_toolset("as", "arm-none-eabi-gcc") + end toolchain_end() set_toolchains("arm-gcc") end @@ -46,13 +53,24 @@ rule("arm-gcc") local out = target:targetfile() or "" local gen_fi = "build/"..target:name() print(string.format("%s => %s", out, gen_fi)) - os.exec("arm-none-eabi-objcopy -Obinary "..out.." "..gen_fi..".bin") - -- https://github.com/xmake-io/xmake/discussions/2125 - -- os.exec("arm-none-eabi-objdump -S "..out.." > "..gen_fi..".asm") - -- local asm = os.iorun("arm-none-eabi-objdump -S build/cross/cortex-m4/release/minimal-proj") - -- io.writefile(gen_fi..".asm", asm) - os.execv("arm-none-eabi-objdump", {"-S", out}, {stdout=gen_fi..".asm"}) - os.exec("arm-none-eabi-objcopy -O ihex "..out.." "..gen_fi..".hex") + if is_plat("windows") then + os.exec("arm-none-eabi-objcopy.exe -Obinary "..out.." "..gen_fi..".bin") + -- https://github.com/xmake-io/xmake/discussions/2125 + -- os.exec("arm-none-eabi-objdump -S "..out.." > "..gen_fi..".asm") + -- local asm = os.iorun("arm-none-eabi-objdump -S build/cross/cortex-m4/release/minimal-proj") + -- io.writefile(gen_fi..".asm", asm) + os.execv("arm-none-eabi-objdump.exe", {"-S", out}, {stdout=gen_fi..".asm"}) + os.exec("arm-none-eabi-objcopy.exe -O ihex "..out.." "..gen_fi..".hex") + else + os.exec("arm-none-eabi-objcopy -Obinary "..out.." "..gen_fi..".bin") + -- https://github.com/xmake-io/xmake/discussions/2125 + -- os.exec("arm-none-eabi-objdump -S "..out.." > "..gen_fi..".asm") + -- local asm = os.iorun("arm-none-eabi-objdump -S build/cross/cortex-m4/release/minimal-proj") + -- io.writefile(gen_fi..".asm", asm) + os.execv("arm-none-eabi-objdump", {"-S", out}, {stdout=gen_fi..".asm"}) + os.exec("arm-none-eabi-objcopy -O ihex "..out.." "..gen_fi..".hex") + end + os.mv(out, gen_fi .. ".elf") -- add .elf file -- -I binary -- $(Q) $(OBJ_COPY) -O ihex $@ $(BUILD_DIR)/$(TARGET).hex -- $(Q) $(OBJ_COPY) -O binary $@ $(BUILD_DIR)/$(TARGET).bin From e1bfb2aa5c5488913ae2a51fc4e39d5477f84bb4 Mon Sep 17 00:00:00 2001 From: robinson <18656133516@gmail.com> Date: Thu, 28 Nov 2024 17:27:48 +0800 Subject: [PATCH 2/7] fix: change the scripts to toolchain --- .vscode/compile_commands.json | 11 ++++ arm-gcc.lua | 71 +++++++++++++++++++++++ armgcc.lua | 102 ---------------------------------- xmake.lua | 26 +++++++-- 4 files changed, 103 insertions(+), 107 deletions(-) create mode 100644 .vscode/compile_commands.json create mode 100644 arm-gcc.lua delete mode 100644 armgcc.lua diff --git a/.vscode/compile_commands.json b/.vscode/compile_commands.json new file mode 100644 index 0000000..97325b0 --- /dev/null +++ b/.vscode/compile_commands.json @@ -0,0 +1,11 @@ +[ +{ + "directory": "d:\\project\\stm32-example-project", + "arguments": ["arm-none-eabi-gcc.exe", "-c", "-specs=nano.specs", "-mcpu=cortex-m4", "-mthumb", "-mfloat-abi=hard", "-mfpu=fpv4-sp-d16", "-fdata-sections", "-ffunction-sections", "-nostartfiles", "-Os", "-o", "build\\.objs\\minimal-proj\\cross\\cortex-m4\\release\\src\\main.c.o", "src\\main.c"], + "file": "src\\main.c" +}, +{ + "directory": "d:\\project\\stm32-example-project", + "arguments": ["arm-none-eabi-gcc.exe", "-c", "-specs=nano.specs", "-mcpu=cortex-m4", "-mthumb", "-mfloat-abi=hard", "-mfpu=fpv4-sp-d16", "-fdata-sections", "-ffunction-sections", "-nostartfiles", "-Os", "-o", "build\\.objs\\minimal-proj\\cross\\cortex-m4\\release\\src\\startup.c.o", "src\\startup.c"], + "file": "src\\startup.c" +}] diff --git a/arm-gcc.lua b/arm-gcc.lua new file mode 100644 index 0000000..f0bed2f --- /dev/null +++ b/arm-gcc.lua @@ -0,0 +1,71 @@ +toolchain("arm-gcc") + + set_description("ARM Compiler of GCC") + set_kind("cross") + + on_load(function (toolchain) + if toolchain:is_plat("windows") then + toolchain:set("toolset", "cc", "arm-none-eabi-gcc.exe") + toolchain:set("toolset", "ld", "arm-none-eabi-gcc.exe") + toolchain:set("toolset", "ar", "arm-none-eabi-ar.exe") + toolchain:set("toolset", "as", "arm-none-eabi-gcc.exe") + else + toolchain:set("toolset", "cc", "arm-none-eabi-gcc") + toolchain:set("toolset", "ld", "arm-none-eabi-gcc") + toolchain:set("toolset", "ar", "arm-none-eabi-ar") + toolchain:set("toolset", "as", "arm-none-eabi-gcc") + end + end) + +toolchain_end() + +rule("generate-hex") + after_build(function (target) + print("$(env ARM_TOOL)") + print("after_build: generate hex files") + local out = target:targetfile() or "" + local gen_fi = "build/" .. target:name() + print(string.format("%s => %s", out, gen_fi)) + -- https://github.com/xmake-io/xmake/discussions/2125 + -- os.exec("arm-none-eabi-objdump -S "..out.." > "..gen_fi..".asm") + -- local asm = os.iorun("arm-none-eabi-objdump -S build/cross/cortex-m4/release/minimal-proj") + -- io.writefile(gen_fi..".asm", asm) + if is_plat("windows") then + os.execv("arm-none-eabi-objcopy.exe", {"-Obinary", out, gen_fi .. ".bin"}) + os.execv("arm-none-eabi-objdump.exe", {"-S", out}, {stdout = gen_fi .. ".asm"}) + os.execv("arm-none-eabi-objcopy.exe", {"-O", "ihex", out, gen_fi .. ".hex"}) + else + os.execv("arm-none-eabi-objcopy", {"-Obinary", out, gen_fi .. ".bin"}) + os.execv("arm-none-eabi-objdump", {"-S", out}, {stdout = gen_fi .. ".asm"}) + os.execv("arm-none-eabi-objcopy", {"-O", "ihex", out, gen_fi .. ".hex"}) + end + os.mv(out, gen_fi .. ".elf") -- add .elf file + -- -I binary + -- $(Q) $(OBJ_COPY) -O ihex $@ $(BUILD_DIR)/$(TARGET).hex + -- $(Q) $(OBJ_COPY) -O binary $@ $(BUILD_DIR)/$(TARGET).bin + -- os.exec("qemu-system-arm -M stm32-p103 -nographic -kernel"..bin_out) + end) + after_clean(function (target) + local gen_fi = "build/" .. target:name() + os.rm(gen_fi .. ".*") + end) +rule_end() + +task("qemu") + on_run(function () + print("Run binary in Qemu!") + local bin_out = os.files("$(buildir)/*.bin")[1] + if bin_out then + os.exec("qemu-system-arm -M stm32-p103 -nographic -kernel " .. bin_out) + else + print("Do not find bin file in $(buildir)/") + end + end) + set_menu { + -- Settings menu usage + usage = "xmake qemu", + + -- Setup menu description + description = "Run binary in Qemu!" + } +task_end() diff --git a/armgcc.lua b/armgcc.lua deleted file mode 100644 index a306603..0000000 --- a/armgcc.lua +++ /dev/null @@ -1,102 +0,0 @@ - -local cflags = { - "-mcpu=cortex-m4", - " -mthumb", - "-mfloat-abi=hard -mfpu=fpv4-sp-d16", - "-fdata-sections -ffunction-sections", - "-nostartfiles", - "-Os", -} - -local ldflags = { - "-specs=nano.specs", - "-lc", - "-lm", - "-lnosys", - "-Wl,--gc-sections", -} - -function use_toolchain(sdk_path) - toolchain("arm-gcc") - set_kind("cross") - set_description("Stm32 Arm Embedded Compiler") - set_sdkdir(sdk_path) - if is_plat("windows") then - set_toolset("cc", "arm-none-eabi-gcc.exe") - set_toolset("ld", "arm-none-eabi-gcc.exe") - set_toolset("ar", "arm-none-eabi-ar.exe") - set_toolset("as", "arm-none-eabi-gcc.exe") - else - set_toolset("cc", "arm-none-eabi-gcc") - set_toolset("ld", "arm-none-eabi-gcc") - set_toolset("ar", "arm-none-eabi-ar") - set_toolset("as", "arm-none-eabi-gcc") - end - toolchain_end() - set_toolchains("arm-gcc") -end - -rule("arm-gcc") - on_load(function (target) - -- force add ld flags, ldflags {force = true} - target:set("policy", "check.auto_ignore_flags", false) - target:add("cxflags", cflags) - target:add("asflags", cflags) - -- use gcc to link - target:add("ldflags", cflags) - target:add("ldflags", ldflags) - end) - - after_build(function (target) - print("$(env ARM_TOOL)") - print("after_build: generate hex files") - local out = target:targetfile() or "" - local gen_fi = "build/"..target:name() - print(string.format("%s => %s", out, gen_fi)) - if is_plat("windows") then - os.exec("arm-none-eabi-objcopy.exe -Obinary "..out.." "..gen_fi..".bin") - -- https://github.com/xmake-io/xmake/discussions/2125 - -- os.exec("arm-none-eabi-objdump -S "..out.." > "..gen_fi..".asm") - -- local asm = os.iorun("arm-none-eabi-objdump -S build/cross/cortex-m4/release/minimal-proj") - -- io.writefile(gen_fi..".asm", asm) - os.execv("arm-none-eabi-objdump.exe", {"-S", out}, {stdout=gen_fi..".asm"}) - os.exec("arm-none-eabi-objcopy.exe -O ihex "..out.." "..gen_fi..".hex") - else - os.exec("arm-none-eabi-objcopy -Obinary "..out.." "..gen_fi..".bin") - -- https://github.com/xmake-io/xmake/discussions/2125 - -- os.exec("arm-none-eabi-objdump -S "..out.." > "..gen_fi..".asm") - -- local asm = os.iorun("arm-none-eabi-objdump -S build/cross/cortex-m4/release/minimal-proj") - -- io.writefile(gen_fi..".asm", asm) - os.execv("arm-none-eabi-objdump", {"-S", out}, {stdout=gen_fi..".asm"}) - os.exec("arm-none-eabi-objcopy -O ihex "..out.." "..gen_fi..".hex") - end - os.mv(out, gen_fi .. ".elf") -- add .elf file - -- -I binary - -- $(Q) $(OBJ_COPY) -O ihex $@ $(BUILD_DIR)/$(TARGET).hex - -- $(Q) $(OBJ_COPY) -O binary $@ $(BUILD_DIR)/$(TARGET).bin - -- os.exec("qemu-system-arm -M stm32-p103 -nographic -kernel"..bin_out) - end) - after_clean(function (target) - local gen_fi = "build/"..target:name() - os.rm(gen_fi..".*") - end) -rule_end() - -task("qemu") - on_run(function () - print("Run binary in Qemu!") - local bin_out = os.files("$(buildir)/*.bin")[1] - if bin_out then - os.exec("qemu-system-arm -M stm32-p103 -nographic -kernel "..bin_out) - else - print("Do not find bin file in $(buildir)/") - end - end) - set_menu { - -- Settings menu usage - usage = "xmake qemu", - - -- Setup menu description - description = "Run binary in Qemu!" - } -task_end() diff --git a/xmake.lua b/xmake.lua index 2b484ca..5481909 100644 --- a/xmake.lua +++ b/xmake.lua @@ -5,15 +5,31 @@ set_project("stm32-demo") set_plat("cross") set_arch("cortex-m4") -includes("armgcc.lua") -local arm_gcc_installing_path = os.getenv("ARM_GCC_TOOL") or "/Applications/ARM/" -use_toolchain(arm_gcc_installing_path) +includes("arm-gcc.lua") target("minimal-proj") set_kind("binary") add_files("src/*.c") - add_rules("arm-gcc") - add_ldflags("-Tsrc/main.ld") + + add_cflags( + "-specs=nano.specs", "-mcpu=cortex-m4", "-mthumb", + "-mfloat-abi=hard -mfpu=fpv4-sp-d16", + "-fdata-sections -ffunction-sections", + "-nostartfiles","-Os" + ) + + add_ldflags( + "-specs=nano.specs", "-mcpu=cortex-m4", "-mthumb", + "-mfloat-abi=hard -mfpu=fpv4-sp-d16", + "-fdata-sections -ffunction-sections", + "-nostartfiles","-Os", + "-Wl,--gc-sections", + "-Tsrc/main.ld", {force = true} + ) + + add_links("m", "c", "nosys") + add_rules("generate-hex") + -- If you want to known more usage about xmake, please see https://xmake.io -- Reference Project: From 157e9a2b281292f1ad17b6f19a32c140bfc0d7eb Mon Sep 17 00:00:00 2001 From: robinson <18656133516@gmail.com> Date: Thu, 28 Nov 2024 17:29:42 +0800 Subject: [PATCH 3/7] fix: change the scripts to toolchain --- arm-gcc.lua | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/arm-gcc.lua b/arm-gcc.lua index f0bed2f..3882cde 100644 --- a/arm-gcc.lua +++ b/arm-gcc.lua @@ -3,7 +3,7 @@ toolchain("arm-gcc") set_description("ARM Compiler of GCC") set_kind("cross") - on_load(function (toolchain) + on_load(function(toolchain) if toolchain:is_plat("windows") then toolchain:set("toolset", "cc", "arm-none-eabi-gcc.exe") toolchain:set("toolset", "ld", "arm-none-eabi-gcc.exe") @@ -16,11 +16,10 @@ toolchain("arm-gcc") toolchain:set("toolset", "as", "arm-none-eabi-gcc") end end) - toolchain_end() rule("generate-hex") - after_build(function (target) + after_build(function(target) print("$(env ARM_TOOL)") print("after_build: generate hex files") local out = target:targetfile() or "" @@ -45,14 +44,14 @@ rule("generate-hex") -- $(Q) $(OBJ_COPY) -O binary $@ $(BUILD_DIR)/$(TARGET).bin -- os.exec("qemu-system-arm -M stm32-p103 -nographic -kernel"..bin_out) end) - after_clean(function (target) + after_clean(function(target) local gen_fi = "build/" .. target:name() os.rm(gen_fi .. ".*") end) rule_end() task("qemu") - on_run(function () + on_run(function() print("Run binary in Qemu!") local bin_out = os.files("$(buildir)/*.bin")[1] if bin_out then From f599ae8e48295e845a70709721d16cccd0254dea Mon Sep 17 00:00:00 2001 From: robinson <18656133516@gmail.com> Date: Thu, 28 Nov 2024 17:32:06 +0800 Subject: [PATCH 4/7] refresh .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 586568e..eaf4362 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ .DS_Store build/ .xmake/ +.vscode/ \ No newline at end of file From 0f7742482abf598e1f5c3d3bb8ba0ed639d8ae55 Mon Sep 17 00:00:00 2001 From: robinson <18656133516@gmail.com> Date: Thu, 28 Nov 2024 17:34:05 +0800 Subject: [PATCH 5/7] refresh .gitignore --- .vscode/compile_commands.json | 11 ----------- 1 file changed, 11 deletions(-) delete mode 100644 .vscode/compile_commands.json diff --git a/.vscode/compile_commands.json b/.vscode/compile_commands.json deleted file mode 100644 index 97325b0..0000000 --- a/.vscode/compile_commands.json +++ /dev/null @@ -1,11 +0,0 @@ -[ -{ - "directory": "d:\\project\\stm32-example-project", - "arguments": ["arm-none-eabi-gcc.exe", "-c", "-specs=nano.specs", "-mcpu=cortex-m4", "-mthumb", "-mfloat-abi=hard", "-mfpu=fpv4-sp-d16", "-fdata-sections", "-ffunction-sections", "-nostartfiles", "-Os", "-o", "build\\.objs\\minimal-proj\\cross\\cortex-m4\\release\\src\\main.c.o", "src\\main.c"], - "file": "src\\main.c" -}, -{ - "directory": "d:\\project\\stm32-example-project", - "arguments": ["arm-none-eabi-gcc.exe", "-c", "-specs=nano.specs", "-mcpu=cortex-m4", "-mthumb", "-mfloat-abi=hard", "-mfpu=fpv4-sp-d16", "-fdata-sections", "-ffunction-sections", "-nostartfiles", "-Os", "-o", "build\\.objs\\minimal-proj\\cross\\cortex-m4\\release\\src\\startup.c.o", "src\\startup.c"], - "file": "src\\startup.c" -}] From 84d762930edcf4accd667c2237d59655e0473b29 Mon Sep 17 00:00:00 2001 From: robinson <18656133516@gmail.com> Date: Thu, 28 Nov 2024 17:37:44 +0800 Subject: [PATCH 6/7] fix: change format --- arm-gcc.lua | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/arm-gcc.lua b/arm-gcc.lua index 3882cde..8a5cf09 100644 --- a/arm-gcc.lua +++ b/arm-gcc.lua @@ -16,20 +16,21 @@ toolchain("arm-gcc") toolchain:set("toolset", "as", "arm-none-eabi-gcc") end end) + toolchain_end() rule("generate-hex") after_build(function(target) - print("$(env ARM_TOOL)") - print("after_build: generate hex files") local out = target:targetfile() or "" local gen_fi = "build/" .. target:name() print(string.format("%s => %s", out, gen_fi)) + -- https://github.com/xmake-io/xmake/discussions/2125 -- os.exec("arm-none-eabi-objdump -S "..out.." > "..gen_fi..".asm") -- local asm = os.iorun("arm-none-eabi-objdump -S build/cross/cortex-m4/release/minimal-proj") -- io.writefile(gen_fi..".asm", asm) - if is_plat("windows") then + + if target:is_plat("windows") then os.execv("arm-none-eabi-objcopy.exe", {"-Obinary", out, gen_fi .. ".bin"}) os.execv("arm-none-eabi-objdump.exe", {"-S", out}, {stdout = gen_fi .. ".asm"}) os.execv("arm-none-eabi-objcopy.exe", {"-O", "ihex", out, gen_fi .. ".hex"}) @@ -38,19 +39,23 @@ rule("generate-hex") os.execv("arm-none-eabi-objdump", {"-S", out}, {stdout = gen_fi .. ".asm"}) os.execv("arm-none-eabi-objcopy", {"-O", "ihex", out, gen_fi .. ".hex"}) end + os.mv(out, gen_fi .. ".elf") -- add .elf file -- -I binary -- $(Q) $(OBJ_COPY) -O ihex $@ $(BUILD_DIR)/$(TARGET).hex -- $(Q) $(OBJ_COPY) -O binary $@ $(BUILD_DIR)/$(TARGET).bin -- os.exec("qemu-system-arm -M stm32-p103 -nographic -kernel"..bin_out) end) + after_clean(function(target) local gen_fi = "build/" .. target:name() os.rm(gen_fi .. ".*") end) + rule_end() task("qemu") + on_run(function() print("Run binary in Qemu!") local bin_out = os.files("$(buildir)/*.bin")[1] @@ -60,6 +65,7 @@ task("qemu") print("Do not find bin file in $(buildir)/") end end) + set_menu { -- Settings menu usage usage = "xmake qemu", @@ -67,4 +73,5 @@ task("qemu") -- Setup menu description description = "Run binary in Qemu!" } + task_end() From e3c8053511400fe451a03add84fa18aa893efc93 Mon Sep 17 00:00:00 2001 From: robinson <18656133516@gmail.com> Date: Thu, 28 Nov 2024 18:40:39 +0800 Subject: [PATCH 7/7] fix: delete the logging file --- arm-gcc.lua | 1 - 1 file changed, 1 deletion(-) diff --git a/arm-gcc.lua b/arm-gcc.lua index 8a5cf09..4847ea1 100644 --- a/arm-gcc.lua +++ b/arm-gcc.lua @@ -23,7 +23,6 @@ rule("generate-hex") after_build(function(target) local out = target:targetfile() or "" local gen_fi = "build/" .. target:name() - print(string.format("%s => %s", out, gen_fi)) -- https://github.com/xmake-io/xmake/discussions/2125 -- os.exec("arm-none-eabi-objdump -S "..out.." > "..gen_fi..".asm")