mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2025-01-18 12:52:44 +01:00
63c475cd4d
Use the -gz option to compress ELF sections containing DWARF information. This saves around 50% of disk space, without any side effects. See https://gcc.gnu.org/onlinedocs/gcc-9.2.0/gcc/Debugging-Options.html#Debugging-Options for more infomation on this option. Some platforms have an outdated toolchain that does not support -gz so the flag is blacklisted there. Even then, the results are quite impressive. I used @cladmi's `buildtest` branch (https://github.com/cladmi/RIOT/tree/wip/du/buildtest) with this change and compiled the `examples/default` application: ``` $ BUILD_IN_DOCKER=1 DOCKER="sudo docker" make -C examples/default buildtest-indocker ``` The size was obtained with: ``` $ find output -name "*.bin.bindirsize" -type f -exec tail -n1 '{}' \; | cut -f 1 | awk '{s+=$1} END {printf "%.0f", s}' ``` Results: - Vanilla: 10328112 KB (~10GB). - with -gz: 4982788 KB (~5GB). This was inspired by #8496.
57 lines
2.2 KiB
Makefile
57 lines
2.2 KiB
Makefile
# Target architecture for the build. Use avr if you are unsure.
|
|
TARGET_ARCH ?= avr
|
|
|
|
CFLAGS_CPU = -mmcu=$(CPU) $(CFLAGS_FPU)
|
|
CFLAGS_LINK = -ffunction-sections -fdata-sections -fno-builtin -fshort-enums
|
|
CFLAGS_DBG ?= -ggdb -g3
|
|
CFLAGS_OPT ?= -Os
|
|
|
|
CFLAGS += $(CFLAGS_CPU) $(CFLAGS_LINK) $(CFLAGS_DBG) $(CFLAGS_OPT)
|
|
ASFLAGS += $(CFLAGS_CPU) $(CFLAGS_DBG)
|
|
LINKFLAGS += $(CFLAGS_CPU) $(CFLAGS_DBG) $(CFLAGS_OPT) -static -lgcc -e reset_handler -Wl,--gc-sections
|
|
OFLAGS += -j .text -j .data
|
|
|
|
# Tell the build system that the CPU depends on the atmega common files:
|
|
USEMODULE += atmega_common
|
|
|
|
# export the peripheral drivers to be linked into the final binary
|
|
USEMODULE += atmega_common_periph
|
|
|
|
# Export the peripheral drivers to be linked into the final binary, for now
|
|
# only atmega126rfr2 has periph drivers
|
|
ifeq ($(CPU), atmega256rfr2)
|
|
USEMODULE += periph
|
|
endif
|
|
|
|
# the atmel port uses stdio_uart
|
|
USEMODULE += stdio_uart
|
|
|
|
# explicitly tell the linker to link the syscalls and startup code.
|
|
# without this the interrupt vectors will not be linked correctly!
|
|
UNDEF += $(BINDIR)/atmega_common/startup.o
|
|
|
|
# Use ROM_LEN and RAM_LEN during link
|
|
$(if $(ROM_LEN),,$(error ROM_LEN is not defined))
|
|
$(if $(RAM_LEN),,$(error RAM_LEN is not defined))
|
|
LINKFLAGS += $(LINKFLAGPREFIX)--defsym=__TEXT_REGION_LENGTH__=$(ROM_LEN)$(if $(ROM_RESERVED),-$(ROM_RESERVED))
|
|
LINKFLAGS += $(LINKFLAGPREFIX)--defsym=__DATA_REGION_LENGTH__=$(RAM_LEN)
|
|
|
|
# Use newer linker script to have ROM/RAM configuration symbols in binutils<2.26
|
|
LDSCRIPT_COMPAT = $(if $(shell $(TARGET_ARCH)-ld --verbose | grep __TEXT_REGION_LENGTH__),,\
|
|
-T$(RIOTCPU)/$(CPU)/ldscripts_compat/avr_2.26.ld)
|
|
LINKFLAGS += $(LDSCRIPT_COMPAT)
|
|
|
|
# use the wrapper functions for following avr-libc functions
|
|
LINKFLAGS += -Wl,-wrap=malloc -Wl,-wrap=calloc -Wl,-wrap=realloc -Wl,-wrap=free
|
|
|
|
ifeq ($(LTO),1)
|
|
# avr-gcc <4.8.3 has a bug when using LTO which causes a warning to be printed always:
|
|
# '_vector_25' appears to be a misspelled signal handler [enabled by default]
|
|
# See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=59396
|
|
LINKFLAGS += -Wno-error
|
|
endif
|
|
|
|
OPTIONAL_CFLAGS_BLACKLIST += -Wformat-overflow
|
|
OPTIONAL_CFLAGS_BLACKLIST += -Wformat-truncation
|
|
OPTIONAL_CFLAGS_BLACKLIST += -gz
|