197 lines
5.1 KiB
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))
|
|
|
|
|