diff --git a/bsp/stm32/stm32f407-rt-spark/board/linker_scripts/link.lds b/bsp/stm32/stm32f407-rt-spark/board/linker_scripts/link.lds index 2d48a9e3478..db56fb32d69 100644 --- a/bsp/stm32/stm32f407-rt-spark/board/linker_scripts/link.lds +++ b/bsp/stm32/stm32f407-rt-spark/board/linker_scripts/link.lds @@ -70,6 +70,7 @@ SECTIONS } > CODE = 0 /* .ARM.exidx is sorted, so has to go in its own output section. */ + .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } > CODE __exidx_start = .; .ARM.exidx : { @@ -102,7 +103,7 @@ SECTIONS _edata = . ; } >RAM1 - .stack : + .stack (NOLOAD): { . = ALIGN(4); _sstack = .; @@ -112,7 +113,7 @@ SECTIONS } >RAM1 __bss_start = .; - .bss : + .bss (NOLOAD): { . = ALIGN(4); /* This is used by the startup in order to initialize the .bss secion */ diff --git a/tools/targets/zigbuild.py b/tools/targets/zigbuild.py index 8811639d340..26063de36e3 100644 --- a/tools/targets/zigbuild.py +++ b/tools/targets/zigbuild.py @@ -6,11 +6,28 @@ import os import sys import re +import subprocess import utils import rtconfig from utils import _make_path_relative +def get_zig_version(): + try: + result = subprocess.run(['zig', 'version'], capture_output=True, text=True) + version_str = result.stdout.strip() + parts = version_str.split('.') + major = int(parts[0]) + minor = int(parts[1]) if len(parts) > 1 else 0 + return (major, minor) + except Exception: + return (0, 0) + + +ZIG_VERSION = get_zig_version() +IS_ZIG_0_14_PLUS = ZIG_VERSION[0] > 0 or (ZIG_VERSION[0] == 0 and ZIG_VERSION[1] >= 14) + + def GenerateCFiles(env,project): info = utils.ProjectInfo(env) @@ -23,12 +40,23 @@ def GenerateCFiles(env,project): if zig_file: zig_file.write("const std = @import(\"std\");\n\n") - zig_file.write("const target = std.zig.CrossTarget{\n") - zig_file.write(" .cpu_arch = {},\n".format(ARCH)) - zig_file.write(" .cpu_model = .{{ .explicit = &std.Target.{}.cpu.{} }},\n".format(rtconfig.ARCH, rtconfig.CPU.replace('-', '_'))) - zig_file.write(" .os_tag = .freestanding,\n") - zig_file.write(" .abi = .eabi,\n") - zig_file.write("};\n\n") + if IS_ZIG_0_14_PLUS: + zig_file.write("const target = std.Target.Query{\n") + zig_file.write(" .cpu_arch = {},\n".format(ARCH)) + zig_file.write(" .cpu_model = .{{ .explicit = &std.Target.{}.cpu.{} }},\n".format(rtconfig.ARCH, rtconfig.CPU.replace('-', '_'))) + zig_file.write(" .os_tag = .freestanding,\n") + if ARCH == ".thumb": + zig_file.write(" .abi = .eabihf,\n") + else: + zig_file.write(" .abi = .eabi,\n") + zig_file.write("};\n\n") + else: + zig_file.write("const target = std.zig.CrossTarget{\n") + zig_file.write(" .cpu_arch = {},\n".format(ARCH)) + zig_file.write(" .cpu_model = .{{ .explicit = &std.Target.{}.cpu.{} }},\n".format(rtconfig.ARCH, rtconfig.CPU.replace('-', '_'))) + zig_file.write(" .os_tag = .freestanding,\n") + zig_file.write(" .abi = .eabi,\n") + zig_file.write("};\n\n") zig_file.write("const c_includes = [_][]const u8{\n") for i in info['CPPPATH']: @@ -60,20 +88,34 @@ def GenerateCFiles(env,project): zig_file.write("};\n\n") zig_file.write("pub fn build(b: *std.Build) void {\n") - zig_file.write(" const optimize = .ReleaseSafe;\n\n") - - zig_file.write(" const elf = b.addExecutable(.{\n") - zig_file.write(" .name = \"rtthread.elf\",\n") - zig_file.write(" .target = b.resolveTargetQuery(target),\n") - zig_file.write(" .optimize = optimize,\n") - zig_file.write(" .strip = false,\n") - zig_file.write(" });\n\n") - zig_file.write(" elf.entry = .{ .symbol_name = \"Reset_Handler\" };\n\n") + zig_file.write(" const optimize = .ReleaseSmall;\n\n") + + if IS_ZIG_0_14_PLUS: + zig_file.write(" const root_module = b.createModule(.{\n") + zig_file.write(" .root_source_file = null,\n") + zig_file.write(" .target = b.resolveTargetQuery(target),\n") + zig_file.write(" .optimize = optimize,\n") + zig_file.write(" .strip = false,\n") + zig_file.write(" });\n\n") + + zig_file.write(" root_module.addCSourceFiles(.{ .files = &c_sources, .flags = &c_flags });\n") + zig_file.write(" for (c_includes) |include| {\n") + zig_file.write(" root_module.addIncludePath(b.path(include));\n") + zig_file.write(" }\n\n") + + zig_file.write(" const elf = b.addExecutable(.{\n") + zig_file.write(" .name = \"rtthread.elf\",\n") + zig_file.write(" .root_module = root_module,\n") + zig_file.write(" });\n\n") + else: + zig_file.write(" const elf = b.addExecutable(.{\n") + zig_file.write(" .name = \"rtthread.elf\",\n") + zig_file.write(" .target = b.resolveTargetQuery(target),\n") + zig_file.write(" .optimize = optimize,\n") + zig_file.write(" .strip = false,\n") + zig_file.write(" });\n\n") - zig_file.write(" elf.addCSourceFiles(.{ .files = &c_sources, .flags = &c_flags });\n") - zig_file.write(" for (c_includes) |include| {\n") - zig_file.write(" elf.addIncludePath(b.path(include));\n") - zig_file.write(" }\n\n") + zig_file.write(" elf.entry = .{ .symbol_name = \"Reset_Handler\" };\n\n") # find link script in rtconfig.LFLAGS LINK_SCRIPT = re.search(r'-T\s*(\S+)', LFLAGS) @@ -93,6 +135,12 @@ def GenerateCFiles(env,project): return def ZigBuildProject(env,project): + version_str = "{}.{}".format(ZIG_VERSION[0], ZIG_VERSION[1]) + print('Detected Zig version: {}'.format(version_str)) + if IS_ZIG_0_14_PLUS: + print('Using Zig 0.14+ compatible build configuration') + else: + print('Using legacy build configuration') print('Update setting files for build.zig...') GenerateCFiles(env,project) print('Done!')