commit cf203e51a4e47f71d9d7a95791090dcdf41637db Author: Harald Wolff Date: Wed Sep 27 12:03:10 2017 +0200 Initial Commit diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..86cb98b --- /dev/null +++ b/Makefile @@ -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)) + + diff --git a/README.md b/README.md new file mode 100644 index 0000000..1d288f0 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# DEPMAKER + +A GNU MAKE Helper for building binaries with automatic dependency handling.