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 AGDEPEND
= Makefile.ag.depend
51 DEPEND
= Makefile.depend
52 DEPEND_PREV
= $(DEPEND
).prev
57 MAP_PREV
= $(MAP
).prev
58 DISASM
= kernel.disasm
60 REAL_MAP
= generic
/src
/debug
/real_map
62 GENMAP
= tools
/genmap.py
63 JOBFILE
= $(ROOT_PATH
)/tools
/jobfile.py
65 LINK
= arch
/$(KARCH
)/_link.
ld
66 EMPTY_MAP
= generic
/src
/debug
/empty_map.o
67 SIZEOK_MAP
= generic
/src
/debug
/sizeok_map.o
69 .PHONY
: all clean autogen_clean
71 all: $(VERSION_DEF
) $(COMMON_MAKEFILE
) $(COMMON_HEADER
) $(CONFIG_MAKEFILE
) $(CONFIG_HEADER
) $(BIN
) $(DISASM
)
72 -[ -f
$(DEPEND
) ] && cp
-a
$(DEPEND
) $(DEPEND_PREV
)
75 rm -f
$(DEPEND
) $(DEPEND_PREV
) $(RAW
) $(BIN
) $(MAP
) $(JOB
) $(MAP_PREV
) $(DISASM
) $(DUMP
) $(REAL_MAP
).
* arch
/*/_link.
ld arch
/*/include/arch
/common.h
76 find generic
/src
/ arch
/*/src
/ genarch
/src
/ test/ -name
'*.o' -follow
-exec
rm '{}' \
;
78 ## Common compiler flags
81 INCLUDES
= generic
/include genarch
/include arch
/$(KARCH
)/include ..
/abi
/include
82 INCLUDES_FLAGS
= $(addprefix -I
,$(INCLUDES
))
84 ifeq ($(CONFIG_OPTIMIZE_FOR_SIZE
),y
)
90 DEFS
= -DKERNEL
-DRELEASE
=$(RELEASE
) "-DCOPYRIGHT=$(COPYRIGHT)" "-DNAME=$(NAME)" -D__
$(BITS
)_BITS__
-D__
$(ENDIANESS
)__
92 GCC_CFLAGS
= $(INCLUDES_FLAGS
) -O
$(OPTIMIZATION
) -imacros
$(CONFIG_HEADER
) \
93 -fexec-charset
=UTF-8
-fwide-exec-charset
=UTF-32
$(ENDIANESS
) \
94 -finput-charset
=UTF-8
-ffreestanding
-fno-builtin
-nostdlib
-nostdinc \
95 -std
=gnu99
-Wall
-Wextra
-Wno-unused-parameter
-Wmissing-prototypes \
96 -Werror-implicit-function-declaration
-Wwrite-strings \
99 ICC_CFLAGS
= $(INCLUDES_FLAGS
) -O
$(OPTIMIZATION
) -imacros
$(CONFIG_HEADER
) \
100 -ffreestanding
-fno-builtin
-nostdlib
-nostdinc
-Wall
-Wmissing-prototypes \
101 -Werror-implicit-function-declaration
-wd170
103 # clang does not support following options but I am not sure whether
104 # something won't break because of that:
105 # -fexec-charset=UTF-8 -fwide-exec-charset=UTF-32$(ENDIANESS) -finput-charset=UTF-8
106 CLANG_CFLAGS
= $(INCLUDES_FLAGS
) -O
$(OPTIMIZATION
) -imacros
$(CONFIG_HEADER
) \
107 -ffreestanding
-fno-builtin
-nostdlib
-nostdinc \
108 -std
=gnu99
-Wall
-Werror
-Wextra
-Wno-unused-parameter
-Wmissing-prototypes \
109 -Werror-implicit-function-declaration
-Wwrite-strings \
110 -integrated-as
-pipe
-target
$(CLANG_TARGET
)
112 ifeq ($(CONFIG_DEBUG
),y
)
113 GCC_CFLAGS
+= -Werror
114 ICC_CFLAGS
+= -Werror
117 ifeq ($(CONFIG_LTO
),y
)
121 ifeq ($(CONFIG_LINE_DEBUG
),y
)
128 # Mind the mutual ordering with the inclusion of the arch Makefile.inc.
129 # AFLAGS and LFLAGS must be initialized before the inclusion.
131 AFLAGS
= --fatal-warnings
132 LFLAGS
= -n
-T
$(LINK
) -M
--fatal-warnings
135 # Mind the mutual ordering with the initialization of AFLAGS and LFLAGS.
136 # The arch Makefile.inc must be included after the initialization.
138 -include arch
/$(KARCH
)/Makefile.inc
139 -include genarch
/Makefile.inc
145 # The $(ATSIGN) variable holds the ASCII character representing the at-sign
146 # ('@') used in various $(AS) constructs (e.g. @progbits). On architectures that
147 # don't use '@' for starting a comment, $(ATSIGN) is merely '@'. However, on
148 # those that do use it for starting a comment (e.g. arm32), $(ATSIGN) must be
149 # defined as the percentile-sign ('%') in the architecture-dependent
155 ## Cross-platform assembly to start a symtab.data section
158 SYMTAB_SECTION
= .section symtab.data
, \"a
\", $(ATSIGN
)progbits
;
160 ## Compilation options
163 ifeq ($(COMPILER
),gcc_native
)
164 CFLAGS
= $(GCC_CFLAGS
)
165 DEPEND_DEFS
= $(DEFS
) $(CONFIG_DEFS
)
166 INSTRUMENTATION
= -finstrument-functions
169 ifeq ($(COMPILER
),gcc_cross
)
170 CFLAGS
= $(GCC_CFLAGS
)
171 DEPEND_DEFS
= $(DEFS
) $(CONFIG_DEFS
)
172 INSTRUMENTATION
= -finstrument-functions
175 ifeq ($(COMPILER
),gcc_helenos
)
176 CFLAGS
= $(GCC_CFLAGS
)
177 DEPEND_DEFS
= $(DEFS
) $(CONFIG_DEFS
)
178 INSTRUMENTATION
= -finstrument-functions
181 ifeq ($(COMPILER
),icc
)
182 CFLAGS
= $(ICC_CFLAGS
)
183 DEPEND_DEFS
= $(DEFS
) $(CONFIG_DEFS
)
187 ifeq ($(COMPILER
),clang
)
188 CFLAGS
= $(CLANG_CFLAGS
)
189 DEPEND_DEFS
= $(DEFS
) $(CONFIG_DEFS
)
194 ## Generic kernel sources
198 generic
/src
/adt
/avl.c \
199 generic
/src
/adt
/bitmap.c \
200 generic
/src
/adt
/btree.c \
201 generic
/src
/adt
/cht.c \
202 generic
/src
/adt
/hash_table.c \
203 generic
/src
/adt
/list.c \
204 generic
/src
/console
/chardev.c \
205 generic
/src
/console
/console.c \
206 generic
/src
/console
/prompt.c \
207 generic
/src
/cpu
/cpu.c \
208 generic
/src
/cpu
/cpu_mask.c \
209 generic
/src
/ddi
/ddi.c \
210 generic
/src
/ddi
/irq.c \
211 generic
/src
/debug
/symtab.c \
212 generic
/src
/debug
/stacktrace.c \
213 generic
/src
/debug
/panic.c \
214 generic
/src
/debug
/debug.c \
215 generic
/src
/interrupt
/interrupt.c \
216 generic
/src
/log
/log.c \
217 generic
/src
/main
/main.c \
218 generic
/src
/main
/kinit.c \
219 generic
/src
/main
/uinit.c \
220 generic
/src
/main
/version.c \
221 generic
/src
/main
/shutdown.c \
222 generic
/src
/proc
/program.c \
223 generic
/src
/proc
/scheduler.c \
224 generic
/src
/proc
/thread.c \
225 generic
/src
/proc
/task.c \
226 generic
/src
/proc
/the.c \
227 generic
/src
/syscall
/syscall.c \
228 generic
/src
/syscall
/copy.c \
229 generic
/src
/mm
/km.c \
230 generic
/src
/mm
/reserve.c \
231 generic
/src
/mm
/frame.c \
232 generic
/src
/mm
/page.c \
233 generic
/src
/mm
/tlb.c \
234 generic
/src
/mm
/as.c \
235 generic
/src
/mm
/backend_anon.c \
236 generic
/src
/mm
/backend_elf.c \
237 generic
/src
/mm
/backend_phys.c \
238 generic
/src
/mm
/backend_user.c \
239 generic
/src
/mm
/slab.c \
240 generic
/src
/lib
/func.c \
241 generic
/src
/lib
/mem.c \
242 generic
/src
/lib
/memfnc.c \
243 generic
/src
/lib
/gsort.c \
244 generic
/src
/lib
/str.c \
245 generic
/src
/lib
/elf.c \
246 generic
/src
/lib
/ra.c \
247 generic
/src
/lib
/rd.c \
248 generic
/src
/printf
/printf_core.c \
249 generic
/src
/printf
/printf.c \
250 generic
/src
/printf
/snprintf.c \
251 generic
/src
/printf
/vprintf.c \
252 generic
/src
/printf
/vsnprintf.c \
253 generic
/src
/time
/clock.c \
254 generic
/src
/time
/timeout.c \
255 generic
/src
/time
/delay.c \
256 generic
/src
/preempt
/preemption.c \
257 generic
/src
/synch
/spinlock.c \
258 generic
/src
/synch
/condvar.c \
259 generic
/src
/synch
/mutex.c \
260 generic
/src
/synch
/semaphore.c \
261 generic
/src
/synch
/smc.c \
262 generic
/src
/synch
/smp_memory_barrier.c \
263 generic
/src
/synch
/waitq.c \
264 generic
/src
/synch
/futex.c \
265 generic
/src
/synch
/workqueue.c \
266 generic
/src
/synch
/rcu.c \
267 generic
/src
/smp
/ipi.c \
268 generic
/src
/smp
/smp.c \
269 generic
/src
/smp
/smp_call.c \
270 generic
/src
/ipc
/ipc.c \
271 generic
/src
/ipc
/sysipc.c \
272 generic
/src
/ipc
/sysipc_ops.c \
273 generic
/src
/ipc
/ops
/conctmeto.c \
274 generic
/src
/ipc
/ops
/concttome.c \
275 generic
/src
/ipc
/ops
/dataread.c \
276 generic
/src
/ipc
/ops
/datawrite.c \
277 generic
/src
/ipc
/ops
/debug.c \
278 generic
/src
/ipc
/ops
/pagein.c \
279 generic
/src
/ipc
/ops
/sharein.c \
280 generic
/src
/ipc
/ops
/shareout.c \
281 generic
/src
/ipc
/ops
/stchngath.c \
282 generic
/src
/ipc
/ipcrsc.c \
283 generic
/src
/ipc
/irq.c \
284 generic
/src
/ipc
/event.c \
285 generic
/src
/cap
/cap.c \
286 generic
/src
/security
/perm.c \
287 generic
/src
/sysinfo
/sysinfo.c \
288 generic
/src
/sysinfo
/stats.c
290 ## Kernel console support
293 ifeq ($(CONFIG_KCONSOLE
),y
)
295 generic
/src
/console
/kconsole.c \
296 generic
/src
/console
/cmd.c
299 ## Udebug interface sources
302 ifeq ($(CONFIG_UDEBUG
),y
)
304 generic
/src
/ipc
/kbox.c \
305 generic
/src
/udebug
/udebug.c \
306 generic
/src
/udebug
/udebug_ops.c \
307 generic
/src
/udebug
/udebug_ipc.c
313 ifeq ($(CONFIG_TEST
),y
)
317 test/atomic
/atomic1.c \
318 test/btree
/btree1.c \
320 test/avltree
/avltree1.c \
321 test/fault
/fault1.c \
327 test/synch
/semaphore1.c \
328 test/synch
/semaphore2.c \
329 test/synch
/workqueue2.c \
330 test/synch
/workqueue3.c \
332 test/print/print1.c \
333 test/print/print2.c \
334 test/print/print3.c \
335 test/print/print4.c \
336 test/print/print5.c \
337 test/thread
/thread1.c \
338 test/smpcall
/smpcall1.c
340 ifeq ($(KARCH
),mips32
)
341 GENERIC_SOURCES
+= test/debug
/mips1.c
343 GENERIC_SOURCES
+= test/debug
/mips1_skip.c
347 GENERIC_SOURCES
+= test/mm
/purge1.c
349 GENERIC_SOURCES
+= test/mm
/purge1_skip.c
354 ## Sources where instrumentation is enabled
357 ifeq ($(CONFIG_TRACE
),y
)
358 INSTRUMENTED_SOURCES
= \
359 generic
/src
/adt
/btree.c \
360 generic
/src
/cpu
/cpu.c \
361 generic
/src
/ddi
/ddi.c \
362 generic
/src
/interrupt
/interrupt.c \
363 generic
/src
/main
/main.c \
364 generic
/src
/main
/kinit.c \
365 generic
/src
/proc
/the.c \
366 generic
/src
/mm
/frame.c \
367 generic
/src
/mm
/page.c \
368 generic
/src
/mm
/tlb.c \
369 generic
/src
/mm
/as.c \
370 generic
/src
/mm
/slab.c \
371 generic
/src
/sysinfo
/sysinfo.c \
372 generic
/src
/console
/kconsole.c
374 INSTRUMENTED_SOURCES
=
377 GENERIC_OBJECTS
:= $(addsuffix .o
,$(basename $(GENERIC_SOURCES
)))
378 ARCH_OBJECTS
:= $(addsuffix .o
,$(basename $(ARCH_SOURCES
)))
379 GENARCH_OBJECTS
:= $(addsuffix .o
,$(basename $(GENARCH_SOURCES
)))
381 GENARCH_AUTOGENS_H
:= $(addsuffix .h
,$(basename $(GENARCH_AUTOGENS_AG
)))
382 GENARCH_AUTOGENS_PROBE_C
:= $(addsuffix .ag.probe.c
,$(basename $(GENARCH_AUTOGENS_AG
)))
383 GENARCH_AUTOGENS_PROBE_S
:= $(addsuffix .ag.probe.s
,$(basename $(GENARCH_AUTOGENS_AG
)))
385 ARCH_AUTOGENS_H
:= $(addsuffix .h
,$(basename $(ARCH_AUTOGENS_AG
)))
386 ARCH_AUTOGENS_PROBE_C
:= $(addsuffix .ag.probe.c
,$(basename $(ARCH_AUTOGENS_AG
)))
387 ARCH_AUTOGENS_PROBE_S
:= $(addsuffix .ag.probe.s
,$(basename $(ARCH_AUTOGENS_AG
)))
389 AUTOGENS_H
:= $(ARCH_AUTOGENS_H
) $(GENARCH_AUTOGENS_H
)
390 AUTOGENS_AG
:= $(ARCH_AUTOGENS_AG
) $(GENARCH_AUTOGENS_AG
)
392 LFLAGS_LTO
:= $(addprefix -Xlinker
,$(LFLAGS
))
394 ifeq ($(CONFIG_SYMTAB
),y
)
395 SYMTAB_OBJECTS
:= generic
/src
/debug
/real_map.o
401 $(OBJCOPY
) -O
$(BFD
) $< $@
404 ifeq ($(CONFIG_LINE_DEBUG
),y
)
405 $(OBJDUMP
) -d
-S
$< > $@
407 $(OBJDUMP
) -d
$< > $@
410 $(RAW
): $(LINK
) $(ARCH_OBJECTS
) $(GENARCH_OBJECTS
) $(GENERIC_OBJECTS
) $(SYMTAB_OBJECTS
)
411 ifeq ($(CONFIG_LTO
),y
)
412 $(GCC
) $(LFLAGS_LTO
) -Xlinker
-Map
-Xlinker
$(MAP
) $(DEFS
) $(GCC_CFLAGS
) -o
$@
$(ARCH_OBJECTS
) $(GENARCH_OBJECTS
) $(GENERIC_OBJECTS
) $(EXTRA_OBJECTS
) $(SYMTAB_OBJECTS
)
414 $(LD
) $(LFLAGS
) -Map
$(MAP
) -o
$@
$(ARCH_OBJECTS
) $(GENARCH_OBJECTS
) $(GENERIC_OBJECTS
) $(EXTRA_OBJECTS
) $(SYMTAB_OBJECTS
)
416 ifeq ($(CONFIG_STRIP_BINARIES
),y
)
420 $(LINK
): $(LINK
).in
$(DEPEND
)
421 $(CC
) $(DEFS
) $(CFLAGS
) -D__ASM__
-D__LINKER__
-E
-x c
$< | grep
-v
"^\#" > $@
424 $(AUTOGEN
) probe
$< >$<.probe.c
425 $(CC
) $(DEFS
) $(CFLAGS
) -S
-o
$<.probe.s
$<.probe.c
426 $(AUTOGEN
) generate
$< <$<.probe.s
>$@
429 $(GCC
) $(DEFS
) $(GCC_CFLAGS
) -D__ASM__
-c
-o
$@
$<
431 $(JOBFILE
) $(JOB
) $< $@
as asm
/preproc
$(DEFS
) $(GCC_CFLAGS
) -D__ASM__
435 $(AS
) $(AFLAGS
) -o
$@
$<
437 $(JOBFILE
) $(JOB
) $< $@
as asm
$(DEFS
) $(CFLAGS
) $(EXTRA_FLAGS
)
441 $(CC
) $(DEFS
) $(CFLAGS
) $(EXTRA_FLAGS
) $(FPU_NO_CFLAGS
) $(if
$(findstring $<,$(INSTRUMENTED_SOURCES
)),$(INSTRUMENTATION
)) -c
-o
$@
$<
443 $(JOBFILE
) $(JOB
) $< $@
cc core
$(DEFS
) $(CFLAGS
) $(EXTRA_FLAGS
) $(FPU_NO_CFLAGS
)
446 $(REAL_MAP
).o
: $(REAL_MAP
).bin
447 echo
"$(AS_PROLOG)""$(SYMTAB_SECTION)"" .incbin \"$<\"" |
$(AS
) $(AFLAGS
) -o
$@
449 $(REAL_MAP
).bin
: $(LINK
) $(ARCH_OBJECTS
) $(GENARCH_OBJECTS
) $(GENERIC_OBJECTS
)
450 echo
"$(AS_PROLOG)""$(SYMTAB_SECTION)" |
$(AS
) $(AFLAGS
) -o
$(EMPTY_MAP
)
451 ifeq ($(CONFIG_LTO
),y
)
452 $(GCC
) $(LFLAGS_LTO
) -Xlinker
-Map
-Xlinker
$(MAP_PREV
) $(DEFS
) $(GCC_CFLAGS
) -o
$@
$(ARCH_OBJECTS
) $(GENARCH_OBJECTS
) $(GENERIC_OBJECTS
) $(EXTRA_OBJECTS
) $(EMPTY_MAP
)
454 $(LD
) $(LFLAGS
) -Map
$(MAP_PREV
) -o
$@
$(ARCH_OBJECTS
) $(GENARCH_OBJECTS
) $(GENERIC_OBJECTS
) $(EXTRA_OBJECTS
) $(EMPTY_MAP
)
456 $(OBJDUMP
) -t
$(ARCH_OBJECTS
) $(GENARCH_OBJECTS
) $(GENERIC_OBJECTS
) > $(DUMP
)
457 $(GENMAP
) $(MAP_PREV
) $(DUMP
) $@
459 # Do it once again, this time to get correct even the symbols
460 # on architectures that have bss after symtab
462 echo
"$(AS_PROLOG)""$(SYMTAB_SECTION)"" .incbin \"$@\"" |
$(AS
) $(AFLAGS
) -o
$(SIZEOK_MAP
)
463 ifeq ($(CONFIG_LTO
),y
)
464 $(GCC
) $(LFLAGS_LTO
) -Xlinker
-Map
-Xlinker
$(MAP_PREV
) $(DEFS
) $(GCC_CFLAGS
) -o
$@
$(ARCH_OBJECTS
) $(GENARCH_OBJECTS
) $(GENERIC_OBJECTS
) $(EXTRA_OBJECTS
) $(SIZEOK_MAP
)
466 $(LD
) $(LFLAGS
) -Map
$(MAP_PREV
) -o
$@
$(ARCH_OBJECTS
) $(GENARCH_OBJECTS
) $(GENERIC_OBJECTS
) $(EXTRA_OBJECTS
) $(SIZEOK_MAP
)
468 $(OBJDUMP
) -t
$(ARCH_OBJECTS
) $(GENARCH_OBJECTS
) $(GENERIC_OBJECTS
) > $(DUMP
)
469 $(GENMAP
) $(MAP_PREV
) $(DUMP
) $@
471 $(AUTOGENS_H
): $(AGDEPEND
)
473 $(AGDEPEND
): $(AUTOGENS_AG
)
474 echo
"# DO NOT EDIT" >$@
476 h
=`dirname $$g`/`basename $$g .ag`.h
; \
477 for l in
`$(AUTOGEN) depend $$g`; do \
478 echo
"$$h: $$l" >>$@
; \
482 $(DEPEND
): $(COMMON_HEADER_ARCH
) $(AUTOGENS_H
)
483 makedepend
-f
- -- $(DEPEND_DEFS
) $(CFLAGS
) -- $(ARCH_SOURCES
) $(GENARCH_SOURCES
) $(GENERIC_SOURCES
) > $@
2> /dev
/null
484 -[ -f
$(DEPEND_PREV
) ] && diff
-q
$(DEPEND_PREV
) $@
&& mv
-f
$(DEPEND_PREV
) $@
486 $(COMMON_HEADER_ARCH
): $(COMMON_HEADER
)
487 ln
-sfn ..
/..
/..
/..
/$< $@
490 -rm $(ARCH_AUTOGENS_H
) $(ARCH_AUTOGENS_PROBE_C
) $(ARCH_AUTOGENS_PROBE_S
)
491 -rm $(GENARCH_AUTOGENS_H
) $(GENARCH_AUTOGENS_PROBE_C
) $(GENARCH_AUTOGENS_PROBE_S
)