2 # Copyright (c) 2005 Martin Decky
5 # Redistribution and use in source and binary forms, with or without
6 # modification, are permitted provided that the following conditions
9 # - Redistributions of source code must retain the above copyright
10 # notice, this list of conditions and the following disclaimer.
11 # - Redistributions in binary form must reproduce the above copyright
12 # notice, this list of conditions and the following disclaimer in the
13 # documentation and/or other materials provided with the distribution.
14 # - The name of the author may not be used to endorse or promote products
15 # derived from this software without specific prior written permission.
17 # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 # IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34 VERSION_DEF
= $(ROOT_PATH
)/version
36 COMMON_MAKEFILE
= $(ROOT_PATH
)/Makefile.common
37 COMMON_HEADER
= $(ROOT_PATH
)/common.h
38 COMMON_HEADER_ARCH
= arch
/$(KARCH
)/include/arch
/common.h
40 CONFIG_MAKEFILE
= $(ROOT_PATH
)/Makefile.config
41 CONFIG_HEADER
= $(ROOT_PATH
)/config.h
43 -include $(VERSION_DEF
)
44 -include $(COMMON_MAKEFILE
)
45 -include $(CONFIG_MAKEFILE
)
50 AUTOCHECK
= $(realpath
$(ROOT_PATH
)/tools
/autocheck.awk
)
55 MAP_PREV
= $(MAP
).prev
56 DISASM
= kernel.disasm
58 REAL_MAP
= generic
/src
/debug
/real_map
60 GENMAP
= tools
/genmap.py
62 LINK
= arch
/$(KARCH
)/_link.
ld
63 EMPTY_MAP
= generic
/src
/debug
/empty_map.o
64 SIZEOK_MAP
= generic
/src
/debug
/sizeok_map.o
67 JOBFILE
= $(ROOT_PATH
)/tools
/jobfile.py
68 # XXX: Do not change the order of arguments.
69 CC_JOB
= $(JOBFILE
) $(JOB
) $(CC
) $< -o
$@
71 CC_JOB
= $(CC
) $< -o
$@
74 .PHONY
: all clean autogen_clean depend
77 all: $(VERSION_DEF
) $(COMMON_MAKEFILE
) $(COMMON_HEADER
) $(CONFIG_MAKEFILE
) $(CONFIG_HEADER
) $(BIN
) $(DISASM
)
80 rm -f
$(RAW
) $(BIN
) $(MAP
) $(JOB
) $(MAP_PREV
) $(DISASM
) $(DUMP
) $(REAL_MAP
).
* arch
/*/_link.
ld arch
/*/include/arch
/common.h
81 find generic
/src
/ arch
/*/src
/ genarch
/src
/ test/ -name
'*.o' -follow
-exec
rm '{}' \
;
82 find generic
/src
/ arch
/*/src
/ genarch
/src
/ test/ -name
'*.d' -follow
-exec
rm '{}' \
;
84 ## Common compiler flags
87 INCLUDES
= generic
/include genarch
/include arch
/$(KARCH
)/include ..
/abi
/include
88 INCLUDES_FLAGS
= $(addprefix -I
,$(INCLUDES
))
90 DEFS
= -DKERNEL
-DRELEASE
=$(RELEASE
) "-DCOPYRIGHT=$(COPYRIGHT)" "-DNAME=$(NAME)" -D__
$(BITS
)_BITS__
-D__
$(ENDIANESS
)__
92 COMMON_CFLAGS
= $(INCLUDES_FLAGS
) -O
$(OPTIMIZATION
) -imacros
$(CONFIG_HEADER
) \
93 -ffreestanding
-nostdlib
-nostdinc \
94 -fexec-charset
=UTF-8
-finput-charset
=UTF-8
-fno-common \
95 -fdebug-prefix-map
=$(realpath
$(ROOT_PATH
))=.
97 GCC_CFLAGS
= -std
=gnu99
-Wall
-Wextra
-Wno-unused-parameter \
98 -Wmissing-prototypes
-Werror-implicit-function-declaration \
101 CLANG_CFLAGS
= -std
=gnu99
-Wall
-Wextra
-Wno-unused-parameter \
102 -Wno-missing-field-initializers
-Wno-unused-command-line-argument \
103 -Wmissing-prototypes
-Werror-implicit-function-declaration \
104 -Wwrite-strings
-pipe
-fno-stack-protector
-fno-PIC
106 ifeq ($(CONFIG_DEBUG
),y
)
107 COMMON_CFLAGS
+= -Werror
110 ifeq ($(CONFIG_LTO
),y
)
111 COMMON_CFLAGS
+= -flto
114 ifeq ($(CONFIG_LINE_DEBUG
),y
)
118 AFLAGS
+= --fatal-warnings
119 LDFLAGS
+= -Wl
,-n
-T
$(LINK
) -Wl
,-M
,--fatal-warnings
,--warn-common
121 ifeq ($(CONFIG_STRIP_BINARIES
),y
)
125 -include arch
/$(KARCH
)/Makefile.inc
126 -include genarch
/Makefile.inc
130 # The $(ATSIGN) variable holds the ASCII character representing the at-sign
131 # ('@') used in various $(AS) constructs (e.g. @progbits). On architectures that
132 # don't use '@' for starting a comment, $(ATSIGN) is merely '@'. However, on
133 # those that do use it for starting a comment (e.g. arm32), $(ATSIGN) must be
134 # defined as the percentile-sign ('%') in the architecture-dependent
140 ## Cross-platform assembly to start a symtab.data section
143 SYMTAB_SECTION
= .section symtab.data
, \"a
\", $(ATSIGN
)progbits
;
145 ## Compilation options
148 ifeq ($(COMPILER
),clang
)
149 CFLAGS
= $(COMMON_CFLAGS
) $(CLANG_CFLAGS
)
151 CFLAGS
= $(COMMON_CFLAGS
) $(GCC_CFLAGS
)
154 INSTRUMENTATION
= -finstrument-functions
156 ## Generic kernel sources
160 generic
/src
/adt
/avl.c \
161 generic
/src
/adt
/bitmap.c \
162 generic
/src
/adt
/btree.c \
163 generic
/src
/adt
/cht.c \
164 generic
/src
/adt
/hash_table.c \
165 generic
/src
/adt
/list.c \
166 generic
/src
/console
/chardev.c \
167 generic
/src
/console
/console.c \
168 generic
/src
/console
/prompt.c \
169 generic
/src
/cpu
/cpu.c \
170 generic
/src
/cpu
/cpu_mask.c \
171 generic
/src
/ddi
/ddi.c \
172 generic
/src
/ddi
/irq.c \
173 generic
/src
/debug
/symtab.c \
174 generic
/src
/debug
/stacktrace.c \
175 generic
/src
/debug
/panic.c \
176 generic
/src
/debug
/debug.c \
177 generic
/src
/interrupt
/interrupt.c \
178 generic
/src
/log
/log.c \
179 generic
/src
/main
/main.c \
180 generic
/src
/main
/kinit.c \
181 generic
/src
/main
/uinit.c \
182 generic
/src
/main
/version.c \
183 generic
/src
/main
/shutdown.c \
184 generic
/src
/proc
/program.c \
185 generic
/src
/proc
/scheduler.c \
186 generic
/src
/proc
/thread.c \
187 generic
/src
/proc
/task.c \
188 generic
/src
/proc
/the.c \
189 generic
/src
/syscall
/syscall.c \
190 generic
/src
/syscall
/copy.c \
191 generic
/src
/mm
/km.c \
192 generic
/src
/mm
/reserve.c \
193 generic
/src
/mm
/frame.c \
194 generic
/src
/mm
/page.c \
195 generic
/src
/mm
/tlb.c \
196 generic
/src
/mm
/as.c \
197 generic
/src
/mm
/backend_anon.c \
198 generic
/src
/mm
/backend_elf.c \
199 generic
/src
/mm
/backend_phys.c \
200 generic
/src
/mm
/backend_user.c \
201 generic
/src
/mm
/slab.c \
202 generic
/src
/lib
/halt.c \
203 generic
/src
/lib
/mem.c \
204 generic
/src
/lib
/memfnc.c \
205 generic
/src
/lib
/gsort.c \
206 generic
/src
/lib
/str.c \
207 generic
/src
/lib
/str_error.c \
208 generic
/src
/lib
/elf.c \
209 generic
/src
/lib
/ra.c \
210 generic
/src
/lib
/rd.c \
211 generic
/src
/printf
/printf_core.c \
212 generic
/src
/printf
/printf.c \
213 generic
/src
/printf
/snprintf.c \
214 generic
/src
/printf
/vprintf.c \
215 generic
/src
/printf
/vsnprintf.c \
216 generic
/src
/time
/clock.c \
217 generic
/src
/time
/timeout.c \
218 generic
/src
/time
/delay.c \
219 generic
/src
/preempt
/preemption.c \
220 generic
/src
/synch
/spinlock.c \
221 generic
/src
/synch
/condvar.c \
222 generic
/src
/synch
/mutex.c \
223 generic
/src
/synch
/semaphore.c \
224 generic
/src
/synch
/smc.c \
225 generic
/src
/synch
/smp_memory_barrier.c \
226 generic
/src
/synch
/waitq.c \
227 generic
/src
/synch
/futex.c \
228 generic
/src
/synch
/workqueue.c \
229 generic
/src
/synch
/rcu.c \
230 generic
/src
/smp
/ipi.c \
231 generic
/src
/smp
/smp.c \
232 generic
/src
/smp
/smp_call.c \
233 generic
/src
/ipc
/ipc.c \
234 generic
/src
/ipc
/sysipc.c \
235 generic
/src
/ipc
/sysipc_ops.c \
236 generic
/src
/ipc
/ops
/conctmeto.c \
237 generic
/src
/ipc
/ops
/concttome.c \
238 generic
/src
/ipc
/ops
/dataread.c \
239 generic
/src
/ipc
/ops
/datawrite.c \
240 generic
/src
/ipc
/ops
/debug.c \
241 generic
/src
/ipc
/ops
/pagein.c \
242 generic
/src
/ipc
/ops
/sharein.c \
243 generic
/src
/ipc
/ops
/shareout.c \
244 generic
/src
/ipc
/ops
/stchngath.c \
245 generic
/src
/ipc
/ipcrsc.c \
246 generic
/src
/ipc
/irq.c \
247 generic
/src
/ipc
/event.c \
248 generic
/src
/cap
/cap.c \
249 generic
/src
/security
/perm.c \
250 generic
/src
/sysinfo
/sysinfo.c \
251 generic
/src
/sysinfo
/stats.c
253 ## Kernel console support
256 ifeq ($(CONFIG_KCONSOLE
),y
)
258 generic
/src
/console
/kconsole.c \
259 generic
/src
/console
/cmd.c
262 ## Udebug interface sources
265 ifeq ($(CONFIG_UDEBUG
),y
)
267 generic
/src
/ipc
/kbox.c \
268 generic
/src
/udebug
/udebug.c \
269 generic
/src
/udebug
/udebug_ops.c \
270 generic
/src
/udebug
/udebug_ipc.c
276 ifeq ($(CONFIG_TEST
),y
)
280 test/atomic
/atomic1.c \
281 test/btree
/btree1.c \
283 test/avltree
/avltree1.c \
284 test/fault
/fault1.c \
290 test/synch
/semaphore1.c \
291 test/synch
/semaphore2.c \
292 test/synch
/workqueue2.c \
293 test/synch
/workqueue3.c \
295 test/print/print1.c \
296 test/print/print2.c \
297 test/print/print3.c \
298 test/print/print4.c \
299 test/print/print5.c \
300 test/thread
/thread1.c \
301 test/smpcall
/smpcall1.c
303 ifeq ($(KARCH
),mips32
)
304 GENERIC_SOURCES
+= test/debug
/mips1.c
306 GENERIC_SOURCES
+= test/debug
/mips1_skip.c
310 GENERIC_SOURCES
+= test/mm
/purge1.c
312 GENERIC_SOURCES
+= test/mm
/purge1_skip.c
317 ## Sources where instrumentation is enabled
320 ifeq ($(CONFIG_TRACE
),y
)
321 INSTRUMENTED_SOURCES
= \
322 generic
/src
/adt
/btree.c \
323 generic
/src
/cpu
/cpu.c \
324 generic
/src
/ddi
/ddi.c \
325 generic
/src
/interrupt
/interrupt.c \
326 generic
/src
/main
/main.c \
327 generic
/src
/main
/kinit.c \
328 generic
/src
/proc
/the.c \
329 generic
/src
/mm
/frame.c \
330 generic
/src
/mm
/page.c \
331 generic
/src
/mm
/tlb.c \
332 generic
/src
/mm
/as.c \
333 generic
/src
/mm
/slab.c \
334 generic
/src
/sysinfo
/sysinfo.c \
335 generic
/src
/console
/kconsole.c
337 INSTRUMENTED_SOURCES
=
340 ARCH_SOURCES
+= $(ARCH_AUTOCHECK_HEADERS
:%.h
=%.
check.c
)
341 GENARCH_SOURCES
+= $(GENARCH_AUTOCHECK_HEADERS
:%.h
=%.
check.c
)
343 GENERIC_OBJECTS
:= $(addsuffix .o
,$(basename $(GENERIC_SOURCES
)))
344 ARCH_OBJECTS
:= $(addsuffix .o
,$(basename $(ARCH_SOURCES
)))
345 GENARCH_OBJECTS
:= $(addsuffix .o
,$(basename $(GENARCH_SOURCES
)))
347 GENERIC_DEPENDS
:= $(addsuffix .d
,$(basename $(GENERIC_SOURCES
)))
348 ARCH_DEPENDS
:= $(addsuffix .d
,$(basename $(ARCH_SOURCES
)))
349 GENARCH_DEPENDS
:= $(addsuffix .d
,$(basename $(GENARCH_SOURCES
)))
351 AS_CFLAGS
:= $(addprefix -Xassembler
,$(AFLAGS
))
353 -include $(GENERIC_DEPENDS
)
354 -include $(ARCH_DEPENDS
)
355 -include $(GENARCH_DEPENDS
)
357 ifeq ($(COMPILER
),clang
)
358 AS_CFLAGS
+= -mllvm
-asm-macro-max-nesting-depth
=1000
361 ifeq ($(CONFIG_SYMTAB
),y
)
362 SYMTAB_OBJECTS
:= generic
/src
/debug
/real_map.o
368 $(OBJCOPY
) -O
$(BFD
) $< $@
371 ifeq ($(CONFIG_LINE_DEBUG
),y
)
372 $(OBJDUMP
) -d
-S
$< > $@
374 $(OBJDUMP
) -d
$< > $@
377 $(RAW
): $(LINK
) $(ARCH_OBJECTS
) $(GENARCH_OBJECTS
) $(GENERIC_OBJECTS
) $(SYMTAB_OBJECTS
)
378 $(CC
) $(DEFS
) $(CFLAGS
) $(LDFLAGS
) -Wl
,-Map
,$(MAP
) -o
$@
$(ARCH_OBJECTS
) $(GENARCH_OBJECTS
) $(GENERIC_OBJECTS
) $(EXTRA_OBJECTS
) $(SYMTAB_OBJECTS
)
381 $(CC
) $(DEFS
) $(CFLAGS
) -D__ASSEMBLER__
-D__LINKER__
-E
-x c
$< | grep
-v
"^\#" > $@
383 %.
check.c
: %.h
$(AUTOCHECK
)
384 cd
$(<D
) && $(AUTOCHECK
) $(<F
) > $(@F
)
387 $(CC_JOB
) -c
-MD
-MP
$(DEFS
) $(CFLAGS
) $(AS_CFLAGS
)
390 $(CC_JOB
) -c
-MD
-MP
$(DEFS
) $(CFLAGS
) $(AS_CFLAGS
)
393 $(CC_JOB
) -c
-MD
-MP
$(DEFS
) $(CFLAGS
) $(EXTRA_FLAGS
) $(FPU_NO_CFLAGS
) $(if
$(findstring $<,$(INSTRUMENTED_SOURCES
)),$(INSTRUMENTATION
))
395 $(REAL_MAP
).o
: $(REAL_MAP
).bin
396 echo
"$(AS_PROLOG)""$(SYMTAB_SECTION)"" .incbin \"$<\"" |
$(CC
) $(CFLAGS
) $(AS_CFLAGS
) -x assembler
-c
-o
$@
-
398 $(REAL_MAP
).bin
: $(LINK
) $(ARCH_OBJECTS
) $(GENARCH_OBJECTS
) $(GENERIC_OBJECTS
)
399 echo
"$(AS_PROLOG)""$(SYMTAB_SECTION)" |
$(CC
) $(CFLAGS
) $(AS_CFLAGS
) -x assembler
-c
-o
$(EMPTY_MAP
) -
400 $(CC
) $(DEFS
) $(CFLAGS
) $(LDFLAGS
) -Wl
,-Map
,$(MAP_PREV
) -o
$@
$(ARCH_OBJECTS
) $(GENARCH_OBJECTS
) $(GENERIC_OBJECTS
) $(EXTRA_OBJECTS
) $(EMPTY_MAP
)
401 $(OBJDUMP
) -t
$(ARCH_OBJECTS
) $(GENARCH_OBJECTS
) $(GENERIC_OBJECTS
) > $(DUMP
)
402 $(GENMAP
) $(MAP_PREV
) $(DUMP
) $@
404 # Do it once again, this time to get correct even the symbols
405 # on architectures that have bss after symtab
407 echo
"$(AS_PROLOG)""$(SYMTAB_SECTION)"" .incbin \"$@\"" |
$(CC
) $(CFLAGS
) $(AS_CFLAGS
) -x assembler
-c
-o
$(SIZEOK_MAP
) -
408 $(CC
) $(DEFS
) $(CFLAGS
) $(LDFLAGS
) -Wl
,-Map
,$(MAP_PREV
) -o
$@
$(ARCH_OBJECTS
) $(GENARCH_OBJECTS
) $(GENERIC_OBJECTS
) $(EXTRA_OBJECTS
) $(SIZEOK_MAP
)
409 $(OBJDUMP
) -t
$(ARCH_OBJECTS
) $(GENARCH_OBJECTS
) $(GENERIC_OBJECTS
) > $(DUMP
)
410 $(GENMAP
) $(MAP_PREV
) $(DUMP
) $@