firmware: separated various pieces of interrupt handling apart
[osmocom-bb.git] / src / target / firmware / Makefile.inc
1
2 #### TOOLCHAIN CONFIGURATION ####
3
4 CROSS_COMPILE?=arm-elf-
5
6 CC=gcc
7 LD=ld
8 AR=ar
9 SIZE=size
10 OBJCOPY=objcopy
11
12 DEBUGF=dwarf-2
13
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
20 CFLAGS += -g$(DEBUGF)
21
22 # Uncomment this line if you want to enable Tx (Transmit) Support.
23 #CFLAGS += -DCONFIG_TX_ENABLE
24
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__
28
29 LDFLAGS = -nostartfiles -nostdlib -nodefaultlibs --gc-sections #-Wl,-Map=$(TARGET).map,--cref
30
31 #### GIT VERSION ####
32
33 GIT_COMMIT:=$(shell git describe --always)
34 GIT_MODIFIED:=$(shell (git status | grep "modified:\|added:\|deleted:" -q) && echo "-modified")
35
36 GIT_REVISION:=$(GIT_COMMIT)$(GIT_MODIFIED)
37
38 ASFLAGS += -DGIT_REVISION=\"$(GIT_REVISION)\"
39 CFLAGS += -DGIT_REVISION=\"$(GIT_REVISION)\"
40
41 #### GLOBAL DATA ####
42
43 ALL_OBJS=
44 ALL_DEPS=
45
46 ALL_LSTS=$(ALL_OBJS:.o=.lst)
47
48 #### APPLICATION DATA ####
49
50 ALL_APPS=
51
52 ALL_APP_TARGETS=$(ALL_APPS) $(ALL_APPS:.elf=.bin) $(ALL_APPS:.elf=.map) $(ALL_APPS:.elf=.size)
53
54 #### LIBRARY DATA ####
55
56 ALL_LIBS=
57
58 ALL_LIB_TARGETS=$(ALL_LIBS)
59
60
61 #### DEFAULT RULE ####
62
63 .PHONY: default
64 default: all
65
66
67 #### APPLICATION RULES ####
68
69 ALL_OBJS+=$(ANY_APP_OBJS)
70 ALL_DEPS+=$(ANY_APP_OBJS:.o=.p)
71
72 # template for application rules
73 define APPLICATION_BOARD_ENVIRONMENT_template
74
75 # define set of objects for this binary
76 $(1)_$(2)_$(3)_OBJS := apps/$(1)/main.o $(ANY_APP_OBJS) $$($(2)_OBJS)
77 $(1)_$(2)_$(3)_LIBS := $(ANY_APP_LIBS)
78
79 # define manifest compilation
80 board/$(2)/$(1).$(3).manifest.o: board/manifest.c
81         $(CROSS_COMPILE)$(CC) $(CFLAGS) -DAPPLICATION=\"$(1)\" -DBOARD=\"$(2)\" -DENVIRONMENT=\"$(3)\" -c -o $$@ $$<
82
83 # add manifest object to object list
84 $(1)_$(2)_$(3)_OBJS+=board/$(2)/$(1).$(3).manifest.o $$($(3)_OBJS)
85
86 # define compilation, generating various extra files on the way
87 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)
88         $(CROSS_COMPILE)$(LD) $(LDFLAGS) -T $$($(3)_LDS) -Bstatic \
89                 -Map board/$(2)/$(1).$(3).map -o board/$(2)/$(1).$(3).elf \
90                 --start-group $$($(1)_$(2)_$(3)_OBJS) $$($(1)_$(2)_$(3)_LIBS) --end-group
91         $(CROSS_COMPILE)$(SIZE) board/$(2)/$(1).$(3).elf | tee board/$(2)/$(1).$(3).size
92
93 ALL_APPS+=board/$(2)/$(1).$(3).elf
94
95 ALL_OBJS+=$$($(1)_$(2)_$(3)_OBJS)
96
97 endef
98
99 define BOARD_template
100
101 ALL_OBJS+=$$($(1)_OBJS)
102
103 endef
104
105 define APPLICATION_template
106
107 $(1)_SRCS_REL=$$(patsubst %,$$($(1)_DIR)/%,$$($(1)_SRCS))
108 $(1)_OBJS:=$$($(1)_SRCS_REL:.c=.o)
109 $(1)_OBJS:=$$($(1)_OBJS:.S=.o)
110
111 ALL_OBJS+=$$($(1)_OBJS) apps/$(1)/main.o
112 ALL_DEPS+=$$($(1)_OBJS:.o=.p) apps/$(1)/main.p
113
114 endef
115
116 # define rules for all defined applications
117 $(foreach app,$(APPLICATIONS),                \
118         $(foreach brd,$(BOARDS),                  \
119                 $(foreach env,$($(brd)_ENVIRONMENTS), \
120                         $(eval $(call APPLICATION_BOARD_ENVIRONMENT_template,$(app),$(brd),$(env))))))
121
122 $(foreach brd,$(BOARDS), \
123         $(eval $(call BOARD_template,$(brd))))
124
125 $(foreach app,$(APPLICATIONS), \
126         $(eval $(call APPLICATION_template,$(app))))
127
128
129 #### LIBRARY RULES ####
130
131 # template for library rules
132 define LIBRARY_template
133
134 $(1)_SRCS_REL=$$(patsubst %,$$($(1)_DIR)/%,$$($(1)_SRCS))
135 $(1)_OBJS:=$$($(1)_SRCS_REL:.c=.o)
136 $(1)_OBJS:=$$($(1)_OBJS:.S=.o)
137
138 $$($(1)_DIR)/lib$(1).a: $$($(1)_OBJS)
139         $(CROSS_COMPILE)$(AR) cru $$($(1)_DIR)/lib$(1).a $$($(1)_OBJS)
140
141 ALL_LIBS+=$$($(1)_DIR)/lib$(1).a
142
143 ALL_OBJS+=$$($(1)_OBJS)
144 ALL_DEPS+=$$($(1)_OBJS:.o=.p)
145
146 endef
147
148 # define rules for all defined libraries
149 $(foreach lbr,$(LIBRARIES),$(eval $(call LIBRARY_template,$(lbr))))
150
151
152 #### TOPLEVEL RULES ####
153
154 .PHONY: all
155 all: $(ALL_DEPS) $(ALL_APP_TARGETS) $(ALL_LIB_TARGETS)
156
157 .PHONY: depend
158 depend: $(ALL_DEPS)
159
160
161 #### COMPILATION RULES ####
162
163 %.p: %.c
164         @$(CROSS_COMPILE)$(CC) $(CFLAGS) -M -o $(*).d $(<)
165         @sed 's|.*\.o:|$(@:.p=.o): |g' < $*.d > $@; rm -f $*.d; [ -s $@ ] || rm -f $@
166
167 %.p: %.S
168         @$(CROSS_COMPILE)$(CC) $(ASFLAGS) -M -o $(*).d $(<)
169         @sed 's|.*\.o:|$(@:.p=.o): |g' < $*.d > $@; rm -f $*.d; [ -s $@ ] || rm -f $@
170
171 %.o: %.c
172         $(CROSS_COMPILE)$(CC) $(CFLAGS) -c -o $@ $<
173
174 %.o: %.S
175         $(CROSS_COMPILE)$(CC) $(ASFLAGS) -c -o $@ $<
176
177
178 %.bin: %.elf
179         $(CROSS_COMPILE)objcopy --gap-fill=0xff -O binary $^ $@
180
181
182 #### CLEANUP RULES ####
183
184 .PHONY: clean
185 clean:
186         rm -f $(ALL_APP_TARGETS) $(ALL_LIB_TARGETS) $(ALL_OBJS) $(ALL_DEPS) $(ALL_LSTS)
187
188 .PHONY: distclean
189 distclean: clean
190         find . -name '*.o' -or -name '*.bin' -or -name '*.map' -or -name '*.lst' -or -name '*.p' -exec rm '{}' ';'
191
192
193 #### DEPENDENCY LOAD ####
194
195 -include $(ALL_DEPS)