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