mirror of
https://github.com/Klipper3d/klipper.git
synced 2026-10-21 11:12:54 -05:00
Generate defconfig before compile-time requests and pass it to buildcommands.py. Store the resulting config under the identify dictionary's kconfig key so it matches the firmware. An empty defconfig is valid when the selected board uses all default values. Regenerate it whenever the build runs. Signed-off-by: Morton Jonuschat <mjonuschat@gmail.com>
135 lines
3.8 KiB
Makefile
135 lines
3.8 KiB
Makefile
# Klipper build system
|
|
#
|
|
# Copyright (C) 2016-2020 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 -fno-use-linker-plugin -ggdb3
|
|
|
|
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) lib/kconfiglib/savedefconfig.py --kconfig src/Kconfig --out $(OUT)defconfig
|
|
$(Q)$(PYTHON) ./scripts/buildcommands.py -d $(OUT)klipper.dict -k $(OUT)defconfig -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))
|