First version
[3rdparty/ote_partner/tlk.git] / makefile
1 PREFIX ?= .
2
3 ifeq ($(MAKECMDGOALS),spotless)
4 spotless:
5         rm -rf $(PREFIX)/build-* $(LK_IMAGE)
6 else
7
8 -include local.mk
9 include make/macros.mk
10
11 # If one of our goals (from the commandline) happens to have a
12 # matching project/goal.mk, then we should re-invoke make with
13 # that project name specified...
14
15 project-name := $(firstword $(MAKECMDGOALS))
16
17 ifneq ($(project-name),)
18 ifneq ($(wildcard project/$(project-name).mk),)
19 do-nothing := 1
20 $(MAKECMDGOALS) _all: make-make
21 make-make:
22         @PROJECT=$(project-name) $(MAKE) $(filter-out $(project-name), $(MAKECMDGOALS))
23 endif
24 endif
25
26 ifeq ($(do-nothing),)
27
28 ifeq ($(PROJECT),)
29 $(error No project specified.  Use "make projectname" or put "PROJECT := projectname" in local.mk)
30 endif
31
32 DEBUG ?= 2
33
34 BUILDDIR := $(PREFIX)/build-$(PROJECT)
35 OUTBIN := $(BUILDDIR)/lk.bin
36 OUTELF := $(BUILDDIR)/lk
37 OUTSYS := $(BUILDDIR)/lk.sys
38 OUTTASK := $(BUILDDIR)/lk.task
39 CONFIGHEADER := $(BUILDDIR)/config.h
40 IMGBIN := $(BUILDDIR)/img.bin
41 LK_IMAGE ?= $(BUILDDIR)/tos.img
42
43 # conditionally built monitor files
44 MONELF :=
45 MONBIN :=
46
47 INCLUDES := -I$(BUILDDIR) -Iinclude -I../lib/include
48 GLOBAL_OPTFLAGS ?= -Os
49 GLOBAL_COMPILEFLAGS := -g -fno-builtin -finline -W -Wall -Wno-multichar -Wno-unused-parameter -Wno-unused-function -include $(CONFIGHEADER)
50 GLOBAL_CFLAGS := --std=c99 -Werror-implicit-function-declaration
51 #GLOBAL_CFLAGS += -Werror
52 GLOBAL_CPPFLAGS := -fno-exceptions -fno-rtti -fno-threadsafe-statics
53 #GLOBAL_CPPFLAGS += -Weffc++
54 GLOBAL_ASMFLAGS := -DASSEMBLY
55 GLOBAL_LDFLAGS :=
56
57 GLOBAL_COMPILEFLAGS += -ffunction-sections -fdata-sections
58 GLOBAL_LDFLAGS += -gc-sections
59
60 # top level rule
61 all:: $(LK_IMAGE) $(OUTTASK) $(OUTELF).lst $(OUTELF).debug.lst $(OUTELF).sym $(OUTELF).size
62
63 # master module object list
64 ALLOBJS_MODULE :=
65
66 # master object list (for dep generation)
67 ALLOBJS :=
68
69 # a linker script needs to be declared in one of the project/target/platform files
70 LINKER_SCRIPT :=
71 MON_LINKER_SCRIPT :=
72
73 # anything you add here will be deleted in make clean
74 GENERATED := $(CONFIGHEADER)
75
76 # anything added to DEFINES will be put into $(BUILDDIR)/config.h
77 DEFINES := LK=1
78
79 # Anything added to SRCDEPS will become a dependency of every source file in the system.
80 # Useful for header files that may be included by one or more source files.
81 SRCDEPS := $(CONFIGHEADER)
82
83 # these need to be filled out by the project/target/platform rules.mk files
84 TARGET :=
85 PLATFORM :=
86 ARCH :=
87 ALLMODULES :=
88 MODULES :=
89
90 # any rules you put here will also be built by the system before considered being complete
91 EXTRA_BUILDDEPS :=
92
93 # any rules you put here will be depended on in clean builds
94 EXTRA_CLEANDEPS :=
95
96 # any objects you put here get linked with the final image
97 EXTRA_OBJS :=
98
99 include project/$(PROJECT).mk
100 include target/$(TARGET)/rules.mk
101 include platform/$(PLATFORM)/rules.mk
102
103 $(info PROJECT = $(PROJECT))
104 $(info PLATFORM = $(PLATFORM))
105 $(info TARGET = $(TARGET))
106
107 include arch/$(ARCH)/rules.mk
108 include platform/rules.mk
109 include target/rules.mk
110 include kernel/rules.mk
111 include dev/rules.mk
112 include app/rules.mk
113 include task/rules.mk
114
115 # recursively include any modules in the MODULE variable, leaving a trail of included
116 # modules in the ALLMODULES list
117 include make/recurse.mk
118
119 # any extra top level build dependencies that someone declared
120 all:: $(EXTRA_BUILDDEPS)
121
122 # add some automatic configuration defines
123 DEFINES += \
124         PROJECT_$(PROJECT)=1 \
125         TARGET_$(TARGET)=1 \
126         PLATFORM_$(PLATFORM)=1 \
127         ARCH_$(ARCH)=1 \
128         $(addsuffix =1,$(addprefix WITH_,$(ALLMODULES)))
129
130 # debug build?
131 ifneq ($(DEBUG),)
132 DEFINES += \
133         DEBUG=$(DEBUG)
134 endif
135
136 # allow additional defines from outside the build system
137 ifneq ($(EXTERNAL_DEFINES),)
138 DEFINES += $(EXTERNAL_DEFINES)
139 $(info EXTERNAL_DEFINES = $(EXTERNAL_DEFINES))
140 endif
141
142 DEPS := $(ALLOBJS:%o=%d)
143
144 #$(warning DEPS=$(DEPS))
145
146 # default to no ccache
147 CCACHE ?=
148 CC := $(CCACHE) $(TOOLCHAIN_PREFIX)gcc
149 LD := $(TOOLCHAIN_PREFIX)ld
150 OBJDUMP := $(TOOLCHAIN_PREFIX)objdump
151 OBJCOPY := $(TOOLCHAIN_PREFIX)objcopy
152 CPPFILT := $(TOOLCHAIN_PREFIX)c++filt
153 SIZE := $(TOOLCHAIN_PREFIX)size
154 NM := $(TOOLCHAIN_PREFIX)nm
155
156 # put all of the global build flags in config.h to force a rebuild if any change
157 DEFINES += INCLUDES=\"$(subst $(SPACE),_,$(INCLUDES))\"
158 DEFINES += GLOBAL_COMPILEFLAGS=\"$(subst $(SPACE),_,$(GLOBAL_COMPILEFLAGS))\"
159 DEFINES += GLOBAL_OPTFLAGS=\"$(subst $(SPACE),_,$(GLOBAL_OPTFLAGS))\"
160 DEFINES += GLOBAL_CFLAGS=\"$(subst $(SPACE),_,$(GLOBAL_CFLAGS))\"
161 DEFINES += GLOBAL_CPPFLAGS=\"$(subst $(SPACE),_,$(GLOBAL_CPPFLAGS))\"
162 DEFINES += GLOBAL_ASMFLAGS=\"$(subst $(SPACE),_,$(GLOBAL_ASMFLAGS))\"
163 DEFINES += GLOBAL_LDFLAGS=\"$(subst $(SPACE),_,$(GLOBAL_LDFLAGS))\"
164
165 # comment out or override if you want to see the full output of each command
166 NOECHO ?= @
167
168 #$(warning ALLMODULE_OBJS=$(ALLMODULE_OBJS))
169
170 ifneq ($(OBJS),)
171 $(warning OBJS=$(OBJS))
172 $(error OBJS is not empty, please convert to new module format)
173 endif
174 ifneq ($(OPTFLAGS),)
175 $(warning OPTFLAGS=$(OPTFLAGS))
176 $(error OPTFLAGS is not empty, please use GLOBAL_OPTFLAGS or MODULE_OPTFLAGS)
177 endif
178 ifneq ($(CFLAGS),)
179 $(warning CFLAGS=$(CFLAGS))
180 $(error CFLAGS is not empty, please use GLOBAL_CFLAGS or MODULE_CFLAGS)
181 endif
182 ifneq ($(CPPFLAGS),)
183 $(warning CPPFLAGS=$(CPPFLAGS))
184 $(error CPPFLAGS is not empty, please use GLOBAL_CPPFLAGS or MODULE_CPPFLAGS)
185 endif
186
187 # the logic to compile and link stuff is in here
188 include make/build.mk
189
190 clean: $(EXTRA_CLEANDEPS)
191         rm -f $(ALLOBJS) $(DEPS) $(GENERATED) $(OUTBIN) $(OUTELF) $(OUTSYS) $(OUTTASK) $(OUTELF).lst
192
193 install: all
194         scp $(OUTBIN) 192.168.0.4:/tftproot
195
196 # generate a config.h file with all of the DEFINES laid out in #define format
197 configheader:
198
199 $(CONFIGHEADER): configheader
200         $(call MAKECONFIGHEADER,$@,DEFINES)
201
202 # Empty rule for the .d files. The above rules will build .d files as a side
203 # effect. Only works on gcc 3.x and above, however.
204 %.d:
205
206 ifeq ($(filter $(MAKECMDGOALS), clean), )
207 -include $(DEPS)
208 endif
209
210 .PHONY: configheader
211 endif
212
213 endif # make spotless