-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathMakefile
264 lines (202 loc) · 5.71 KB
/
Makefile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
PHONY :=
all:
# Do not:
# o use make's built-in rules and variables
# (this increases performance and avoids hard-to-debug behaviour);
# o print "Entering directory ...";
MAKEFLAGS += -rR -s --no-print-directory
BUILD_SRC :=
BUILD_OBJ :=
MKDIR := mkdir -p
CP := cp -af
RM := rm -rf
CD := cd
MV := mv
FIND := find
export RM CP CD MV FIND MKDIR
ifeq ($(BUILD_SRC),)
ifeq ("$(origin O)", "command line")
BUILD_OBJ := $(O)
endif
ifneq ($(BUILD_OBJ),)
PHONY += all $(MAKECMDGOALS) clean
__dummy := $(shell $(MKDIR) $(BUILD_OBJ))
ifneq ($(__dummy),)
$(error failed to create $(BUILD_OBJ))
endif
$(filter-out all,$(MAKECMDGOALS)) all: sub-mk
sub-mk:
@$(MAKE) -C $(BUILD_OBJ) BUILD_SRC=$(CURDIR) -f $(CURDIR)/Makefile $(MAKECMDGOALS)
clean: sub-mk
@echo [RM] $(BUILD_OBJ)
@$(RM) $(BUILD_OBJ)
skip-makefile := 1
endif #ifneq ($(BUILD_OBJ),)
endif #ifeq ($(BUILD_SRC),)
ifeq ($(skip-makefile),)
CROSS_COMPILE ?=arm-none-linux-gnueabi-
PLATFORM ?=
srctree := $(if $(BUILD_SRC),$(BUILD_SRC),$(CURDIR))
objtree := $(CURDIR)
src := .
obj := .
VPATH := $(srctree)
export srctree objtree VPATH
# Get platform information about ARCH and MACH from PLATFORM variable.
ifeq ($(words $(subst -, , $(PLATFORM))), 2)
ARCH := $(word 1, $(subst -, , $(PLATFORM)))
MACH := mach-$(word 2, $(subst -, , $(PLATFORM)))
else
ARCH := arm32
MACH := mach-jz2440
endif
ifeq ($(wildcard $(srctree)/arch/$(ARCH)/$(MACH)),)
$(error not found the $(ARCH) or $(MACH))
endif
# System environment variable.
ifeq ($(OS),Windows_NT)
HOSTOS := windows
else
ifeq ($(shell uname),Darwin)
HOSTOS := macos
else
ifeq ($(shell uname),Linux)
HOSTOS := linux
else
HOSTOS := unix-like
endif
endif
endif
ifeq ($(HOSTOS),windows)
SUFFIX := .exe
else
SUFFIX :=
endif
# Load default variables.
CFLAGS :=
ASFLAGS :=
LDFLAGS :=
ARCH_CFLAGS :=
MCFLAGS :=
MLDFLAGS :=
DEFINES :=
LIBDIRS :=
LIBS :=
INCDIRS :=
SRCDIRS :=
# Make variables (CC, etc...)
AS := $(CROSS_COMPILE)gcc -x assembler-with-cpp
CC := $(CROSS_COMPILE)gcc
CPP := $(CROSS_COMPILE)gcc -E
CXX := $(CROSS_COMPILE)g++
LD := $(CROSS_COMPILE)ld
AR := $(CROSS_COMPILE)ar
OC := $(CROSS_COMPILE)objcopy
OD := $(CROSS_COMPILE)objdump
NM := nm
HOSTCC := gcc
# Override default variables.
sinclude $(srctree)/arch/$(ARCH)/$(MACH)/Makefile.mach
sinclude $(srctree)/arch/$(ARCH)/Makefile.arch
# We need some generic definitions (do not try to remake the file).
include $(srctree)/scripts/Makefile.include
# Add necessary directory for INCDIRS and SRCDIRS.
SRCDIRS += arch/$(ARCH) init mm src fs drivers lib sound external
#ucos2 uCGUI lwip
INCDIRS += include drivers \
arch/$(ARCH)/include \
arch/$(ARCH)/$(MACH)/include \
fs/Fatfs_f8a \
external/ucos2/SOURCE \
external/ucos2/PORT \
external/uCGUI/Config \
external/uCGUI/GUI/Core \
external/uCGUI/GUI/WM \
external/uCGUI/GUI/Widget \
external/lwip/include \
external/lwip/include/arch \
external/lwip/include/ipv4 \
external/helix/pub
HEAD_FILES := arch/$(ARCH)/$(MACH)/head.S
sinclude $(srctree)/arch/$(ARCH)/$(MACH)/Makefile.head
HEAD_FILES := $(foreach f,$(HEAD_FILES),$(wildcard $(srctree)/$(f)))
HEAD_OBJS += $(patsubst $(srctree)/%.S, %.o, $(filter %.S, $(HEAD_FILES))) \
$(patsubst $(srctree)/%.c, %.o, $(filter %.c, $(HEAD_FILES)))
X_ASFLAGS := $(ARCH_CFLAGS) $(MCFLAGS) $(MASFLAGS) $(ASFLAGS)
X_CFLAGS := $(ARCH_CFLAGS) $(MCFLAGS) $(CFLAGS)
X_LDFLAGS := $(MLDFLAGS) $(LDFLAGS)
X_LIBS := $(LIBS)
X_NAME := sos
X_INCDIRS := $(patsubst %, -I %, \
$(foreach d,$(INCDIRS),$(wildcard $(srctree)/$(d))))
X_CPPFLAGS := $(DEFINES) $(X_INCDIRS) -include include/config/autoconf.h
X_LIBDIRS := $(LIBDIRS)
X_LDFLAGS += $(X_LIBDIRS)
X_OBJS := $(patsubst $(srctree)/%, %/built-in.o, \
$(foreach d,$(SRCDIRS),$(wildcard $(srctree)/$(d)))) \
$(HEAD_OBJS)
export BUILD_OBJ BUILD_SRC HEAD_OBJS HOSTOS
export ARCH MACH
export AS AR CC LD CPP CXX
export X_ASFLAGS X_INCDIRS X_CFLAGS X_CPPFLAGS DEFINES
include $(srctree)/scripts/Makefile.conf
PHONY += all clean xbegin xend xclean conf fixdep dis dnw $(SRCDIRS)
# SOS rules
all: xend
xend : $(X_NAME).bin
$(SRCDIRS): xbegin
xbegin: scripts/fixdep$(SUFFIX) conf
scripts/fixdep$(SUFFIX): $(srctree)/scripts/fixdep.c
@$(MKDIR) scripts
@echo [HOSTCC] scripts/fixdep.c
ifeq ($(strip $(HOSTOS)),windows)
@$(HOSTCC) -o $@ $< -lwsock32
else
@$(HOSTCC) -o $@ $<
endif
$(X_NAME).bin: system_tmp kallsyms.o
@echo [LD] system
@$(LD) $(X_LDFLAGS) -o system $(X_OBJS) $(X_LIBS) kallsyms.o
@echo [OC] $(X_NAME).bin
@$(OC) -O binary -S system $@
$(X_OBJS): $(SRCDIRS) ;
$(SRCDIRS):
@$(MAKE) $(build)=$@
system_tmp: $(X_OBJS)
@$(LD) $(X_LDFLAGS) -o $@ $^ $(X_LIBS)
kallsyms.o: kallsyms$(SUFFIX) system_tmp
@echo [NM] system_tmp | ./kallsyms > kallsyms.S
@$(NM) -n system_tmp | ./kallsyms > kallsyms.S
@echo [CC] kallsyms.S
@$(CC) -c kallsyms.S -o $@
kallsyms$(SUFFIX): $(srctree)/scripts/kallsyms.c
@echo [HOSTCC] scripts/kallsyms.c
@$(HOSTCC) -o kallsyms $(srctree)/scripts/kallsyms.c
dis: system
@echo [OD] $(X_NAME).dis
@$(OD) -D -m arm system > $(X_NAME).dis
dnw: $(X_NAME).bin
dnw $(X_NAME).bin
clean:
@echo [RM] system system_tmp
@$(RM) system system_tmp
@echo [RM] kallsyms*
@$(RM) kallsyms*
@echo [RM] fixdep
@$(RM) scripts/fixdep$(SUFFIX)
@echo [RM] *.[osd]
@$(RM) $(shell find -name "*.[osd]")
@echo [RM] *.[osSc]~
@$(RM) $(shell find -name "*.[osSc]~")
@echo [RM] .*.cmd
@$(RM) $(shell find -name ".*.cmd")
@echo [RM] include/config
@$(RM) include/config
@echo [RM] $(X_NAME).*
@$(RM) $(X_NAME).*
endif
PHONY += FORCE
FORCE:
# Declare the contents of the .PHONY variable as phony. We keep that
# information in a variable so we can use it in if_changed and friends.
.PHONY: $(PHONY)