Initial Commit
commit
cf203e51a4
|
@ -0,0 +1,171 @@
|
||||||
|
|
||||||
|
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)))
|
||||||
|
else
|
||||||
|
ifneq (,$(wildcard $(BASE)/.depends.make))
|
||||||
|
include $(wildcard $(BASE)/.depends.make)
|
||||||
|
|
||||||
|
include $(realpath $(foreach CDEP,$(COMPDEPENDS),$(CDEP)/global.make))
|
||||||
|
|
||||||
|
CDEPENDS=$(call reverse,$(COMPDEPENDS))
|
||||||
|
DEPINC=$(CDEPENDS:%=-I%/include)
|
||||||
|
|
||||||
|
endif
|
||||||
|
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
|
||||||
|
|
||||||
|
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)
|
||||||
|
|
||||||
|
|
||||||
|
.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 $@ $< $(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 $@ $< $(CFLAGS) $(CPPFLAGS)
|
||||||
|
|
||||||
|
$(BASE)/.build/%.o: $(CURDIR)/src/%.txt
|
||||||
|
echo "[ IGNORE ] $<"
|
||||||
|
touch $@
|
||||||
|
|
||||||
|
|
||||||
|
$(BASE)/.build/.%.dep:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
include $(wildcard $(MODULEDEPS))
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue