summaryrefslogtreecommitdiffstats
path: root/src/target/firmware/Makefile.inc
diff options
context:
space:
mode:
authorIngo Albrecht <prom@berlin.ccc.de>2010-03-07 01:41:32 +0100
committerHarald Welte <laforge@gnumonks.org>2010-03-07 11:47:09 +0100
commit41abd7e50055e69993d5e9c8acd9852aee51da1f (patch)
tree4f65fbe8f2f7be78262cf664be4a09933b8e19b3 /src/target/firmware/Makefile.inc
parent60bbc89c30cb0cfd88ad46640f50e35d197a0053 (diff)
New build system.
Diffstat (limited to 'src/target/firmware/Makefile.inc')
-rw-r--r--src/target/firmware/Makefile.inc122
1 files changed, 122 insertions, 0 deletions
diff --git a/src/target/firmware/Makefile.inc b/src/target/firmware/Makefile.inc
index a130cd79..a4eeb7f6 100644
--- a/src/target/firmware/Makefile.inc
+++ b/src/target/firmware/Makefile.inc
@@ -1,6 +1,11 @@
+
+#### TOOLCHAIN CONFIGURATION ####
+
CROSS_COMPILE?=arm-elf-
+
CC=gcc
LD=ld
+AR=ar
SIZE=size
OBJCOPY=objcopy
@@ -22,3 +27,120 @@ CFLAGS += -g$(DEBUGF)
ASFLAGS=-Wa,-adhlns=$(<:.S=.lst) $(INCLUDES) -D__ASSEMBLY__
LDFLAGS = -nostartfiles -nostdlib -nodefaultlibs --gc-sections #-Wl,-Map=$(TARGET).map,--cref
+
+
+#### GLOBAL DATA ####
+
+ALL_OBJS=
+ALL_DEPS=
+
+#### APPLICATION DATA ####
+
+ALL_APPS=
+
+ALL_APP_TARGETS=$(ALL_APPS) $(ALL_APPS:.elf=.bin) $(ALL_APPS:.elf=.map) $(ALL_APPS:.elf=.size)
+
+#### LIBRARY DATA ####
+
+ALL_LIB_ARS=
+
+ALL_LIB_TARGETS=$(ALL_LIB_ARS)
+
+
+#### DEFAULT RULE ####
+
+.PHONY: default
+default: all
+
+
+#### APPLICATION RULES ####
+
+ALL_OBJS+=$(ANY_APP_OBJS)
+ALL_DEPS+=$(ANY_APP_OBJS:.o=.P)
+
+# template for application rules
+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 $$(@:.elf=.map) -o $$@ --start-group $$^ --end-group
+ $(CROSS_COMPILE)$(SIZE) $$@ | 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
+
+endef
+
+# define rules for all defined applications
+$(foreach app,$(APPLICATIONS),$(eval $(call APPLICATION_template,$(app))))
+
+
+#### LIBRARY RULES ####
+
+# template for library rules
+define LIBRARY_template
+
+$(1)_SRCS_REL=$$(patsubst %,$$($(1)_DIR)/%,$$($(1)_SRCS))
+$(1)_OBJS:=$$($(1)_SRCS_REL:.c=.o)
+$(1)_OBJS:=$$($(1)_OBJS:.S=.o)
+
+$$($(1)_DIR)/lib$(1).a: $$($(1)_OBJS)
+ $(AR) cru $$($(1)_DIR)/lib$(1).a $$($(1)_OBJS)
+
+ALL_LIB_ARS+=$$($(1)_DIR)/lib$(1).a
+
+ALL_OBJS+=$$($(1)_OBJS)
+ALL_DEPS+=$$($(1)_OBJS:.o=.P)
+
+endef
+
+# define rules for all defined libraries
+$(foreach lbr,$(LIBRARIES),$(eval $(call LIBRARY_template,$(lbr))))
+
+
+#### TOPLEVEL RULES ####
+
+.PHONY: all
+all: $(ALL_DEPS) $(ALL_APP_TARGETS) $(ALL_LIB_TARGETS)
+
+.PHONY: depend
+depend: $(ALL_DEPS)
+
+
+#### COMPILATION RULES ####
+
+%.P: %.c
+ @$(CROSS_COMPILE)$(CC) $(CFLAGS) -M -o $(*).d $(<)
+ @sed 's|\($*)\)\.o[ :]*|\1.o $@ : |g' < $*.d > $@; \
+ rm -f $*.d; [ -s $@ ] || rm -f $@
+
+%.P: %.S
+ @$(CROSS_COMPILE)$(CC) $(ASFLAGS) -M -o $(*).d $(<)
+ @sed 's|\($*)\)\.o[ :]*|\1.o $@ : |g' < $*.d > $@; \
+ rm -f $*.d; [ -s $@ ] || rm -f $@
+
+%.o: %.c
+ $(CROSS_COMPILE)$(CC) $(CFLAGS) -c -o $@ $^
+
+%.o: %.S
+ $(CROSS_COMPILE)$(CC) $(ASFLAGS) -c -o $@ $^
+
+
+%.bin: %.elf
+ $(CROSS_COMPILE)objcopy --gap-fill=0xff -O binary $^ $@
+
+
+#### CLEANUP RULES ####
+
+clean:
+ rm -f $(ALL_APP_TARGETS) $(ALL_LIB_TARGETS) $(ALL_OBJS) $(ALL_DEPS)
+
+
+#### DEPENDENCY LOAD ####
+
+-include $(ALL_DEPS)