diff options
Diffstat (limited to 'Makefile')
-rw-r--r-- | Makefile | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/Makefile b/Makefile new file mode 100644 index 000000000..8c8967ea5 --- /dev/null +++ b/Makefile @@ -0,0 +1,123 @@ +# Klipper build system +# +# Copyright (C) 2016 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 HOSTCC := $(CC) +export CONFIG_SHELL := sh +export KCONFIG_AUTOHEADER := autoconf.h +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=python + +# Source files +src-y=sched.c command.c stepper.c basecmd.c gpiocmds.c spicmds.c endstop.c +DIRS=src src/avr src/simulator + +# 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-y := -I$(OUT) -Isrc -Os -MD -g \ + -Wall -Wold-style-definition $(call cc-option,$(CC),-Wtype-limits,) \ + -ffunction-sections -fdata-sections +CFLAGS-y += -flto -fwhole-program + +LDFLAGS-y := -Wl,--gc-sections + +CPPFLAGS = -P -MD -MT $@ + +CFLAGS = $(CFLAGS-y) +LDFLAGS = $(LDFLAGS-y) + +# 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/$(patsubst "%",%,$(CONFIG_BOARD_DIRECTORY))/Makefile + +################ Common build rules + +$(OUT)%.o: %.c $(OUT)autoconf.h $(OUT)board-link + @echo " Compiling $@" + $(Q)$(CC) $(CFLAGS) -c $< -o $@ + +################ Main build rules + +$(OUT)board-link: $(KCONFIG_CONFIG) + @echo " Creating symbolic link $(OUT)board" + $(Q)touch $@ + $(Q)ln -Tsf $(PWD)/src/$(CONFIG_BOARD_DIRECTORY) $(OUT)board + +$(OUT)declfunc.lds: src/declfunc.lds.S + @echo " Precompiling $@" + $(Q)$(CPP) $(CPPFLAGS) -D__ASSEMBLY__ $< -o $@ + +$(OUT)klipper.o: $(patsubst %.c, $(OUT)src/%.o,$(src-y)) $(OUT)declfunc.lds + @echo " Linking $@" + $(Q)$(CC) $(CFLAGS) -Wl,-r -Wl,-T,$(OUT)declfunc.lds -nostdlib $(patsubst %.c, $(OUT)src/%.o,$(src-y)) -o $@ + +$(OUT)compile_time_request.o: $(OUT)klipper.o ./scripts/buildcommands.py + @echo " Building $@" + $(Q)$(OBJCOPY) -j '.compile_time_request' -O binary $< $(OUT)klipper.o.compile_time_request + $(Q)$(PYTHON) ./scripts/buildcommands.py $(OUT)klipper.o.compile_time_request $(OUT)autoconf.h $(OUT)compile_time_request.c + $(Q)$(CC) $(CFLAGS) -c $(OUT)compile_time_request.c -o $@ + +$(OUT)klipper.elf: $(OUT)klipper.o $(OUT)compile_time_request.o + @echo " Linking $@" + $(Q)$(CC) $(CFLAGS) $(LDFLAGS) $^ -o $@ + +################ Kconfig rules + +define do-kconfig +$(Q)mkdir -p $(OUT)/scripts/kconfig/lxdialog +$(Q)mkdir -p $(OUT)/include/config +$(Q)mkdir -p $(addprefix $(OUT), $(DIRS)) +$(Q)$(MAKE) -C $(OUT) -f $(CURDIR)/scripts/kconfig/Makefile srctree=$(CURDIR) src=scripts/kconfig obj=scripts/kconfig Q=$(Q) Kconfig=$(CURDIR)/src/Kconfig $1 +endef + +$(OUT)autoconf.h : $(KCONFIG_CONFIG) ; $(call do-kconfig, silentoldconfig) +$(KCONFIG_CONFIG): src/Kconfig ; $(call do-kconfig, olddefconfig) +%onfig: ; $(call do-kconfig, $@) +help: ; $(call do-kconfig, $@) + + +################ Generic rules + +# Make definitions +.PHONY : all clean distclean FORCE +.DELETE_ON_ERROR: + +all: $(target-y) + +clean: + $(Q)rm -rf $(OUT) + +distclean: clean + $(Q)rm -f .config .config.old + +-include $(patsubst %,$(OUT)%/*.d,$(DIRS)) |