Initial Commit

master
Harald Wolff 2017-09-27 12:03:10 +02:00
commit cf203e51a4
2 changed files with 174 additions and 0 deletions

171
Makefile 100644
View File

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

3
README.md 100644
View File

@ -0,0 +1,3 @@
# DEPMAKER
A GNU MAKE Helper for building binaries with automatic dependency handling.