Larger builds for Arduino project using PlatformIO and CLion, 1.8kB lost!

The build size of PlatformIO is different from Arduino build size.

Project platformio.ini:

[env:nanoatmega328]
platform = atmelavr
board = nanoatmega328
framework = arduino
lib_extra_dirs = /Users/zoonman/Documents/Arduino/libraries
lib_ldf_mode = chain
; build_unflags = -lstdc++ -larm_cortexM4l_math

I tried build_unflags suggested in similar topic.

PlatformIO:

DATA: [==== ] 40.6% (used 831 bytes from 2048 bytes)
PROGRAM: [========= ] 87.6% (used 26900 bytes from 30720 bytes)

Complete CLion Output
/Applications/CLion.app/Contents/bin/cmake/mac/bin/cmake --build /Users/zoonman/Projects/cpp/nanodds/cmake-build-debug --target PLATFORMIO_BUILD -- -j 4
Processing nanoatmega328 (platform: atmelavr; board: nanoatmega328; framework: arduino)
--------------------------------------------------------------------------------
Verbose mode can be enabled via `-v, --verbose` option
PLATFORM: Atmel AVR > Arduino Nano ATmega328
SYSTEM: ATMEGA328P 16MHz 2KB RAM (30KB Flash)
Library Dependency Finder -> http://bit.ly/configure-pio-ldf
LDF MODES: FINDER(chain) COMPATIBILITY(soft)
Collected 34 compatible libraries
Scanning dependencies...
Dependency Graph
|-- <Adafruit ST7735 and ST7789 Library> 1.2.4
|   |-- <Adafruit GFX Library> 1.2.9
|   |   |-- <SPI> 1.0
|   |-- <SPI> 1.0
|-- <Adafruit GFX Library> 1.2.9
|   |-- <SPI> 1.0
|-- <Wire> 1.0
|-- <Etherkit Si5351> 2.1.2
|   |-- <Wire> 1.0
|-- <Encoder>
Compiling .pioenvs/nanoatmega328/src/main.cpp.o
Linking .pioenvs/nanoatmega328/firmware.elf
Checking size .pioenvs/nanoatmega328/firmware.elf
Building .pioenvs/nanoatmega328/firmware.hex
Memory Usage -> http://bit.ly/pio-memory-usage
DATA:    [====      ]  40.6% (used 831 bytes from 2048 bytes)
PROGRAM: [========= ]  87.6% (used 26900 bytes from 30720 bytes)
========================= [SUCCESS] Took 1.53 seconds =========================
Built target PLATFORMIO_BUILD

Build finished

Arduino:

Sketch uses 25070 bytes (81%) of program storage space. Maximum is 30720 bytes.
Global variables use 826 bytes (40%) of dynamic memory, leaving 1222 bytes for local variables. Maximum is 2048 bytes.

Maybe there is a way to use Arduino IDE’s compilers and options?

I was able to extract compiler options from arduino-builder. But I am not sure what is inside PlatformIO.

/Applications/Arduino.app/Contents/Java/arduino-builder -dump-prefs -logger=machine -hardware /Applications/Arduino.app/Contents/Java/hardware -hardware /Users/zoonman/Library/Arduino15/packages -tools /Applications/Arduino.app/Contents/Java/tools-builder -tools /Applications/Arduino.app/Contents/Java/hardware/tools/avr -tools /Users/zoonman/Library/Arduino15/packages -built-in-libraries /Applications/Arduino.app/Contents/Java/libraries -libraries /Users/zoonman/Documents/Arduino/libraries -fqbn=arduino:avr:nano:cpu=atmega328old -ide-version=10807 -build-path /var/folders/3f/3fj2j0b918db3tbd39b6_07c0000gn/T/arduino_build_348865 -warnings=default -build-cache /var/folders/3f/3fj2j0b918db3tbd39b6_07c0000gn/T/arduino_cache_928774 -prefs=build.warn_data_percentage=75 -prefs=runtime.tools.avrdude.path=/Users/zoonman/Library/Arduino15/packages/arduino/tools/avrdude/6.3.0-arduino14 -prefs=runtime.tools.avrdude-6.3.0-arduino14.path=/Users/zoonman/Library/Arduino15/packages/arduino/tools/avrdude/6.3.0-arduino14 -prefs=runtime.tools.arduinoOTA.path=/Users/zoonman/Library/Arduino15/packages/arduino/tools/arduinoOTA/1.2.1 -prefs=runtime.tools.arduinoOTA-1.2.1.path=/Users/zoonman/Library/Arduino15/packages/arduino/tools/arduinoOTA/1.2.1 -prefs=runtime.tools.avr-gcc.path=/Users/zoonman/Library/Arduino15/packages/arduino/tools/avr-gcc/5.4.0-atmel3.6.1-arduino2 -prefs=runtime.tools.avr-gcc-5.4.0-atmel3.6.1-arduino2.path=/Users/zoonman/Library/Arduino15/packages/arduino/tools/avr-gcc/5.4.0-atmel3.6.1-arduino2 -verbose /Users/zoonman/Documents/Arduino/nano_twi_probe/nano_twi_probe.ino 
===info ||| Progress {0} ||| [0.00]
===info ||| Progress {0} ||| [33.33]
===info ||| Progress {0} ||| [66.67]
===info ||| Progress {0} ||| [69.05]
===info ||| Progress {0} ||| [71.43]
===info ||| Progress {0} ||| [73.81]
===info ||| Progress {0} ||| [76.19]
===info ||| Progress {0} ||| [78.57]
===info ||| Progress {0} ||| [80.95]
===info ||| Using board '{0}' from platform in folder: {1} ||| [nano %2FUsers%2Fzoonman%2FLibrary%2FArduino15%2Fpackages%2Farduino%2Fhardware%2Favr%2F1.6.23]
===info ||| Using core '{0}' from platform in folder: {1} ||| [arduino %2FUsers%2Fzoonman%2FLibrary%2FArduino15%2Fpackages%2Farduino%2Fhardware%2Favr%2F1.6.23]
===info ||| Progress {0} ||| [83.33]
===info ||| Progress {0} ||| [85.71]
===info ||| Progress {0} ||| [88.10]
===info ||| Progress {0} ||| [90.48]
===info ||| Progress {0} ||| [92.86]
===info ||| Progress {0} ||| [95.24]
===info ||| Progress {0} ||| [97.62]
===info ||| Progress {0} ||| [100.00]
_id=nano
archive_file_path={build.path}/{archive_file}
bootloader.extended_fuses=0xFD
bootloader.file=atmega/ATmegaBOOT_168_atmega328.hex
bootloader.high_fuses=0xDA
bootloader.lock_bits=0x0F
bootloader.low_fuses=0xFF
bootloader.tool=avrdude
bootloader.unlock_bits=0x3F
build.arch=AVR
build.board=AVR_NANO
build.core=arduino
build.core.path=/Users/zoonman/Library/Arduino15/packages/arduino/hardware/avr/1.6.23/cores/arduino
build.extra_flags=
build.f_cpu=16000000L
build.fqbn=arduino:avr:nano:cpu=atmega328old
build.mcu=atmega328p
build.path=/var/folders/3f/3fj2j0b918db3tbd39b6_07c0000gn/T/arduino_build_348865
build.project_name=nano_twi_probe.ino
build.source.path=/Users/zoonman/Documents/Arduino/nano_twi_probe
build.system.path=/Users/zoonman/Library/Arduino15/packages/arduino/hardware/avr/1.6.23/system
build.usb_flags=-DUSB_VID={build.vid} -DUSB_PID={build.pid} '-DUSB_MANUFACTURER={build.usb_manufacturer}' '-DUSB_PRODUCT={build.usb_product}'
build.usb_manufacturer="Unknown"
build.variant=eightanaloginputs
build.variant.path=/Users/zoonman/Library/Arduino15/packages/arduino/hardware/avr/1.6.23/variants/eightanaloginputs
build.warn_data_percentage=75
compiler.S.extra_flags=
compiler.S.flags=-c -g -x assembler-with-cpp -flto -MMD
compiler.ar.cmd=avr-gcc-ar
compiler.ar.extra_flags=
compiler.ar.flags=rcs
compiler.c.cmd=avr-gcc
compiler.c.elf.cmd=avr-gcc
compiler.c.elf.extra_flags=
compiler.c.elf.flags={compiler.warning_flags} -Os -g -flto -fuse-linker-plugin -Wl,--gc-sections
compiler.c.extra_flags=
compiler.c.flags=-c -g -Os {compiler.warning_flags} -std=gnu11 -ffunction-sections -fdata-sections -MMD -flto -fno-fat-lto-objects
compiler.cpp.cmd=avr-g++
compiler.cpp.extra_flags=
compiler.cpp.flags=-c -g -Os {compiler.warning_flags} -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto
compiler.elf2hex.cmd=avr-objcopy
compiler.elf2hex.extra_flags=
compiler.elf2hex.flags=-O ihex -R .eeprom
compiler.ldflags=
compiler.objcopy.cmd=avr-objcopy
compiler.objcopy.eep.extra_flags=
compiler.objcopy.eep.flags=-O ihex -j .eeprom --set-section-flags=.eeprom=alloc,load --no-change-warnings --change-section-lma .eeprom=0
compiler.path={runtime.tools.avr-gcc.path}/bin/
compiler.size.cmd=avr-size
compiler.warning_flags=-w
compiler.warning_flags.all=-Wall -Wextra
compiler.warning_flags.default=
compiler.warning_flags.more=-Wall
compiler.warning_flags.none=-w
extra.time.dst=3600
extra.time.local=1540489342
extra.time.utc=1540503742
extra.time.zone=-18000
ide_version=10807
menu.cpu.atmega168=ATmega168
menu.cpu.atmega168.bootloader.extended_fuses=0xF8
menu.cpu.atmega168.bootloader.file=atmega/ATmegaBOOT_168_diecimila.hex
menu.cpu.atmega168.bootloader.high_fuses=0xdd
menu.cpu.atmega168.bootloader.low_fuses=0xff
menu.cpu.atmega168.build.mcu=atmega168
menu.cpu.atmega168.upload.maximum_data_size=1024
menu.cpu.atmega168.upload.maximum_size=14336
menu.cpu.atmega168.upload.speed=19200
menu.cpu.atmega328=ATmega328P
menu.cpu.atmega328.bootloader.extended_fuses=0xFD
menu.cpu.atmega328.bootloader.file=optiboot/optiboot_atmega328.hex
menu.cpu.atmega328.bootloader.high_fuses=0xDA
menu.cpu.atmega328.bootloader.low_fuses=0xFF
menu.cpu.atmega328.build.mcu=atmega328p
menu.cpu.atmega328.upload.maximum_data_size=2048
menu.cpu.atmega328.upload.maximum_size=30720
menu.cpu.atmega328.upload.speed=115200
menu.cpu.atmega328old=ATmega328P (Old Bootloader)
menu.cpu.atmega328old.bootloader.extended_fuses=0xFD
menu.cpu.atmega328old.bootloader.file=atmega/ATmegaBOOT_168_atmega328.hex
menu.cpu.atmega328old.bootloader.high_fuses=0xDA
menu.cpu.atmega328old.bootloader.low_fuses=0xFF
menu.cpu.atmega328old.build.mcu=atmega328p
menu.cpu.atmega328old.upload.maximum_data_size=2048
menu.cpu.atmega328old.upload.maximum_size=30720
menu.cpu.atmega328old.upload.speed=57600
name=Arduino Nano
preproc.includes.flags=-w -x c++ -M -MG -MP
preproc.macros.flags=-w -x c++ -E -CC
recipe.S.o.pattern="{compiler.path}{compiler.c.cmd}" {compiler.S.flags} -mmcu={build.mcu} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {compiler.S.extra_flags} {build.extra_flags} {includes} "{source_file}" -o "{object_file}"
recipe.ar.pattern="{compiler.path}{compiler.ar.cmd}" {compiler.ar.flags} {compiler.ar.extra_flags} "{archive_file_path}" "{object_file}"
recipe.c.combine.pattern="{compiler.path}{compiler.c.elf.cmd}" {compiler.c.elf.flags} -mmcu={build.mcu} {compiler.c.elf.extra_flags} -o "{build.path}/{build.project_name}.elf" {object_files} "{build.path}/{archive_file}" "-L{build.path}" -lm
recipe.c.o.pattern="{compiler.path}{compiler.c.cmd}" {compiler.c.flags} -mmcu={build.mcu} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {compiler.c.extra_flags} {build.extra_flags} {includes} "{source_file}" -o "{object_file}"
recipe.cpp.o.pattern="{compiler.path}{compiler.cpp.cmd}" {compiler.cpp.flags} -mmcu={build.mcu} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {compiler.cpp.extra_flags} {build.extra_flags} {includes} "{source_file}" -o "{object_file}"
recipe.objcopy.eep.pattern="{compiler.path}{compiler.objcopy.cmd}" {compiler.objcopy.eep.flags} {compiler.objcopy.eep.extra_flags} "{build.path}/{build.project_name}.elf" "{build.path}/{build.project_name}.eep"
recipe.objcopy.hex.pattern="{compiler.path}{compiler.elf2hex.cmd}" {compiler.elf2hex.flags} {compiler.elf2hex.extra_flags} "{build.path}/{build.project_name}.elf" "{build.path}/{build.project_name}.hex"
recipe.output.save_file={build.project_name}.{build.variant}.hex
recipe.output.tmp_file={build.project_name}.hex
recipe.preproc.includes="{compiler.path}{compiler.cpp.cmd}" {compiler.cpp.flags} {preproc.includes.flags} -mmcu={build.mcu} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {compiler.cpp.extra_flags} {build.extra_flags} {includes} "{source_file}"
recipe.preproc.macros="{compiler.path}{compiler.cpp.cmd}" {compiler.cpp.flags} {preproc.macros.flags} -mmcu={build.mcu} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {compiler.cpp.extra_flags} {build.extra_flags} {includes} "{source_file}" -o "{preprocessed_file_path}"
recipe.size.pattern="{compiler.path}{compiler.size.cmd}" -A "{build.path}/{build.project_name}.elf"
recipe.size.regex=^(?:\.text|\.data|\.bootloader)\s+([0-9]+).*
recipe.size.regex.data=^(?:\.data|\.bss|\.noinit)\s+([0-9]+).*
recipe.size.regex.eeprom=^(?:\.eeprom)\s+([0-9]+).*
runtime.hardware.path=/Users/zoonman/Library/Arduino15/packages/arduino/hardware/avr
runtime.ide.path=/Applications/Arduino.app/Contents/Java
runtime.ide.version=10807
runtime.os=macosx
runtime.platform.path=/Users/zoonman/Library/Arduino15/packages/arduino/hardware/avr/1.6.23
runtime.tools.arduino-preprocessor-0.1.5.path=/Applications/Arduino.app/Contents/Java/tools-builder/arduino-preprocessor/0.1.5
runtime.tools.arduino-preprocessor.path=/Applications/Arduino.app/Contents/Java/tools-builder/arduino-preprocessor/0.1.5
runtime.tools.arduinoOTA-1.2.1.path=/Users/zoonman/Library/Arduino15/packages/arduino/tools/arduinoOTA/1.2.1
runtime.tools.arduinoOTA.path=/Users/zoonman/Library/Arduino15/packages/arduino/tools/arduinoOTA/1.2.1
runtime.tools.avr-gcc-5.4.0-atmel3.6.1-arduino2.path=/Users/zoonman/Library/Arduino15/packages/arduino/tools/avr-gcc/5.4.0-atmel3.6.1-arduino2
runtime.tools.avr-gcc.path=/Users/zoonman/Library/Arduino15/packages/arduino/tools/avr-gcc/5.4.0-atmel3.6.1-arduino2
runtime.tools.avrdude-6.3.0-arduino14.path=/Users/zoonman/Library/Arduino15/packages/arduino/tools/avrdude/6.3.0-arduino14
runtime.tools.avrdude.path=/Users/zoonman/Library/Arduino15/packages/arduino/tools/avrdude/6.3.0-arduino14
runtime.tools.ctags-5.8-arduino11.path=/Applications/Arduino.app/Contents/Java/tools-builder/ctags/5.8-arduino11
runtime.tools.ctags.path=/Applications/Arduino.app/Contents/Java/tools-builder/ctags/5.8-arduino11
software=ARDUINO
tools.arduino-preprocessor.cmd.path={path}/arduino-preprocessor
tools.arduino-preprocessor.path={runtime.tools.arduino-preprocessor.path}
tools.arduino-preprocessor.pattern="{cmd.path}" "{source_file}" "{codecomplete}" -- -std=gnu++11
tools.avrdude.bootloader.params.quiet=-q -q
tools.avrdude.bootloader.params.verbose=-v
tools.avrdude.bootloader.pattern="{cmd.path}" "-C{config.path}" {bootloader.verbose} -p{build.mcu} -c{protocol} {program.extra_params} "-Uflash:w:{runtime.platform.path}/bootloaders/{bootloader.file}:i" -Ulock:w:{bootloader.lock_bits}:m
tools.avrdude.cmd.path={path}/bin/avrdude
tools.avrdude.config.path={path}/etc/avrdude.conf
tools.avrdude.erase.params.quiet=-q -q
tools.avrdude.erase.params.verbose=-v
tools.avrdude.erase.pattern="{cmd.path}" "-C{config.path}" {erase.verbose} -p{build.mcu} -c{protocol} {program.extra_params} -e -Ulock:w:{bootloader.unlock_bits}:m -Uefuse:w:{bootloader.extended_fuses}:m -Uhfuse:w:{bootloader.high_fuses}:m -Ulfuse:w:{bootloader.low_fuses}:m
tools.avrdude.network_cmd={runtime.tools.arduinoOTA.path}/bin/arduinoOTA
tools.avrdude.path={runtime.tools.avrdude.path}
tools.avrdude.program.params.noverify=-V
tools.avrdude.program.params.quiet=-q -q
tools.avrdude.program.params.verbose=-v
tools.avrdude.program.pattern="{cmd.path}" "-C{config.path}" {program.verbose} {program.verify} -p{build.mcu} -c{protocol} {program.extra_params} "-Uflash:w:{build.path}/{build.project_name}.hex:i"
tools.avrdude.program.verify=
tools.avrdude.upload.network_pattern="{network_cmd}" -address {serial.port} -port {upload.network.port} -sketch "{build.path}/{build.project_name}.hex" -upload {upload.network.endpoint_upload} -sync {upload.network.endpoint_sync} -reset {upload.network.endpoint_reset} -sync_exp {upload.network.sync_return}
tools.avrdude.upload.params.noverify=-V
tools.avrdude.upload.params.quiet=-q -q
tools.avrdude.upload.params.verbose=-v
tools.avrdude.upload.pattern="{cmd.path}" "-C{config.path}" {upload.verbose} {upload.verify} -p{build.mcu} -c{upload.protocol} "-P{serial.port}" -b{upload.speed} -D "-Uflash:w:{build.path}/{build.project_name}.hex:i"
tools.avrdude.upload.verify=
tools.avrdude_remote.upload.pattern=/usr/bin/run-avrdude /tmp/sketch.hex {upload.verbose} -p{build.mcu}
tools.ctags.cmd.path={path}/ctags
tools.ctags.path={runtime.tools.ctags.path}
tools.ctags.pattern="{cmd.path}" -u --language-force=c++ -f - --c++-kinds=svpf --fields=KSTtzns --line-directives "{source_file}"
upload.maximum_data_size=2048
upload.maximum_size=30720
upload.protocol=arduino
upload.speed=57600
upload.tool=avrdude
version=1.6.23

Looks like Arduino is using a more modern version of compiler 5.4.0-atmel3.6.1-arduino2 while platformio toolchain sticks to 4.9.2.
Does anyone know how to use toolchain from Arduino IDE?

Please open an issue in Platformio bugtracker to update the compiler version (toolchain-atmelavr).

I think there is the one Use arduino-cli · Issue #107 · platformio/platform-atmelavr · GitHub ?

Well, I’ve read its description and it’s not related to compiler IMO.

Atmel AVR toolchain has been updated to 5.4.0

Please re-test with upstream version Atmel AVR — PlatformIO latest documentation

1 Like

New build is Awesome!

4.9.2:

DATA:    [====      ]  40.8% (used 836 bytes from 2048 bytes)
PROGRAM: [========= ]  89.9% (used 27620 bytes from 30720 bytes)

And kicking ass 5.4.0:

DATA:    [====      ]  40.4% (used 828 bytes from 2048 bytes)
PROGRAM: [========  ]  83.9% (used 25770 bytes from 30720 bytes)

Just programmed my Nano and everything worked fine!

IMG_4711%20(1)

Many thanks!

1 Like

Great! We have just released v1.12.0 of Atmel AVR dev/platform. Please update to stable version: PIO IDE > PIO Home > Platforms > Updates

1 Like