depmaker/Makefile

197 lines
5.1 KiB
Makefile

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))