2 #### TOOLCHAIN CONFIGURATION ####
4 CROSS_COMPILE?=arm-elf-
14 CFLAGS=-mcpu=arm7tdmi $(INCLUDES)
15 CFLAGS += -Wall -Wextra -Wcast-align -Wimplicit -Wunused
16 CFLAGS += -Wswitch -Wredundant-decls -Wreturn-type -Wshadow -Wnested-externs
17 CFLAGS += -Wbad-function-cast -Wsign-compare -Waggregate-return
18 CFLAGS += -Wa,-adhlns=$(subst $(suffix $<),.lst,$<)
19 CFLAGS += -Os -ffunction-sections
22 # Uncomment this line if you want to enable Tx (Transmit) Support.
23 #CFLAGS += -DCONFIG_TX_ENABLE
25 # some older toolchains don't support this, ignore it for now
26 #ASFLAGS=-Wa,-adhlns=$(<:.S=.lst),--g$(DEBUGF) $(INCLUDES) -D__ASSEMBLY__
27 ASFLAGS=-Wa,-adhlns=$(<:.S=.lst) $(INCLUDES) -D__ASSEMBLY__
29 LDFLAGS = -nostartfiles -nostdlib -nodefaultlibs --gc-sections #-Wl,-Map=$(TARGET).map,--cref
33 GIT_COMMIT:=$(shell git describe --always)
34 GIT_MODIFIED:=$(shell (git status | grep "modified:\|added:\|deleted:" -q) && echo "-modified")
36 GIT_REVISION:=$(GIT_COMMIT)$(GIT_MODIFIED)
38 CFLAGS += -DGIT_REVISION=\"$(GIT_REVISION)\"
45 ALL_LSTS=$(ALL_OBJS:.o=.lst)
47 #### APPLICATION DATA ####
51 ALL_APP_TARGETS=$(ALL_APPS) $(ALL_APPS:.elf=.bin) $(ALL_APPS:.elf=.map) $(ALL_APPS:.elf=.size)
53 #### LIBRARY DATA ####
57 ALL_LIB_TARGETS=$(ALL_LIBS)
60 #### DEFAULT RULE ####
66 #### APPLICATION RULES ####
68 ALL_OBJS+=$(ANY_APP_OBJS)
69 ALL_DEPS+=$(ANY_APP_OBJS:.o=.p)
71 # template for application rules
72 define APPLICATION_BOARD_ENVIRONMENT_template
74 # define set of objects for this binary
75 $(1)_$(2)_$(3)_OBJS := apps/$(1)/main.o $(ANY_APP_OBJS) $(ANY_APP_LIBS) $$($(2)_OBJS)
77 # define manifest compilation
78 board/$(2)/$(1).$(3).manifest.o: board/manifest.c
79 $(CROSS_COMPILE)$(CC) $(CFLAGS) -DAPPLICATION=\"$(3)\" -DBOARD=\"$(2)\" -DENVIRONMENT=\"$(3)\" -c -o $$@ $$<
81 # add manifest object to object list
82 $(1)_$(2)_$(3)_OBJS+=board/$(2)/$(1).$(3).manifest.o
84 # define compilation, generating various extra files on the way
85 board/$(2)/$(1).$(3).elf board/$(2)/$(1).$(3).map board/$(2)/$(1).$(3).size: $$($(1)_$(2)_$(3)_OBJS) $$($(3)_LDS)
86 $(CROSS_COMPILE)$(LD) $(LDFLAGS) -T $$($(3)_LDS) -Bstatic \
87 -Map board/$(2)/$(1).$(3).map -o board/$(2)/$(1).$(3).elf \
88 --start-group $$($(1)_$(2)_$(3)_OBJS) --end-group
89 $(CROSS_COMPILE)$(SIZE) board/$(2)/$(1).$(3).elf | tee board/$(2)/$(1).$(3).size
91 ALL_APPS+=board/$(2)/$(1).$(3).elf
97 ALL_OBJS+=$$($(1)_OBJS)
101 define APPLICATION_template
103 $(1)_SRCS_REL=$$(patsubst %,$$($(1)_DIR)/%,$$($(1)_SRCS))
104 $(1)_OBJS:=$$($(1)_SRCS_REL:.c=.o)
105 $(1)_OBJS:=$$($(1)_OBJS:.S=.o)
107 ALL_OBJS+=$$($(1)_OBJS) apps/$(1)/main.o
108 ALL_DEPS+=$$($(1)_OBJS:.o=.p) apps/$(1)/main.p
112 # define rules for all defined applications
113 $(foreach app,$(APPLICATIONS),$(foreach brd,$(BOARDS),$(foreach env,$(ENVIRONMENTS),$(eval $(call APPLICATION_BOARD_ENVIRONMENT_template,$(app),$(brd),$(env))))))
114 $(foreach brd,$(BOARDS),$(eval $(call BOARD_template,$(brd))))
115 $(foreach app,$(APPLICATIONS),$(eval $(call APPLICATION_template,$(app))))
118 #### LIBRARY RULES ####
120 # template for library rules
121 define LIBRARY_template
123 $(1)_SRCS_REL=$$(patsubst %,$$($(1)_DIR)/%,$$($(1)_SRCS))
124 $(1)_OBJS:=$$($(1)_SRCS_REL:.c=.o)
125 $(1)_OBJS:=$$($(1)_OBJS:.S=.o)
127 $$($(1)_DIR)/lib$(1).a: $$($(1)_OBJS)
128 $(CROSS_COMPILE)$(AR) cru $$($(1)_DIR)/lib$(1).a $$($(1)_OBJS)
130 ALL_LIBS+=$$($(1)_DIR)/lib$(1).a
132 ALL_OBJS+=$$($(1)_OBJS)
133 ALL_DEPS+=$$($(1)_OBJS:.o=.p)
137 # define rules for all defined libraries
138 $(foreach lbr,$(LIBRARIES),$(eval $(call LIBRARY_template,$(lbr))))
141 #### TOPLEVEL RULES ####
144 all: $(ALL_DEPS) $(ALL_APP_TARGETS) $(ALL_LIB_TARGETS)
150 #### COMPILATION RULES ####
153 @$(CROSS_COMPILE)$(CC) $(CFLAGS) -M -o $(*).d $(<)
154 @sed 's|.*\.o:|$(@:.p=.o): |g' < $*.d > $@; rm -f $*.d; [ -s $@ ] || rm -f $@
157 @$(CROSS_COMPILE)$(CC) $(ASFLAGS) -M -o $(*).d $(<)
158 @sed 's|.*\.o:|$(@:.p=.o): |g' < $*.d > $@; rm -f $*.d; [ -s $@ ] || rm -f $@
161 $(CROSS_COMPILE)$(CC) $(CFLAGS) -c -o $@ $<
164 $(CROSS_COMPILE)$(CC) $(ASFLAGS) -c -o $@ $<
168 $(CROSS_COMPILE)objcopy --gap-fill=0xff -O binary $^ $@
171 #### CLEANUP RULES ####
175 rm -f $(ALL_APP_TARGETS) $(ALL_LIB_TARGETS) $(ALL_OBJS) $(ALL_DEPS) $(ALL_LSTS)
181 #### DEPENDENCY LOAD ####