From 44be198ecab73f481d6dcc0ef5dafff1448cd42a Mon Sep 17 00:00:00 2001
From: ppescher
Date: Mon, 24 Sep 2018 14:51:22 +0200
Subject: [PATCH] Add menu options for C RunTime library
Mainly to support floating point format strings in printf/scanf functions and their variants.
Default settings uses Newlib Nano without floating point support (as before).
One can add floating point support for Printf only, Scanf only or both, or just use the full Newlib.
---
boards.txt | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++
platform.txt | 8 ++---
2 files changed, 94 insertions(+), 4 deletions(-)
diff --git a/boards.txt b/boards.txt
index 7b4b4e5f39..5f3b7cea70 100644
--- a/boards.txt
+++ b/boards.txt
@@ -6,6 +6,7 @@ menu.xserial=Serial interface
menu.usb=USB interface
menu.opt=Optimize
+menu.rtlib=C Runtime Library
menu.upload_method=Upload method
menu.flash=Flash Memory Size
@@ -894,3 +895,92 @@ RemRam.menu.opt.o3lto.build.flags.ldspecs=-flto
RemRam.menu.opt.ogstd=Debug (-g)
RemRam.menu.opt.ogstd.build.flags.optimize=-g -Og
RemRam.menu.opt.ogstd.build.flags.ldspecs=
+
+# C Runtime Library
+Nucleo_144.menu.rtlib.nano=Newlib Nano (default)
+Nucleo_144.menu.rtlib.nano.build.flags.ldspecs=--specs=nano.specs
+Nucleo_144.menu.rtlib.nanofp=Newlib Nano + Float Printf
+Nucleo_144.menu.rtlib.nanofp.build.flags.ldspecs=--specs=nano.specs -u _printf_float
+Nucleo_144.menu.rtlib.nanofs=Newlib Nano + Float Scanf
+Nucleo_144.menu.rtlib.nanofs.build.flags.ldspecs=--specs=nano.specs -u _scanf_float
+Nucleo_144.menu.rtlib.nanofps=Newlib Nano + Float Printf/Scanf
+Nucleo_144.menu.rtlib.nanofps.build.flags.ldspecs=--specs=nano.specs -u _printf_float -u _scanf_float
+Nucleo_144.menu.rtlib.full=Newlib Standard
+Nucleo_144.menu.rtlib.full.build.flags.ldspecs=
+
+Nucleo_64.menu.rtlib.nano=Newlib Nano (default)
+Nucleo_64.menu.rtlib.nano.build.flags.ldspecs=--specs=nano.specs
+Nucleo_64.menu.rtlib.nanofp=Newlib Nano + Float Printf
+Nucleo_64.menu.rtlib.nanofp.build.flags.ldspecs=--specs=nano.specs -u _printf_float
+Nucleo_64.menu.rtlib.nanofs=Newlib Nano + Float Scanf
+Nucleo_64.menu.rtlib.nanofs.build.flags.ldspecs=--specs=nano.specs -u _scanf_float
+Nucleo_64.menu.rtlib.nanofps=Newlib Nano + Float Printf/Scanf
+Nucleo_64.menu.rtlib.nanofps.build.flags.ldspecs=--specs=nano.specs -u _printf_float -u _scanf_float
+Nucleo_64.menu.rtlib.full=Newlib Standard
+Nucleo_64.menu.rtlib.full.build.flags.ldspecs=
+
+Nucleo_32.menu.rtlib.nano=Newlib Nano (default)
+Nucleo_32.menu.rtlib.nano.build.flags.ldspecs=--specs=nano.specs
+Nucleo_32.menu.rtlib.nanofp=Newlib Nano + Float Printf
+Nucleo_32.menu.rtlib.nanofp.build.flags.ldspecs=--specs=nano.specs -u _printf_float
+Nucleo_32.menu.rtlib.nanofs=Newlib Nano + Float Scanf
+Nucleo_32.menu.rtlib.nanofs.build.flags.ldspecs=--specs=nano.specs -u _scanf_float
+Nucleo_32.menu.rtlib.nanofps=Newlib Nano + Float Printf/Scanf
+Nucleo_32.menu.rtlib.nanofps.build.flags.ldspecs=--specs=nano.specs -u _printf_float -u _scanf_float
+Nucleo_32.menu.rtlib.full=Newlib Standard
+Nucleo_32.menu.rtlib.full.build.flags.ldspecs=
+
+Disco.menu.rtlib.nano=Newlib Nano (default)
+Disco.menu.rtlib.nano.build.flags.ldspecs=--specs=nano.specs
+Disco.menu.rtlib.nanofp=Newlib Nano + Float Printf
+Disco.menu.rtlib.nanofp.build.flags.ldspecs=--specs=nano.specs -u _printf_float
+Disco.menu.rtlib.nanofs=Newlib Nano + Float Scanf
+Disco.menu.rtlib.nanofs.build.flags.ldspecs=--specs=nano.specs -u _scanf_float
+Disco.menu.rtlib.nanofps=Newlib Nano + Float Printf/Scanf
+Disco.menu.rtlib.nanofps.build.flags.ldspecs=--specs=nano.specs -u _printf_float -u _scanf_float
+Disco.menu.rtlib.full=Newlib Standard
+Disco.menu.rtlib.full.build.flags.ldspecs=
+
+GenF103.menu.rtlib.nano=Newlib Nano (default)
+GenF103.menu.rtlib.nano.build.flags.ldspecs=--specs=nano.specs
+GenF103.menu.rtlib.nanofp=Newlib Nano + Float Printf
+GenF103.menu.rtlib.nanofp.build.flags.ldspecs=--specs=nano.specs -u _printf_float
+GenF103.menu.rtlib.nanofs=Newlib Nano + Float Scanf
+GenF103.menu.rtlib.nanofs.build.flags.ldspecs=--specs=nano.specs -u _scanf_float
+GenF103.menu.rtlib.nanofps=Newlib Nano + Float Printf/Scanf
+GenF103.menu.rtlib.nanofps.build.flags.ldspecs=--specs=nano.specs -u _printf_float -u _scanf_float
+GenF103.menu.rtlib.full=Newlib Standard
+GenF103.menu.rtlib.full.build.flags.ldspecs=
+
+GenF4.menu.rtlib.nano=Newlib Nano (default)
+GenF4.menu.rtlib.nano.build.flags.ldspecs=--specs=nano.specs
+GenF4.menu.rtlib.nanofp=Newlib Nano + Float Printf
+GenF4.menu.rtlib.nanofp.build.flags.ldspecs=--specs=nano.specs -u _printf_float
+GenF4.menu.rtlib.nanofs=Newlib Nano + Float Scanf
+GenF4.menu.rtlib.nanofs.build.flags.ldspecs=--specs=nano.specs -u _scanf_float
+GenF4.menu.rtlib.nanofps=Newlib Nano + Float Printf/Scanf
+GenF4.menu.rtlib.nanofps.build.flags.ldspecs=--specs=nano.specs -u _printf_float -u _scanf_float
+GenF4.menu.rtlib.full=Newlib Standard
+GenF4.menu.rtlib.full.build.flags.ldspecs=
+
+Maple.menu.rtlib.nano=Newlib Nano (default)
+Maple.menu.rtlib.nano.build.flags.ldspecs=--specs=nano.specs
+Maple.menu.rtlib.nanofp=Newlib Nano + Float Printf
+Maple.menu.rtlib.nanofp.build.flags.ldspecs=--specs=nano.specs -u _printf_float
+Maple.menu.rtlib.nanofs=Newlib Nano + Float Scanf
+Maple.menu.rtlib.nanofs.build.flags.ldspecs=--specs=nano.specs -u _scanf_float
+Maple.menu.rtlib.nanofps=Newlib Nano + Float Printf/Scanf
+Maple.menu.rtlib.nanofps.build.flags.ldspecs=--specs=nano.specs -u _printf_float -u _scanf_float
+Maple.menu.rtlib.full=Newlib Standard
+Maple.menu.rtlib.full.build.flags.ldspecs=
+
+RemRam.menu.rtlib.nano=Newlib Nano (default)
+RemRam.menu.rtlib.nano.build.flags.ldspecs=--specs=nano.specs
+RemRam.menu.rtlib.nanofp=Newlib Nano + Float Printf
+RemRam.menu.rtlib.nanofp.build.flags.ldspecs=--specs=nano.specs -u _printf_float
+RemRam.menu.rtlib.nanofs=Newlib Nano + Float Scanf
+RemRam.menu.rtlib.nanofs.build.flags.ldspecs=--specs=nano.specs -u _scanf_float
+RemRam.menu.rtlib.nanofps=Newlib Nano + Float Printf/Scanf
+RemRam.menu.rtlib.nanofps.build.flags.ldspecs=--specs=nano.specs -u _printf_float -u _scanf_float
+RemRam.menu.rtlib.full=Newlib Standard
+RemRam.menu.rtlib.full.build.flags.ldspecs=
diff --git a/platform.txt b/platform.txt
index 01ac507e35..4260277745 100644
--- a/platform.txt
+++ b/platform.txt
@@ -33,7 +33,7 @@ compiler.extra_flags=-mcpu={build.mcu} -mthumb "@{build.opt.path}"
compiler.S.flags={compiler.extra_flags} -c -x assembler-with-cpp {compiler.stm.extra_include}
-compiler.c.flags={compiler.extra_flags} -c {build.flags.optimize} {compiler.warning_flags} -std=gnu11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -Dprintf=iprintf -MMD {compiler.stm.extra_include}
+compiler.c.flags={compiler.extra_flags} -c {build.flags.optimize} {compiler.warning_flags} -std=gnu11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -MMD {compiler.stm.extra_include}
compiler.cpp.flags={compiler.extra_flags} -c {build.flags.optimize} {compiler.warning_flags} -std={compiler.cpp.std} -ffunction-sections -fdata-sections -nostdlib -fno-threadsafe-statics --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD {compiler.stm.extra_include}
@@ -46,7 +46,7 @@ compiler.objcopy.eep.flags=-O ihex -j .eeprom --set-section-flags=.eeprom=alloc,
compiler.elf2bin.flags=-O binary
compiler.elf2hex.flags=-O ihex
-compiler.ldflags={build.flags.ldspecs}
+compiler.ldflags=
compiler.size.cmd=arm-none-eabi-size
compiler.define=-DARDUINO=
@@ -82,7 +82,7 @@ build.info.flags=-D{build.series} -DARDUINO={runtime.ide.version} -DARDUINO_{bui
build.xSerial=-DHAL_UART_MODULE_ENABLED
build.enable_usb=
build.flags.optimize=-Os
-build.flags.ldspecs=
+build.flags.ldspecs=--specs=nano.specs
# Pre and post build hooks
build.opt.name=build_opt.h
@@ -110,7 +110,7 @@ recipe.S.o.pattern="{compiler.path}{compiler.S.cmd}" {compiler.S.flags} {build.i
recipe.ar.pattern="{compiler.path}{compiler.ar.cmd}" {compiler.ar.flags} {compiler.ar.extra_flags} "{archive_file_path}" "{object_file}"
## Combine gc-sections, archives, and objects
-recipe.c.combine.pattern="{compiler.path}{compiler.c.elf.cmd}" {compiler.c.elf.flags} "-T{build.variant.path}/{build.ldscript}" "-Wl,-Map,{build.path}/{build.project_name}.map" {compiler.c.elf.extra_flags} {compiler.ldflags} {compiler.arm.cmsis.ldflags} -o "{build.path}/{build.project_name}.elf" "-L{build.path}" -Wl,--start-group {object_files} -Wl,--whole-archive "{archive_file_path}" -Wl,--no-whole-archive -lc -Wl,--end-group -lm -lgcc -lstdc++ --specs=nano.specs
+recipe.c.combine.pattern="{compiler.path}{compiler.c.elf.cmd}" {compiler.c.elf.flags} "-T{build.variant.path}/{build.ldscript}" "-Wl,-Map,{build.path}/{build.project_name}.map" {compiler.c.elf.extra_flags} {compiler.ldflags} {compiler.arm.cmsis.ldflags} -o "{build.path}/{build.project_name}.elf" "-L{build.path}" -Wl,--start-group {object_files} -Wl,--whole-archive "{archive_file_path}" -Wl,--no-whole-archive -lc -Wl,--end-group -lm -lgcc -lstdc++
## Create output (.bin file)
recipe.objcopy.bin.pattern="{compiler.path}{compiler.objcopy.cmd}" {compiler.elf2bin.flags} {compiler.elf2bin.extra_flags} "{build.path}/{build.project_name}.elf" "{build.path}/{build.project_name}.bin"