reverse = $(if $(1),$(call reverse,$(wordlist 2,$(words $(1)),$(1)))) $(firstword $(1)) ifeq (,$(BASE)) export BASE=$(CURDIR) endif include $(BASE)/Makefile ifeq (,$(MAKEBASE)) export MAKEBASE=$(realpath $(firstword $(MAKEFILE_LIST))) endif ifneq (,$(wildcard $(BASE)/.depends.make)) include $(wildcard $(BASE)/.depends.make) include $(realpath $(foreach CDEP,$(call reverse,$(COMPDEPENDS)),$(CDEP)/global.make)) CDEPENDS=$(call reverse,$(COMPDEPENDS)) DEPINC=$(CDEPENDS:%=-I%/include) endif ifeq (,$(FINALNAME)) FINALNAME=$(notdir $(CURDIR)) endif ifeq (,$(BUILDPID)) export BUILDPID := $(shell echo $$PPID) endif MAKEME=$(MAKE) -f $(MAKEBASE) GCC=$(COMPILER_PREFIX)gcc AS=$(COMPILER_PREFIX)gcc LD=$(COMPILER_PREFIX)gcc AR=$(COMPILER_PREFIX)ar SIZE=$(COMPILER_PREFIX)size OBJCOPY=$(COMPILER_PREFIX)objcopy AVRDUDE=sudo avrdude PATH := /opt/local/bin:$(PATH) ifeq ($(BASE),$(CURDIR)) DEPLIBS:=$(foreach DEPLIB,$(CDEPENDS),$(BASE)/.build/libdep-$(subst /,_,$(DEPLIB).a)) MODULENAMES:=$(notdir $(basename $(wildcard $(CURDIR)/src/*))) MODULES:=$(patsubst %,$(BASE)/.build/%.o,$(MODULENAMES)) MODULEDEPS:=$(patsubst %,$(BASE)/.build/.%.o.dep,$(MODULENAMES)) else include $(CURDIR)/Makefile DEPENDSNEW=$(filter-out $(COMPDEPENDS),$(realpath $(DEPENDS))) MODULENAMES:=$(notdir $(basename $(wildcard $(CURDIR)/src/*))) MODULES:=$(patsubst %,$(BASE)/.build/libdep-$(subst /,_,$(CURDIR).a.d)/%.o,$(MODULENAMES)) MODULEDEPS:=$(patsubst %,$(BASE)/.build/.%.o.dep,$(MODULENAMES)) endif CFLAGS+=$(DEPINC) CFLAGS+=-I$(CURDIR)/include LDFLAGS+=$(foreach DEP,$(CDEPENDS),$(BASE)/.build/libdep-$(subst /,_,$(DEP)).a) LDFLAGS+=$(foreach DEP,$(CDEPENDS),$(BASE)/.build/libdep-$(subst /,_,$(DEP)).a) ifneq ($(AVR_FUSE_EXTENDED),) AVRDUDE_OPERATIONS+=-U efuse:w:$(AVR_FUSE_EXTENDED):m endif ifneq ($(AVR_FUSE_HIGH),) AVRDUDE_OPERATIONS+=-U hfuse:w:$(AVR_FUSE_HIGH):m endif ifneq ($(AVR_FUSE_LOW),) AVRDUDE_OPERATIONS+=-U lfuse:w:$(AVR_FUSE_LOW):m endif ifeq (,$(AVR_PROG)) AVR_PROG=avrisp2 endif ifeq (,$(AVR_BITCLK)) AVR_BITCLK=16 endif ifeq (,$(AVR_PORT)) AVR_PORT=usb: endif .SILENT: .PHONY: clean build null dependslibs libdep.a null: clean: rm -Rf $(BASE)/.build $(BASE)/src/.*.dep $(BASE)/bin $(BASE)/.depends.make build: $(BASE)/.depends.make $(MAKEME) dependlibs $(MAKEME) build-me dependlibs: mkdir -p $(BASE)/.build for SUBDIR in $(CDEPENDS); do $(MAKEME) -C $$SUBDIR libdep.a; done $(BASE)/.depends.make: $(BASE)/Makefile echo "[ DEPSTART ] $(CURDIR)" # echo "-------------------------------------" # echo "DEPENDS = $(DEPENDS)" # echo "COMPDEPENDS = $(COMPDEPENDS)" # echo "DEPENDSNEW = $(DEPENDSNEW)" # echo "-------------------------------------" rm -f $@ for SUBDIR in $(realpath $(DEPENDS)); do $(MAKEME) -C "$$SUBDIR" depwalk; done depwalk: echo "[ DEPEND ] $(CURDIR)" # echo "-------------------------------------" # echo "DEPENDS = $(DEPENDS)" # echo "COMPDEPENDS = $(COMPDEPENDS)" # echo "DEPENDSNEW = $(DEPENDSNEW)" # echo "-------------------------------------" echo "COMPDEPENDS+=$(CURDIR)" >> $(BASE)/.depends.make for SUBDIR in $(DEPENDSNEW); do $(MAKEME) -C "$$SUBDIR" depwalk; done build-me: $(MAKEME) $(BASE)/bin/$(FINALNAME).hex libdep.a: $(BASE)/.build/libdep-$(subst /,_,$(CURDIR)).a $(BASE)/.build/libdep-$(subst /,_,$(CURDIR)).a.d: mkdir -p $@ $(BASE)/.build/libdep-$(subst /,_,$(CURDIR)).a: $(BASE)/.build/libdep-$(subst /,_,$(CURDIR)).a.d $(MODULES) echo "[ LIBDEP ] $(CURDIR)" $(AR) rc $@ $(filter-out $(BASE)/.build/libdep-$(subst /,_,$(CURDIR)).a.d,$^) $(BASE)/.build/libdep-$(subst /,_,$(CURDIR)).a.d/%.o: $(CURDIR)/src/%.c echo "[ COMPILE C ] $<" #echo "[ CFLAGS ] $(CFLAGS)" $(GCC) -c -o $@ $< -MMD -MF "$(dir $@)/.$(notdir $@).dep" $(CFLAGS) $(BASE)/.build/libdep-$(subst /,_,$(CURDIR)).a.d/%.o: $(CURDIR)/src/%.S echo "[ ASSEMBLE ] $<" $(GCC) -c -o $@ $< $(ASFLAGS) $(BASE)/.build/libdep-$(subst /,_,$(CURDIR)).a.d/%.o: $(CURDIR)/src/%.cc echo "[ COMPILE C++ ] $<" $(GCC) -c -o $@ $< -MMD -MF "$(dir $@)/.$(notdir $@).dep" $(CFLAGS) $(CPPFLAGS) $(BASE)/.build/libdep-$(subst /,_,$(CURDIR)).a.d/%.o: $(CURDIR)/src/%.txt echo "[ IGNORE ] $<" touch $@ $(BASE)/bin/$(FINALNAME).elf: $(DEPLIBS) $(MODULES) echo "[ LINK ] $@" mkdir -p $(dir $@) $(LD) -o $@ $^ $(LDFLAGS) $(SIZE) $@ $(BASE)/bin/$(FINALNAME).hex: $(BASE)/bin/$(FINALNAME).elf echo "[ ELF -> HEX ] $@" $(OBJCOPY) -O ihex $< $@ $(BASE)/.build/%.o: $(CURDIR)/src/%.c echo "[ COMPILE C ] $<" $(GCC) -c -o $@ $< -MMD -MP -MF "$(dir $@)/.$(notdir $@).dep" $(CFLAGS) $(BASE)/.build/%.o: $(CURDIR)/src/%.S echo "[ ASSEMBLE ] $<" $(GCC) -c -o $@ $< $(ASFLAGS) $(BASE)/.build/%.o: $(CURDIR)/src/%.cc echo "[ COMPILE C++ ] $<" $(GCC) -c -o $@ $< -MMD -MF "$(dir $@)/.$(notdir $@).dep" $(CFLAGS) $(CPPFLAGS) $(BASE)/.build/%.o: $(CURDIR)/src/%.txt echo "[ IGNORE ] $<" touch $@ $(BASE)/.build/.%.dep: avrdude: build $(BASE)/bin/$(FINALNAME).hex $(AVRDUDE) -v -c $(AVR_PROG) -p $(AVR_MCU) -P $(AVR_PORT) -B $(AVR_BITCLK) $(AVRDUDE_OPERATIONS) -U flash:w:$(BASE)/bin/$(FINALNAME).hex include $(wildcard $(MODULEDEPS))