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 DEPEND
= Makefile.depend
51 DEPEND_PREV
= $(DEPEND
).prev
56 MAP_PREV
= $(MAP
).prev
57 DISASM
= kernel.disasm
59 REAL_MAP
= generic
/src
/debug
/real_map
61 GENMAP
= tools
/genmap.py
62 JOBFILE
= $(ROOT_PATH
)/tools
/jobfile.py
64 LINK
= arch
/$(KARCH
)/_link.
ld
65 EMPTY_MAP
= generic
/src
/debug
/empty_map.o
66 SIZEOK_MAP
= generic
/src
/debug
/sizeok_map.o
70 all: $(VERSION_DEF
) $(COMMON_MAKEFILE
) $(COMMON_HEADER
) $(CONFIG_MAKEFILE
) $(CONFIG_HEADER
) $(BIN
) $(DISASM
)
71 -[ -f
$(DEPEND
) ] && cp
-a
$(DEPEND
) $(DEPEND_PREV
)
74 rm -f
$(DEPEND
) $(DEPEND_PREV
) $(RAW
) $(BIN
) $(MAP
) $(JOB
) $(MAP_PREV
) $(DISASM
) $(DUMP
) $(REAL_MAP
).
* arch
/*/_link.
ld arch
/*/include/arch
/common.h
75 find generic
/src
/ arch
/*/src
/ genarch
/src
/ test/ -name
'*.o' -follow
-exec
rm \
{\
} \
;
77 ## Common compiler flags
80 INCLUDES
= generic
/include genarch
/include arch
/$(KARCH
)/include ..
/abi
/include
81 INCLUDES_FLAGS
= $(addprefix -I
,$(INCLUDES
))
83 ifeq ($(CONFIG_OPTIMIZE_FOR_SIZE
),y
)
89 DEFS
= -DKERNEL
-DRELEASE
=$(RELEASE
) "-DCOPYRIGHT=$(COPYRIGHT)" "-DNAME=$(NAME)" -D__
$(BITS
)_BITS__
-D__
$(ENDIANESS
)__
91 GCC_CFLAGS
= $(INCLUDES_FLAGS
) -O
$(OPTIMIZATION
) -imacros
$(CONFIG_HEADER
) \
92 -fexec-charset
=UTF-8
-fwide-exec-charset
=UTF-32
$(ENDIANESS
) \
93 -finput-charset
=UTF-8
-ffreestanding
-fno-builtin
-nostdlib
-nostdinc \
94 -std
=gnu99
-Wall
-Wextra
-Wno-unused-parameter
-Wmissing-prototypes \
95 -Werror-implicit-function-declaration
-Wwrite-strings \
98 ICC_CFLAGS
= $(INCLUDES_FLAGS
) -O
$(OPTIMIZATION
) -imacros
$(CONFIG_HEADER
) \
99 -ffreestanding
-fno-builtin
-nostdlib
-nostdinc
-Wall
-Wmissing-prototypes \
100 -Werror-implicit-function-declaration
-wd170
102 CLANG_CFLAGS
= $(INCLUDES_FLAGS
) -O
$(OPTIMIZATION
) -imacros
$(CONFIG_HEADER
) \
103 -fexec-charset
=UTF-8
-fwide-exec-charset
=UTF-32
$(ENDIANESS
) \
104 -finput-charset
=UTF-8
-ffreestanding
-fno-builtin
-nostdlib
-nostdinc \
105 -Wall
-Wextra
-Wno-unused-parameter
-Wmissing-prototypes \
106 -Werror-implicit-function-declaration
-Wwrite-strings \
107 -pipe
-arch
$(CLANG_ARCH
)
109 ifeq ($(CONFIG_DEBUG
),y
)
110 GCC_CFLAGS
+= -Werror
111 ICC_CFLAGS
+= -Werror
114 ifeq ($(CONFIG_LTO
),y
)
118 ifeq ($(CONFIG_LINE_DEBUG
),y
)
125 # Mind the mutual ordering with the inclusion of the arch Makefile.inc.
126 # AFLAGS and LFLAGS must be initialized before the inclusion.
129 LFLAGS
= -n
-T
$(LINK
) -M
132 # Mind the mutual ordering with the initialization of AFLAGS and LFLAGS.
133 # The arch Makefile.inc must be included after the initialization.
135 -include arch
/$(KARCH
)/Makefile.inc
136 -include genarch
/Makefile.inc
141 # The $(ATSIGN) variable holds the ASCII character representing the at-sign
142 # ('@') used in various $(AS) constructs (e.g. @progbits). On architectures that
143 # don't use '@' for starting a comment, $(ATSIGN) is merely '@'. However, on
144 # those that do use it for starting a comment (e.g. arm32), $(ATSIGN) must be
145 # defined as the percentile-sign ('%') in the architecture-dependent
151 ## Cross-platform assembly to start a symtab.data section
154 SYMTAB_SECTION
= ".section symtab.data, \"a\", $(ATSIGN)progbits;"
156 ## Compilation options
159 ifeq ($(COMPILER
),gcc_native
)
160 CFLAGS
= $(GCC_CFLAGS
)
161 DEPEND_DEFS
= $(DEFS
) $(CONFIG_DEFS
)
162 INSTRUMENTATION
= -finstrument-functions
165 ifeq ($(COMPILER
),gcc_cross
)
166 CFLAGS
= $(GCC_CFLAGS
)
167 DEPEND_DEFS
= $(DEFS
) $(CONFIG_DEFS
)
168 INSTRUMENTATION
= -finstrument-functions
171 ifeq ($(COMPILER
),icc
)
172 CFLAGS
= $(ICC_CFLAGS
)
173 DEPEND_DEFS
= $(DEFS
) $(CONFIG_DEFS
)
177 ifeq ($(COMPILER
),clang
)
178 CFLAGS
= $(CLANG_CFLAGS
)
179 DEPEND_DEFS
= $(DEFS
) $(CONFIG_DEFS
)
184 ## Generic kernel sources
188 generic
/src
/adt
/avl.c \
189 generic
/src
/adt
/bitmap.c \
190 generic
/src
/adt
/btree.c \
191 generic
/src
/adt
/hash_table.c \
192 generic
/src
/adt
/list.c \
193 generic
/src
/console
/chardev.c \
194 generic
/src
/console
/console.c \
195 generic
/src
/console
/prompt.c \
196 generic
/src
/cpu
/cpu.c \
197 generic
/src
/ddi
/ddi.c \
198 generic
/src
/ddi
/irq.c \
199 generic
/src
/ddi
/device.c \
200 generic
/src
/debug
/symtab.c \
201 generic
/src
/debug
/stacktrace.c \
202 generic
/src
/debug
/panic.c \
203 generic
/src
/debug
/debug.c \
204 generic
/src
/interrupt
/interrupt.c \
205 generic
/src
/main
/main.c \
206 generic
/src
/main
/kinit.c \
207 generic
/src
/main
/uinit.c \
208 generic
/src
/main
/version.c \
209 generic
/src
/main
/shutdown.c \
210 generic
/src
/proc
/program.c \
211 generic
/src
/proc
/scheduler.c \
212 generic
/src
/proc
/thread.c \
213 generic
/src
/proc
/task.c \
214 generic
/src
/proc
/the.c \
215 generic
/src
/syscall
/syscall.c \
216 generic
/src
/syscall
/copy.c \
217 generic
/src
/mm
/km.c \
218 generic
/src
/mm
/reserve.c \
219 generic
/src
/mm
/buddy.c \
220 generic
/src
/mm
/frame.c \
221 generic
/src
/mm
/page.c \
222 generic
/src
/mm
/tlb.c \
223 generic
/src
/mm
/as.c \
224 generic
/src
/mm
/backend_anon.c \
225 generic
/src
/mm
/backend_elf.c \
226 generic
/src
/mm
/backend_phys.c \
227 generic
/src
/mm
/slab.c \
228 generic
/src
/lib
/func.c \
229 generic
/src
/lib
/memstr.c \
230 generic
/src
/lib
/memfnc.c \
231 generic
/src
/lib
/sort.c \
232 generic
/src
/lib
/str.c \
233 generic
/src
/lib
/elf.c \
234 generic
/src
/lib
/ra.c \
235 generic
/src
/lib
/rd.c \
236 generic
/src
/printf
/printf_core.c \
237 generic
/src
/printf
/printf.c \
238 generic
/src
/printf
/snprintf.c \
239 generic
/src
/printf
/vprintf.c \
240 generic
/src
/printf
/vsnprintf.c \
241 generic
/src
/time
/clock.c \
242 generic
/src
/time
/timeout.c \
243 generic
/src
/time
/delay.c \
244 generic
/src
/preempt
/preemption.c \
245 generic
/src
/synch
/spinlock.c \
246 generic
/src
/synch
/condvar.c \
247 generic
/src
/synch
/mutex.c \
248 generic
/src
/synch
/semaphore.c \
249 generic
/src
/synch
/smc.c \
250 generic
/src
/synch
/waitq.c \
251 generic
/src
/synch
/futex.c \
252 generic
/src
/smp
/ipi.c \
253 generic
/src
/smp
/smp.c \
254 generic
/src
/ipc
/ipc.c \
255 generic
/src
/ipc
/sysipc.c \
256 generic
/src
/ipc
/sysipc_ops.c \
257 generic
/src
/ipc
/ops
/clnestab.c \
258 generic
/src
/ipc
/ops
/conctmeto.c \
259 generic
/src
/ipc
/ops
/concttome.c \
260 generic
/src
/ipc
/ops
/connclone.c \
261 generic
/src
/ipc
/ops
/dataread.c \
262 generic
/src
/ipc
/ops
/datawrite.c \
263 generic
/src
/ipc
/ops
/debug.c \
264 generic
/src
/ipc
/ops
/sharein.c \
265 generic
/src
/ipc
/ops
/shareout.c \
266 generic
/src
/ipc
/ops
/stchngath.c \
267 generic
/src
/ipc
/ipcrsc.c \
268 generic
/src
/ipc
/irq.c \
269 generic
/src
/ipc
/event.c \
270 generic
/src
/security
/cap.c \
271 generic
/src
/sysinfo
/sysinfo.c \
272 generic
/src
/sysinfo
/stats.c
274 ## Kernel console support
277 ifeq ($(CONFIG_KCONSOLE
),y
)
279 generic
/src
/console
/kconsole.c \
280 generic
/src
/console
/cmd.c
283 ## Udebug interface sources
286 ifeq ($(CONFIG_UDEBUG
),y
)
288 generic
/src
/ipc
/kbox.c \
289 generic
/src
/udebug
/udebug.c \
290 generic
/src
/udebug
/udebug_ops.c \
291 generic
/src
/udebug
/udebug_ipc.c
297 ifeq ($(CONFIG_TEST
),y
)
301 test/atomic
/atomic1.c \
302 test/btree
/btree1.c \
303 test/avltree
/avltree1.c \
304 test/fault
/fault1.c \
310 test/synch
/semaphore1.c \
311 test/synch
/semaphore2.c \
312 test/print/print1.c \
313 test/print/print2.c \
314 test/print/print3.c \
315 test/print/print4.c \
316 test/print/print5.c \
317 test/thread
/thread1.c
319 ifeq ($(KARCH
),mips32
)
320 GENERIC_SOURCES
+= test/debug
/mips1.c
322 GENERIC_SOURCES
+= test/debug
/mips1_skip.c
326 GENERIC_SOURCES
+= test/mm
/purge1.c
328 GENERIC_SOURCES
+= test/mm
/purge1_skip.c
333 ## Sources where instrumentation is enabled
336 ifeq ($(CONFIG_TRACE
),y
)
337 INSTRUMENTED_SOURCES
= \
338 generic
/src
/adt
/btree.c \
339 generic
/src
/cpu
/cpu.c \
340 generic
/src
/ddi
/ddi.c \
341 generic
/src
/interrupt
/interrupt.c \
342 generic
/src
/main
/main.c \
343 generic
/src
/main
/kinit.c \
344 generic
/src
/proc
/the.c \
345 generic
/src
/mm
/frame.c \
346 generic
/src
/mm
/page.c \
347 generic
/src
/mm
/tlb.c \
348 generic
/src
/mm
/as.c \
349 generic
/src
/mm
/slab.c \
350 generic
/src
/sysinfo
/sysinfo.c \
351 generic
/src
/console
/kconsole.c
353 INSTRUMENTED_SOURCES
=
356 GENERIC_OBJECTS
:= $(addsuffix .o
,$(basename $(GENERIC_SOURCES
)))
357 ARCH_OBJECTS
:= $(addsuffix .o
,$(basename $(ARCH_SOURCES
)))
358 GENARCH_OBJECTS
:= $(addsuffix .o
,$(basename $(GENARCH_SOURCES
)))
360 LFLAGS_LTO
:= $(addprefix -Xlinker
,$(LFLAGS
))
362 ifeq ($(CONFIG_SYMTAB
),y
)
363 SYMTAB_OBJECTS
:= generic
/src
/debug
/real_map.o
369 $(OBJCOPY
) -O
$(BFD
) $< $@
372 ifeq ($(CONFIG_LINE_DEBUG
),y
)
373 $(OBJDUMP
) -d
-S
$< > $@
375 $(OBJDUMP
) -d
$< > $@
378 $(RAW
): $(LINK
) $(ARCH_OBJECTS
) $(GENARCH_OBJECTS
) $(GENERIC_OBJECTS
) $(SYMTAB_OBJECTS
)
379 ifeq ($(CONFIG_LTO
),y
)
380 $(GCC
) $(LFLAGS_LTO
) -Xlinker
-Map
-Xlinker
$(MAP
) $(DEFS
) $(GCC_CFLAGS
) -o
$@
$(ARCH_OBJECTS
) $(GENARCH_OBJECTS
) $(GENERIC_OBJECTS
) $(EXTRA_OBJECTS
) $(SYMTAB_OBJECTS
)
382 $(LD
) $(LFLAGS
) -Map
$(MAP
) -o
$@
$(ARCH_OBJECTS
) $(GENARCH_OBJECTS
) $(GENERIC_OBJECTS
) $(EXTRA_OBJECTS
) $(SYMTAB_OBJECTS
)
384 ifeq ($(CONFIG_STRIP_BINARIES
),y
)
388 $(LINK
): $(LINK
).in
$(DEPEND
)
389 $(GCC
) $(DEFS
) $(GCC_CFLAGS
) -D__ASM__
-D__LINKER__
-E
-x c
$< | grep
-v
"^\#" > $@
392 $(GCC
) $(DEFS
) $(GCC_CFLAGS
) -D__ASM__
-c
-o
$@
$<
394 $(JOBFILE
) $(JOB
) $< $@
as asm
/preproc
$(DEFS
) $(GCC_CFLAGS
) -D__ASM__
398 $(AS
) $(AFLAGS
) -o
$@
$<
400 $(JOBFILE
) $(JOB
) $< $@
as asm
$(DEFS
) $(CFLAGS
) $(EXTRA_FLAGS
)
404 $(CC
) $(DEFS
) $(CFLAGS
) $(EXTRA_FLAGS
) $(FPU_NO_CFLAGS
) $(if
$(findstring $<,$(INSTRUMENTED_SOURCES
)),$(INSTRUMENTATION
)) -c
-o
$@
$<
406 $(JOBFILE
) $(JOB
) $< $@
cc core
$(DEFS
) $(CFLAGS
) $(EXTRA_FLAGS
) $(FPU_NO_CFLAGS
)
409 $(REAL_MAP
).o
: $(REAL_MAP
).bin
410 echo
$(SYMTAB_SECTION
)" .incbin \"$<\"" |
$(AS
) $(AFLAGS
) -o
$@
412 $(REAL_MAP
).bin
: $(LINK
) $(ARCH_OBJECTS
) $(GENARCH_OBJECTS
) $(GENERIC_OBJECTS
)
413 echo
$(SYMTAB_SECTION
) |
$(AS
) $(AFLAGS
) -o
$(EMPTY_MAP
)
414 ifeq ($(CONFIG_LTO
),y
)
415 $(GCC
) $(LFLAGS_LTO
) -Xlinker
-Map
-Xlinker
$(MAP_PREV
) $(DEFS
) $(GCC_CFLAGS
) -o
$@
$(ARCH_OBJECTS
) $(GENARCH_OBJECTS
) $(GENERIC_OBJECTS
) $(EXTRA_OBJECTS
) $(EMPTY_MAP
)
417 $(LD
) $(LFLAGS
) -Map
$(MAP_PREV
) -o
$@
$(ARCH_OBJECTS
) $(GENARCH_OBJECTS
) $(GENERIC_OBJECTS
) $(EXTRA_OBJECTS
) $(EMPTY_MAP
)
419 $(OBJDUMP
) -t
$(ARCH_OBJECTS
) $(GENARCH_OBJECTS
) $(GENERIC_OBJECTS
) > $(DUMP
)
420 $(GENMAP
) $(MAP_PREV
) $(DUMP
) $@
422 # Do it once again, this time to get correct even the symbols
423 # on architectures that have bss after symtab
425 echo
$(SYMTAB_SECTION
)" .incbin \"$@\"" |
$(AS
) $(AFLAGS
) -o
$(SIZEOK_MAP
)
426 ifeq ($(CONFIG_LTO
),y
)
427 $(GCC
) $(LFLAGS_LTO
) -Xlinker
-Map
-Xlinker
$(MAP_PREV
) $(DEFS
) $(GCC_CFLAGS
) -o
$@
$(ARCH_OBJECTS
) $(GENARCH_OBJECTS
) $(GENERIC_OBJECTS
) $(EXTRA_OBJECTS
) $(SIZEOK_MAP
)
429 $(LD
) $(LFLAGS
) -Map
$(MAP_PREV
) -o
$@
$(ARCH_OBJECTS
) $(GENARCH_OBJECTS
) $(GENERIC_OBJECTS
) $(EXTRA_OBJECTS
) $(SIZEOK_MAP
)
431 $(OBJDUMP
) -t
$(ARCH_OBJECTS
) $(GENARCH_OBJECTS
) $(GENERIC_OBJECTS
) > $(DUMP
)
432 $(GENMAP
) $(MAP_PREV
) $(DUMP
) $@
434 $(DEPEND
): $(COMMON_HEADER_ARCH
)
435 makedepend
-f
- -- $(DEPEND_DEFS
) $(CFLAGS
) -- $(ARCH_SOURCES
) $(GENARCH_SOURCES
) $(GENERIC_SOURCES
) > $@
2> /dev
/null
436 -[ -f
$(DEPEND_PREV
) ] && diff
-q
$(DEPEND_PREV
) $@
&& mv
-f
$(DEPEND_PREV
) $@
438 $(COMMON_HEADER_ARCH
): $(COMMON_HEADER
)
439 ln
-sfn ..
/..
/..
/..
/$< $@