source: mainline/kernel/Makefile@ 45ce950

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 45ce950 was 45ce950, checked in by Jakub Jermar <jakub@…>, 14 years ago

Remove FPU tests from the kernel. Similar tests should be implemented in user space.
We basically don't want to fiddle with the FPU beyond managing the FPU context of
user threads. Not having C code which explicitly needs FPU instructions, we will now
have greater control of what instructions can the compiler use. We may want to
apply the -mno-fpu globally.

  • Property mode set to 100644
File size: 13.1 KB
Line 
1#
2# Copyright (c) 2005 Martin Decky
3# All rights reserved.
4#
5# Redistribution and use in source and binary forms, with or without
6# modification, are permitted provided that the following conditions
7# are met:
8#
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.
16#
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.
27#
28
29## Configuration
30#
31
32ROOT_PATH = ..
33
34VERSION_DEF = $(ROOT_PATH)/version
35
36COMMON_MAKEFILE = $(ROOT_PATH)/Makefile.common
37COMMON_HEADER = $(ROOT_PATH)/common.h
38COMMON_HEADER_ARCH = arch/$(KARCH)/include/common.h
39
40CONFIG_MAKEFILE = $(ROOT_PATH)/Makefile.config
41CONFIG_HEADER = $(ROOT_PATH)/config.h
42
43-include $(VERSION_DEF)
44-include $(COMMON_MAKEFILE)
45-include $(CONFIG_MAKEFILE)
46
47## Common names
48#
49
50DEPEND = Makefile.depend
51DEPEND_PREV = $(DEPEND).prev
52RAW = kernel.raw
53BIN = kernel.bin
54MAP = kernel.map
55JOB = kernel.job
56MAP_PREV = $(MAP).prev
57DISASM = kernel.disasm
58DUMP = kernel.dump
59REAL_MAP = generic/src/debug/real_map
60
61ARCH_INCLUDE = generic/include/arch
62GENARCH_INCLUDE = generic/include/genarch
63
64GENMAP = tools/genmap.py
65JOBFILE = $(ROOT_PATH)/tools/jobfile.py
66
67LINK = arch/$(KARCH)/_link.ld
68EMPTY_MAP = generic/src/debug/empty_map.o
69SIZEOK_MAP = generic/src/debug/sizeok_map.o
70
71.PHONY: all clean
72
73all: $(VERSION_DEF) $(COMMON_MAKEFILE) $(COMMON_HEADER) $(CONFIG_MAKEFILE) $(CONFIG_HEADER) $(BIN) $(DISASM)
74 -[ -f $(DEPEND) ] && cp -a $(DEPEND) $(DEPEND_PREV)
75
76clean:
77 rm -f $(DEPEND) $(DEPEND_PREV) $(RAW) $(BIN) $(MAP) $(JOB) $(MAP_PREV) $(DISASM) $(DUMP) $(REAL_MAP).* $(ARCH_INCLUDE) $(GENARCH_INCLUDE) arch/*/_link.ld arch/*/include/common.h
78 find generic/src/ arch/*/src/ genarch/src/ test/ -name '*.o' -follow -exec rm \{\} \;
79
80## Common compiler flags
81#
82
83INCLUDES = generic/include
84
85ifeq ($(CONFIG_OPTIMIZE_FOR_SIZE),y)
86 OPTIMIZATION = s
87else
88 OPTIMIZATION = 3
89endif
90
91DEFS = -DKERNEL -DRELEASE=$(RELEASE) "-DNAME=$(NAME)" -D__$(BITS)_BITS__ -D__$(ENDIANESS)__
92
93GCC_CFLAGS = -I$(INCLUDES) -O$(OPTIMIZATION) -imacros $(CONFIG_HEADER) \
94 -fexec-charset=UTF-8 -fwide-exec-charset=UTF-32$(ENDIANESS) \
95 -finput-charset=UTF-8 -ffreestanding -fno-builtin -nostdlib -nostdinc \
96 -std=gnu99 -Wall -Wextra -Wno-unused-parameter -Wmissing-prototypes \
97 -Werror-implicit-function-declaration -Wwrite-strings \
98 -pipe
99
100ICC_CFLAGS = -I$(INCLUDES) -O$(OPTIMIZATION) -imacros $(CONFIG_HEADER) \
101 -ffreestanding -fno-builtin -nostdlib -nostdinc -Wall -Wmissing-prototypes \
102 -Werror-implicit-function-declaration -wd170
103
104SUNCC_CFLAGS = -I$(INCLUDES) -xO$(OPTIMIZATION) \
105 -xnolib -xc99=all -features=extensions \
106 -erroff=E_ZERO_SIZED_STRUCT_UNION
107
108CLANG_CFLAGS = -I$(INCLUDES) -O$(OPTIMIZATION) -imacros $(CONFIG_HEADER) \
109 -fexec-charset=UTF-8 -fwide-exec-charset=UTF-32$(ENDIANESS) \
110 -finput-charset=UTF-8 -ffreestanding -fno-builtin -nostdlib -nostdinc \
111 -Wall -Wextra -Wno-unused-parameter -Wmissing-prototypes \
112 -Werror-implicit-function-declaration -Wwrite-strings \
113 -pipe -arch $(CLANG_ARCH)
114
115ifeq ($(CONFIG_DEBUG),y)
116 GCC_CFLAGS += -Werror
117 ICC_CFLAGS += -Werror
118endif
119
120ifeq ($(CONFIG_LTO),y)
121 GCC_CFLAGS += -flto
122endif
123
124ifeq ($(CONFIG_LINE_DEBUG),y)
125 GCC_CFLAGS += -g
126 ICC_CFLAGS += -g
127 SUNCC_CFLAGS += -g
128 CLANG_CFLAGS += -g
129endif
130
131#
132# Mind the mutual ordering with the inclusion of the arch Makefile.inc.
133# AFLAGS and LFLAGS must be initialized before the inclusion.
134#
135AFLAGS =
136LFLAGS = -n -T $(LINK) -M
137
138#
139# Mind the mutual ordering with the initialization of AFLAGS and LFLAGS.
140# The arch Makefile.inc must be included after the initialization.
141#
142-include arch/$(KARCH)/Makefile.inc
143-include genarch/Makefile.inc
144-include $(DEPEND)
145
146## The at-sign
147#
148# The $(ATSIGN) variable holds the ASCII character representing the at-sign
149# ('@') used in various $(AS) constructs (e.g. @progbits). On architectures that
150# don't use '@' for starting a comment, $(ATSIGN) is merely '@'. However, on
151# those that do use it for starting a comment (e.g. arm32), $(ATSIGN) must be
152# defined as the percentile-sign ('%') in the architecture-dependent
153# Makefile.inc.
154#
155
156ATSIGN ?= @
157
158## Cross-platform assembly to start a symtab.data section
159#
160
161SYMTAB_SECTION = ".section symtab.data, \"a\", $(ATSIGN)progbits;"
162
163## Compilation options
164#
165
166ifeq ($(COMPILER),gcc_native)
167 CFLAGS = $(GCC_CFLAGS)
168 DEPEND_DEFS = $(DEFS) $(CONFIG_DEFS)
169 INSTRUMENTATION = -finstrument-functions
170endif
171
172ifeq ($(COMPILER),gcc_cross)
173 CFLAGS = $(GCC_CFLAGS)
174 DEPEND_DEFS = $(DEFS) $(CONFIG_DEFS)
175 INSTRUMENTATION = -finstrument-functions
176endif
177
178ifeq ($(COMPILER),icc)
179 CFLAGS = $(ICC_CFLAGS)
180 DEPEND_DEFS = $(DEFS) $(CONFIG_DEFS)
181 INSTRUMENTATION =
182endif
183
184ifeq ($(COMPILER),suncc)
185 CFLAGS = $(SUNCC_CFLAGS)
186 DEFS += $(CONFIG_DEFS)
187 DEPEND_DEFS = $(DEFS)
188 INSTRUMENTATION =
189endif
190
191ifeq ($(COMPILER),clang)
192 CFLAGS = $(CLANG_CFLAGS)
193 DEPEND_DEFS = $(DEFS) $(CONFIG_DEFS)
194 INSTRUMENTATION =
195endif
196
197
198## Generic kernel sources
199#
200
201GENERIC_SOURCES = \
202 generic/src/adt/avl.c \
203 generic/src/adt/bitmap.c \
204 generic/src/adt/btree.c \
205 generic/src/adt/hash_table.c \
206 generic/src/adt/list.c \
207 generic/src/console/chardev.c \
208 generic/src/console/console.c \
209 generic/src/cpu/cpu.c \
210 generic/src/ddi/ddi.c \
211 generic/src/ddi/irq.c \
212 generic/src/ddi/device.c \
213 generic/src/debug/symtab.c \
214 generic/src/debug/stacktrace.c \
215 generic/src/debug/panic.c \
216 generic/src/debug/debug.c \
217 generic/src/interrupt/interrupt.c \
218 generic/src/main/main.c \
219 generic/src/main/kinit.c \
220 generic/src/main/uinit.c \
221 generic/src/main/version.c \
222 generic/src/main/shutdown.c \
223 generic/src/proc/program.c \
224 generic/src/proc/scheduler.c \
225 generic/src/proc/thread.c \
226 generic/src/proc/task.c \
227 generic/src/proc/the.c \
228 generic/src/syscall/syscall.c \
229 generic/src/syscall/copy.c \
230 generic/src/mm/reserve.c \
231 generic/src/mm/buddy.c \
232 generic/src/mm/frame.c \
233 generic/src/mm/page.c \
234 generic/src/mm/tlb.c \
235 generic/src/mm/as.c \
236 generic/src/mm/backend_anon.c \
237 generic/src/mm/backend_elf.c \
238 generic/src/mm/backend_phys.c \
239 generic/src/mm/slab.c \
240 generic/src/lib/func.c \
241 generic/src/lib/memstr.c \
242 generic/src/lib/memfnc.c \
243 generic/src/lib/sort.c \
244 generic/src/lib/str.c \
245 generic/src/lib/elf.c \
246 generic/src/lib/rd.c \
247 generic/src/printf/printf_core.c \
248 generic/src/printf/printf.c \
249 generic/src/printf/snprintf.c \
250 generic/src/printf/vprintf.c \
251 generic/src/printf/vsnprintf.c \
252 generic/src/time/clock.c \
253 generic/src/time/timeout.c \
254 generic/src/time/delay.c \
255 generic/src/preempt/preemption.c \
256 generic/src/synch/spinlock.c \
257 generic/src/synch/condvar.c \
258 generic/src/synch/mutex.c \
259 generic/src/synch/semaphore.c \
260 generic/src/synch/smc.c \
261 generic/src/synch/waitq.c \
262 generic/src/synch/futex.c \
263 generic/src/smp/ipi.c \
264 generic/src/smp/smp.c \
265 generic/src/ipc/ipc.c \
266 generic/src/ipc/sysipc.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
273
274## Kernel console support
275#
276
277ifeq ($(CONFIG_KCONSOLE),y)
278GENERIC_SOURCES += \
279 generic/src/console/kconsole.c \
280 generic/src/console/cmd.c
281endif
282
283## Udebug interface sources
284#
285
286ifeq ($(CONFIG_UDEBUG),y)
287GENERIC_SOURCES += \
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
292endif
293
294## Test sources
295#
296
297ifeq ($(CONFIG_TEST),y)
298 CFLAGS += -Itest/
299 GENERIC_SOURCES += \
300 test/test.c \
301 test/atomic/atomic1.c \
302 test/btree/btree1.c \
303 test/avltree/avltree1.c \
304 test/fault/fault1.c \
305 test/mm/falloc1.c \
306 test/mm/falloc2.c \
307 test/mm/mapping1.c \
308 test/mm/slab1.c \
309 test/mm/slab2.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
318
319 ifeq ($(KARCH),mips32)
320 GENERIC_SOURCES += test/debug/mips1.c
321 else
322 GENERIC_SOURCES += test/debug/mips1_skip.c
323 endif
324
325 ifeq ($(KARCH),ia64)
326 GENERIC_SOURCES += test/mm/purge1.c
327 else
328 GENERIC_SOURCES += test/mm/purge1_skip.c
329 endif
330
331endif
332
333## Sources where instrumentation is enabled
334#
335
336ifeq ($(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
352else
353 INSTRUMENTED_SOURCES =
354endif
355
356GENERIC_OBJECTS := $(addsuffix .o,$(basename $(GENERIC_SOURCES)))
357ARCH_OBJECTS := $(addsuffix .o,$(basename $(ARCH_SOURCES)))
358GENARCH_OBJECTS := $(addsuffix .o,$(basename $(GENARCH_SOURCES)))
359
360LFLAGS_LTO := $(addprefix -Xlinker ,$(LFLAGS))
361
362ifeq ($(CONFIG_SYMTAB),y)
363 SYMTAB_OBJECTS := generic/src/debug/real_map.o
364else
365 SYMTAB_OBJECTS :=
366endif
367
368$(BIN): $(RAW)
369 $(OBJCOPY) -O $(BFD) $< $@
370
371$(DISASM): $(RAW)
372ifeq ($(CONFIG_LINE_DEBUG),y)
373 $(OBJDUMP) -d -S $< > $@
374else
375 $(OBJDUMP) -d $< > $@
376endif
377
378$(RAW): $(LINK) $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS) $(SYMTAB_OBJECTS)
379ifeq ($(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)
381else
382 $(LD) $(LFLAGS) -Map $(MAP) -o $@ $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS) $(EXTRA_OBJECTS) $(SYMTAB_OBJECTS)
383endif
384ifeq ($(CONFIG_STRIP_BINARIES),y)
385 $(STRIP) $(RAW)
386endif
387
388$(LINK): $(LINK).in $(DEPEND)
389 $(GCC) $(DEFS) $(GCC_CFLAGS) -D__ASM__ -D__LINKER__ -E -x c $< | grep -v "^\#" > $@
390
391%.o: %.S $(DEPEND)
392 $(GCC) $(DEFS) $(GCC_CFLAGS) -D__ASM__ -c -o $@ $<
393ifeq ($(PRECHECK),y)
394 $(JOBFILE) $(JOB) $< $@ as asm/preproc $(DEFS) $(GCC_CFLAGS) -D__ASM__
395endif
396
397%.o: %.s $(DEPEND)
398 $(AS) $(AFLAGS) -o $@ $<
399ifeq ($(PRECHECK),y)
400 $(JOBFILE) $(JOB) $< $@ as asm $(DEFS) $(CFLAGS) $(EXTRA_FLAGS)
401endif
402
403#
404# The FPU tests are the only objects for which we allow the compiler to generate
405# FPU instructions.
406#
407
408test/fpu/%.o: test/fpu/%.c $(DEPEND)
409 $(CC) $(DEFS) $(CFLAGS) $(EXTRA_FLAGS) -c -o $@ $<
410ifeq ($(PRECHECK),y)
411 $(JOBFILE) $(JOB) $< $@ cc test $(DEFS) $(CFLAGS) $(EXTRA_FLAGS)
412endif
413
414#
415# Ordinary objects.
416#
417
418%.o: %.c $(DEPEND)
419 $(CC) $(DEFS) $(CFLAGS) $(EXTRA_FLAGS) $(FPU_NO_CFLAGS) $(if $(findstring $<,$(INSTRUMENTED_SOURCES)),$(INSTRUMENTATION)) -c -o $@ $<
420ifeq ($(PRECHECK),y)
421 $(JOBFILE) $(JOB) $< $@ cc core $(DEFS) $(CFLAGS) $(EXTRA_FLAGS) $(FPU_NO_CFLAGS)
422endif
423
424$(REAL_MAP).o: $(REAL_MAP).bin
425 echo $(SYMTAB_SECTION)" .incbin \"$<\"" | $(AS) $(AFLAGS) -o $@
426
427$(REAL_MAP).bin: $(LINK) $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS)
428 echo $(SYMTAB_SECTION) | $(AS) $(AFLAGS) -o $(EMPTY_MAP)
429ifeq ($(CONFIG_LTO),y)
430 $(GCC) $(LFLAGS_LTO) -Xlinker -Map -Xlinker $(MAP_PREV) $(DEFS) $(GCC_CFLAGS) -o $@ $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS) $(EXTRA_OBJECTS) $(EMPTY_MAP)
431else
432 $(LD) $(LFLAGS) -Map $(MAP_PREV) -o $@ $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS) $(EXTRA_OBJECTS) $(EMPTY_MAP)
433endif
434 $(OBJDUMP) -t $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS) > $(DUMP)
435 $(GENMAP) $(MAP_PREV) $(DUMP) $@
436
437 # Do it once again, this time to get correct even the symbols
438 # on architectures that have bss after symtab
439
440 echo $(SYMTAB_SECTION)" .incbin \"$@\"" | $(AS) $(AFLAGS) -o $(SIZEOK_MAP)
441ifeq ($(CONFIG_LTO),y)
442 $(GCC) $(LFLAGS_LTO) -Xlinker -Map -Xlinker $(MAP_PREV) $(DEFS) $(GCC_CFLAGS) -o $@ $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS) $(EXTRA_OBJECTS) $(SIZEOK_MAP)
443else
444 $(LD) $(LFLAGS) -Map $(MAP_PREV) -o $@ $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS) $(EXTRA_OBJECTS) $(SIZEOK_MAP)
445endif
446 $(OBJDUMP) -t $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS) > $(DUMP)
447 $(GENMAP) $(MAP_PREV) $(DUMP) $@
448
449$(DEPEND): $(ARCH_INCLUDE) $(GENARCH_INCLUDE) $(COMMON_HEADER_ARCH)
450 makedepend -f - -- $(DEPEND_DEFS) $(CFLAGS) -- $(ARCH_SOURCES) $(GENARCH_SOURCES) $(GENERIC_SOURCES) > $@ 2> /dev/null
451 -[ -f $(DEPEND_PREV) ] && diff -q $(DEPEND_PREV) $@ && mv -f $(DEPEND_PREV) $@
452
453$(ARCH_INCLUDE): arch/$(KARCH)/include/
454 ln -sfn ../../$< $@
455
456$(GENARCH_INCLUDE): genarch/include/
457 ln -sfn ../../$< $@
458
459$(COMMON_HEADER_ARCH): $(COMMON_HEADER)
460 ln -sfn ../../../$< $@
Note: See TracBrowser for help on using the repository browser.