mirror of
https://github.com/andreili/klipper.git
synced 2025-08-23 19:34:06 +02:00
This option seems to be confusing ld's region usage checks (builds that could fit in small chips are being reported as not fitting). The option was disabled back in commit 4e8674d5 because it showed worse results. However, recent versions of gcc seem to produce the same results even if this option is enabled, so change the build to avoid disabling that option on newer versions of gcc (those that have the -ffat-lto-objects option - which is needed to ensure compile_time_requests sections can be extracted with objcopy). The PRU build is dependent on -fuse-linker-plugin, so enable that option explicitly in its build. Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
135 lines
3.8 KiB
Makefile
135 lines
3.8 KiB
Makefile
# Klipper build system
|
|
#
|
|
# Copyright (C) 2016-2025 Kevin O'Connor <kevin@koconnor.net>
|
|
#
|
|
# This file may be distributed under the terms of the GNU GPLv3 license.
|
|
|
|
# Output directory
|
|
OUT=out/
|
|
|
|
# Kconfig includes
|
|
export KCONFIG_CONFIG := $(CURDIR)/.config
|
|
-include $(KCONFIG_CONFIG)
|
|
|
|
# Common command definitions
|
|
CC=$(CROSS_PREFIX)gcc
|
|
AS=$(CROSS_PREFIX)as
|
|
LD=$(CROSS_PREFIX)ld
|
|
OBJCOPY=$(CROSS_PREFIX)objcopy
|
|
OBJDUMP=$(CROSS_PREFIX)objdump
|
|
STRIP=$(CROSS_PREFIX)strip
|
|
CPP=cpp
|
|
PYTHON=python3
|
|
|
|
# Source files
|
|
src-y =
|
|
dirs-y = src
|
|
|
|
# Default compiler flags
|
|
cc-option=$(shell if test -z "`$(1) $(2) -S -o /dev/null -xc /dev/null 2>&1`" \
|
|
; then echo "$(2)"; else echo "$(3)"; fi ;)
|
|
|
|
CFLAGS := -iquote $(OUT) -iquote src -iquote $(OUT)board-generic/ \
|
|
-std=gnu11 -O2 -MD -Wall \
|
|
-Wold-style-definition $(call cc-option,$(CC),-Wtype-limits,) \
|
|
-ffunction-sections -fdata-sections -fno-delete-null-pointer-checks
|
|
CFLAGS += -flto=auto -fwhole-program -ggdb3
|
|
CFLAGS += $(call cc-option,$(CC),-ffat-lto-objects,-fno-use-linker-plugin)
|
|
|
|
OBJS_klipper.elf = $(patsubst %.c, $(OUT)src/%.o,$(src-y))
|
|
OBJS_klipper.elf += $(OUT)compile_time_request.o
|
|
CFLAGS_klipper.elf = $(CFLAGS) -Wl,--gc-sections
|
|
|
|
CPPFLAGS = -I$(OUT) -P -MD -MT $@
|
|
|
|
# Default targets
|
|
target-y := $(OUT)klipper.elf
|
|
|
|
all:
|
|
|
|
# Run with "make V=1" to see the actual compile commands
|
|
ifdef V
|
|
Q=
|
|
else
|
|
Q=@
|
|
MAKEFLAGS += --no-print-directory
|
|
endif
|
|
|
|
# Include board specific makefile
|
|
include src/Makefile
|
|
-include src/$(patsubst "%",%,$(CONFIG_BOARD_DIRECTORY))/Makefile
|
|
|
|
################ Main build rules
|
|
|
|
$(OUT)%.o: %.c $(OUT)autoconf.h
|
|
@echo " Compiling $@"
|
|
$(Q)$(CC) $(CFLAGS) -c $< -o $@
|
|
|
|
$(OUT)%.ld: %.lds.S $(OUT)autoconf.h
|
|
@echo " Preprocessing $@"
|
|
$(Q)$(CPP) -I$(OUT) -P -MD -MT $@ $< -o $@
|
|
|
|
$(OUT)klipper.elf: $(OBJS_klipper.elf)
|
|
@echo " Linking $@"
|
|
$(Q)$(CC) $(OBJS_klipper.elf) $(CFLAGS_klipper.elf) -o $@
|
|
$(Q)scripts/check-gcc.sh $@ $(OUT)compile_time_request.o
|
|
|
|
################ Compile time requests
|
|
|
|
$(OUT)%.o.ctr: $(OUT)%.o
|
|
$(Q)$(OBJCOPY) -j '.compile_time_request' -O binary $^ $@
|
|
|
|
$(OUT)compile_time_request.o: $(patsubst %.c, $(OUT)src/%.o.ctr,$(src-y)) ./scripts/buildcommands.py
|
|
@echo " Building $@"
|
|
$(Q)cat $(patsubst %.c, $(OUT)src/%.o.ctr,$(src-y)) | tr -s '\0' '\n' > $(OUT)compile_time_request.txt
|
|
$(Q)$(PYTHON) ./scripts/buildcommands.py -d $(OUT)klipper.dict -t "$(CC);$(AS);$(LD);$(OBJCOPY);$(OBJDUMP);$(STRIP)" $(OUT)compile_time_request.txt $(OUT)compile_time_request.c
|
|
$(Q)$(CC) $(CFLAGS) -c $(OUT)compile_time_request.c -o $@
|
|
|
|
################ Auto generation of "board/" include file link
|
|
|
|
create-board-link:
|
|
@echo " Creating symbolic link $(OUT)board"
|
|
$(Q)mkdir -p $(addprefix $(OUT), $(dirs-y))
|
|
$(Q)rm -f $(OUT)*.d $(patsubst %,$(OUT)%/*.d,$(dirs-y))
|
|
$(Q)rm -f $(OUT)board
|
|
$(Q)ln -sf $(CURDIR)/src/$(CONFIG_BOARD_DIRECTORY) $(OUT)board
|
|
$(Q)mkdir -p $(OUT)board-generic
|
|
$(Q)rm -f $(OUT)board-generic/board
|
|
$(Q)ln -sf $(CURDIR)/src/generic $(OUT)board-generic/board
|
|
|
|
# Hack to rebuild OUT directory and reload make dependencies on Kconfig change
|
|
$(OUT)board-link: $(KCONFIG_CONFIG)
|
|
$(Q)mkdir -p $(OUT)
|
|
$(Q)echo "# Makefile board-link rule" > $@
|
|
$(Q)$(MAKE) create-board-link
|
|
include $(OUT)board-link
|
|
|
|
################ Kconfig rules
|
|
|
|
$(OUT)autoconf.h: $(KCONFIG_CONFIG)
|
|
@echo " Building $@"
|
|
$(Q)mkdir -p $(OUT)
|
|
$(Q) KCONFIG_AUTOHEADER=$@ $(PYTHON) lib/kconfiglib/genconfig.py src/Kconfig
|
|
|
|
$(KCONFIG_CONFIG) olddefconfig: src/Kconfig
|
|
$(Q)$(PYTHON) lib/kconfiglib/olddefconfig.py src/Kconfig
|
|
|
|
menuconfig:
|
|
$(Q)$(PYTHON) lib/kconfiglib/menuconfig.py src/Kconfig
|
|
|
|
################ Generic rules
|
|
|
|
# Make definitions
|
|
.PHONY : all clean distclean olddefconfig menuconfig create-board-link FORCE
|
|
.DELETE_ON_ERROR:
|
|
|
|
all: $(target-y)
|
|
|
|
clean:
|
|
$(Q)rm -rf $(OUT)
|
|
|
|
distclean: clean
|
|
$(Q)rm -f .config .config.old
|
|
|
|
-include $(OUT)*.d $(patsubst %,$(OUT)%/*.d,$(dirs-y))
|