mirror of https://github.com/Desuuuu/klipper.git
129 lines
3.6 KiB
Makefile
129 lines
3.6 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=python2
|
|
|
|
# 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 := -I$(OUT) -Isrc -I$(OUT)board-generic/ -std=gnu11 -O2 -MD -g \
|
|
-Wall -Wold-style-definition $(call cc-option,$(CC),-Wtype-limits,) \
|
|
-ffunction-sections -fdata-sections
|
|
CFLAGS += -flto -fwhole-program -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
|
|
|
|
$(OUT)board-link: $(KCONFIG_CONFIG)
|
|
@echo " Creating symbolic link $(OUT)board"
|
|
$(Q)mkdir -p $(addprefix $(OUT), $(dirs-y))
|
|
$(Q)echo "#$(CONFIG_BOARD_DIRECTORY)" > $@.temp
|
|
$(Q)if ! cmp -s $@.temp $@; then rm -f $(OUT)*.d $(patsubst %,$(OUT)%/*.d,$(dirs-y)) ; mv $@.temp $@ ; fi
|
|
$(Q)rm -f $(OUT)board
|
|
$(Q)ln -sf $(PWD)/src/$(CONFIG_BOARD_DIRECTORY) $(OUT)board
|
|
$(Q)mkdir -p $(OUT)board-generic
|
|
$(Q)rm -f $(OUT)board-generic/board
|
|
$(Q)ln -sf $(PWD)/src/generic $(OUT)board-generic/board
|
|
|
|
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 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))
|