GIT_REVISION:=$(GIT_COMMIT)$(GIT_MODIFIED)
+ASFLAGS += -DGIT_REVISION=\"$(GIT_REVISION)\"
CFLAGS += -DGIT_REVISION=\"$(GIT_REVISION)\"
#### GLOBAL DATA ####
ALL_OBJS=
ALL_DEPS=
+ALL_LSTS=$(ALL_OBJS:.o=.lst)
+
#### APPLICATION DATA ####
ALL_APPS=
#### APPLICATION RULES ####
ALL_OBJS+=$(ANY_APP_OBJS)
-ALL_DEPS+=$(ANY_APP_OBJS:.o=.P)
+ALL_DEPS+=$(ANY_APP_OBJS:.o=.p)
# template for application rules
+define APPLICATION_BOARD_ENVIRONMENT_template
+
+# define set of objects for this binary
+$(1)_$(2)_$(3)_OBJS := apps/$(1)/main.o $(ANY_APP_OBJS) $$($(2)_OBJS)
+$(1)_$(2)_$(3)_LIBS := $(ANY_APP_LIBS)
+
+# define manifest compilation
+board/$(2)/$(1).$(3).manifest.o: board/manifest.c
+ $(CROSS_COMPILE)$(CC) $(CFLAGS) -DAPPLICATION=\"$(1)\" -DBOARD=\"$(2)\" -DENVIRONMENT=\"$(3)\" -c -o $$@ $$<
+
+# add manifest object to object list
+$(1)_$(2)_$(3)_OBJS+=board/$(2)/$(1).$(3).manifest.o $$($(3)_OBJS)
+
+# define compilation, generating various extra files on the way
+board/$(2)/$(1).$(3).elf board/$(2)/$(1).$(3).map board/$(2)/$(1).$(3).size: $$($(1)_$(2)_$(3)_OBJS) $$($(1)_$(2)_$(3)_LIBS) $$($(3)_LDS)
+ $(CROSS_COMPILE)$(LD) $(LDFLAGS) -T $$($(3)_LDS) -Bstatic \
+ -Map board/$(2)/$(1).$(3).map -o board/$(2)/$(1).$(3).elf \
+ --start-group $$($(1)_$(2)_$(3)_OBJS) $$($(1)_$(2)_$(3)_LIBS) --end-group
+ $(CROSS_COMPILE)$(SIZE) board/$(2)/$(1).$(3).elf | tee board/$(2)/$(1).$(3).size
+
+ALL_APPS+=board/$(2)/$(1).$(3).elf
+
+ALL_OBJS+=$$($(1)_$(2)_$(3)_OBJS)
+
+endef
+
+define BOARD_template
+
+ALL_OBJS+=$$($(1)_OBJS)
+
+endef
+
define APPLICATION_template
$(1)_SRCS_REL=$$(patsubst %,$$($(1)_DIR)/%,$$($(1)_SRCS))
$(1)_OBJS:=$$($(1)_SRCS_REL:.c=.o)
$(1)_OBJS:=$$($(1)_OBJS:.S=.o)
-$(1).elf $(1).map $(1).size: apps/$(1)/main.o $(ANY_APP_OBJS) $(ANY_APP_LIBS)
- $(CROSS_COMPILE)$(LD) $(LDFLAGS) -T $(LDS) -Bstatic -Map $(1).map -o $(1).elf --start-group $$^ --end-group
- $(CROSS_COMPILE)$(SIZE) $(1).elf | tee $(1).size
-
-ALL_APPS+=$(1).elf
-
ALL_OBJS+=$$($(1)_OBJS) apps/$(1)/main.o
-ALL_DEPS+=$$($(1)_OBJS:.o=.P) apps/$(1)/main.P
+ALL_DEPS+=$$($(1)_OBJS:.o=.p) apps/$(1)/main.p
endef
# define rules for all defined applications
-$(foreach app,$(APPLICATIONS),$(eval $(call APPLICATION_template,$(app))))
+$(foreach app,$(APPLICATIONS), \
+ $(foreach brd,$(BOARDS), \
+ $(foreach env,$($(brd)_ENVIRONMENTS), \
+ $(eval $(call APPLICATION_BOARD_ENVIRONMENT_template,$(app),$(brd),$(env))))))
+
+$(foreach brd,$(BOARDS), \
+ $(eval $(call BOARD_template,$(brd))))
+
+$(foreach app,$(APPLICATIONS), \
+ $(eval $(call APPLICATION_template,$(app))))
#### LIBRARY RULES ####
$(1)_OBJS:=$$($(1)_OBJS:.S=.o)
$$($(1)_DIR)/lib$(1).a: $$($(1)_OBJS)
- $(AR) cru $$($(1)_DIR)/lib$(1).a $$($(1)_OBJS)
+ $(CROSS_COMPILE)$(AR) cru $$($(1)_DIR)/lib$(1).a $$($(1)_OBJS)
ALL_LIBS+=$$($(1)_DIR)/lib$(1).a
ALL_OBJS+=$$($(1)_OBJS)
-ALL_DEPS+=$$($(1)_OBJS:.o=.P)
+ALL_DEPS+=$$($(1)_OBJS:.o=.p)
endef
#### COMPILATION RULES ####
-%.P: %.c
+%.p: %.c
@$(CROSS_COMPILE)$(CC) $(CFLAGS) -M -o $(*).d $(<)
- @sed 's|.*\.o:|$(@:.P=.o): |g' < $*.d > $@; rm -f $*.d; [ -s $@ ] || rm -f $@
+ @sed 's|.*\.o:|$(@:.p=.o): |g' < $*.d > $@; rm -f $*.d; [ -s $@ ] || rm -f $@
-%.P: %.S
+%.p: %.S
@$(CROSS_COMPILE)$(CC) $(ASFLAGS) -M -o $(*).d $(<)
- @sed 's|.*\.o:|$(@:.P=.o): |g' < $*.d > $@; rm -f $*.d; [ -s $@ ] || rm -f $@
+ @sed 's|.*\.o:|$(@:.p=.o): |g' < $*.d > $@; rm -f $*.d; [ -s $@ ] || rm -f $@
%.o: %.c
$(CROSS_COMPILE)$(CC) $(CFLAGS) -c -o $@ $<
.PHONY: clean
clean:
- rm -f $(ALL_APP_TARGETS) $(ALL_LIB_TARGETS) $(ALL_OBJS) $(ALL_DEPS)
+ rm -f $(ALL_APP_TARGETS) $(ALL_LIB_TARGETS) $(ALL_OBJS) $(ALL_DEPS) $(ALL_LSTS)
.PHONY: distclean
distclean: clean
+ find . -name '*.o' -or -name '*.bin' -or -name '*.map' -or -name '*.lst' -or -name '*.p' -exec rm '{}' ';'
#### DEPENDENCY LOAD ####