source: mainline/kernel/Makefile@ d2f75eb

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since d2f75eb was d2f75eb, checked in by GitHub <noreply@…>, 8 years ago

Replace autogen.py with something simpler. (#30)

Instead of generating headers for certain structures, the headers are written manually and we automate checking correctness instead. Checking is performed by generating a C source with a bunch of static asserts, using a simple awk script. This is then treated as a normal source file.

The primary motivation for this change is to reduce the complexity of the build process. Also, the .ag files we used previously are more difficult to understand than regular C code, and at least one IDE (GNOME Builder) completely refuses to open them.

  • Property mode set to 100644
File size: 12.7 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/arch/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
50AUTOCHECK = $(realpath $(ROOT_PATH)/tools/autocheck.awk)
51RAW = kernel.raw
52BIN = kernel.bin
53MAP = kernel.map
54JOB = kernel.job
55MAP_PREV = $(MAP).prev
56DISASM = kernel.disasm
57DUMP = kernel.dump
58REAL_MAP = generic/src/debug/real_map
59
60GENMAP = tools/genmap.py
61
62LINK = arch/$(KARCH)/_link.ld
63EMPTY_MAP = generic/src/debug/empty_map.o
64SIZEOK_MAP = generic/src/debug/sizeok_map.o
65
66ifeq ($(PRECHECK),y)
67 JOBFILE = $(ROOT_PATH)/tools/jobfile.py
68 # XXX: Do not change the order of arguments.
69 CC_JOB = $(JOBFILE) $(JOB) $(CC) $< -o $@
70else
71 CC_JOB = $(CC) $< -o $@
72endif
73
74.PHONY: all clean autogen_clean depend
75.DELETE_ON_ERROR:
76
77all: $(VERSION_DEF) $(COMMON_MAKEFILE) $(COMMON_HEADER) $(CONFIG_MAKEFILE) $(CONFIG_HEADER) $(BIN) $(DISASM)
78
79clean: autogen_clean
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 '{}' \;
83
84## Common compiler flags
85#
86
87INCLUDES = generic/include genarch/include arch/$(KARCH)/include ../abi/include
88INCLUDES_FLAGS = $(addprefix -I,$(INCLUDES))
89
90DEFS = -DKERNEL -DRELEASE=$(RELEASE) "-DCOPYRIGHT=$(COPYRIGHT)" "-DNAME=$(NAME)" -D__$(BITS)_BITS__ -D__$(ENDIANESS)__
91
92COMMON_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))=.
96
97GCC_CFLAGS = -std=gnu99 -Wall -Wextra -Wno-unused-parameter \
98 -Wmissing-prototypes -Werror-implicit-function-declaration \
99 -Wwrite-strings -pipe
100
101CLANG_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
105
106ifeq ($(CONFIG_DEBUG),y)
107 COMMON_CFLAGS += -Werror
108endif
109
110ifeq ($(CONFIG_LTO),y)
111 COMMON_CFLAGS += -flto
112endif
113
114ifeq ($(CONFIG_LINE_DEBUG),y)
115 COMMON_CFLAGS += -g
116endif
117
118#
119# Mind the mutual ordering with the inclusion of the arch Makefile.inc.
120# AFLAGS and LFLAGS must be initialized before the inclusion.
121#
122AFLAGS = --fatal-warnings
123LFLAGS = -n -T $(LINK) -M --fatal-warnings --warn-common
124
125ifeq ($(CONFIG_STRIP_BINARIES),y)
126 LFLAGS += --strip-all
127endif
128
129#
130# Mind the mutual ordering with the initialization of AFLAGS and LFLAGS.
131# The arch Makefile.inc must be included after the initialization.
132#
133-include arch/$(KARCH)/Makefile.inc
134-include genarch/Makefile.inc
135
136## The at-sign
137#
138# The $(ATSIGN) variable holds the ASCII character representing the at-sign
139# ('@') used in various $(AS) constructs (e.g. @progbits). On architectures that
140# don't use '@' for starting a comment, $(ATSIGN) is merely '@'. However, on
141# those that do use it for starting a comment (e.g. arm32), $(ATSIGN) must be
142# defined as the percentile-sign ('%') in the architecture-dependent
143# Makefile.inc.
144#
145
146ATSIGN ?= @
147
148## Cross-platform assembly to start a symtab.data section
149#
150
151SYMTAB_SECTION = .section symtab.data, \"a\", $(ATSIGN)progbits;
152
153## Compilation options
154#
155
156ifeq ($(COMPILER),clang)
157 CFLAGS = $(COMMON_CFLAGS) $(CLANG_CFLAGS)
158else
159 CFLAGS = $(COMMON_CFLAGS) $(GCC_CFLAGS)
160endif
161
162INSTRUMENTATION = -finstrument-functions
163
164## Generic kernel sources
165#
166
167GENERIC_SOURCES = \
168 generic/src/adt/avl.c \
169 generic/src/adt/bitmap.c \
170 generic/src/adt/btree.c \
171 generic/src/adt/cht.c \
172 generic/src/adt/hash_table.c \
173 generic/src/adt/list.c \
174 generic/src/console/chardev.c \
175 generic/src/console/console.c \
176 generic/src/console/prompt.c \
177 generic/src/cpu/cpu.c \
178 generic/src/cpu/cpu_mask.c \
179 generic/src/ddi/ddi.c \
180 generic/src/ddi/irq.c \
181 generic/src/debug/symtab.c \
182 generic/src/debug/stacktrace.c \
183 generic/src/debug/panic.c \
184 generic/src/debug/debug.c \
185 generic/src/interrupt/interrupt.c \
186 generic/src/log/log.c \
187 generic/src/main/main.c \
188 generic/src/main/kinit.c \
189 generic/src/main/uinit.c \
190 generic/src/main/version.c \
191 generic/src/main/shutdown.c \
192 generic/src/proc/program.c \
193 generic/src/proc/scheduler.c \
194 generic/src/proc/thread.c \
195 generic/src/proc/task.c \
196 generic/src/proc/the.c \
197 generic/src/syscall/syscall.c \
198 generic/src/syscall/copy.c \
199 generic/src/mm/km.c \
200 generic/src/mm/reserve.c \
201 generic/src/mm/frame.c \
202 generic/src/mm/page.c \
203 generic/src/mm/tlb.c \
204 generic/src/mm/as.c \
205 generic/src/mm/backend_anon.c \
206 generic/src/mm/backend_elf.c \
207 generic/src/mm/backend_phys.c \
208 generic/src/mm/backend_user.c \
209 generic/src/mm/slab.c \
210 generic/src/lib/halt.c \
211 generic/src/lib/mem.c \
212 generic/src/lib/memfnc.c \
213 generic/src/lib/gsort.c \
214 generic/src/lib/str.c \
215 generic/src/lib/str_error.c \
216 generic/src/lib/elf.c \
217 generic/src/lib/ra.c \
218 generic/src/lib/rd.c \
219 generic/src/printf/printf_core.c \
220 generic/src/printf/printf.c \
221 generic/src/printf/snprintf.c \
222 generic/src/printf/vprintf.c \
223 generic/src/printf/vsnprintf.c \
224 generic/src/time/clock.c \
225 generic/src/time/timeout.c \
226 generic/src/time/delay.c \
227 generic/src/preempt/preemption.c \
228 generic/src/synch/spinlock.c \
229 generic/src/synch/condvar.c \
230 generic/src/synch/mutex.c \
231 generic/src/synch/semaphore.c \
232 generic/src/synch/smc.c \
233 generic/src/synch/smp_memory_barrier.c \
234 generic/src/synch/waitq.c \
235 generic/src/synch/futex.c \
236 generic/src/synch/workqueue.c \
237 generic/src/synch/rcu.c \
238 generic/src/smp/ipi.c \
239 generic/src/smp/smp.c \
240 generic/src/smp/smp_call.c \
241 generic/src/ipc/ipc.c \
242 generic/src/ipc/sysipc.c \
243 generic/src/ipc/sysipc_ops.c \
244 generic/src/ipc/ops/conctmeto.c \
245 generic/src/ipc/ops/concttome.c \
246 generic/src/ipc/ops/dataread.c \
247 generic/src/ipc/ops/datawrite.c \
248 generic/src/ipc/ops/debug.c \
249 generic/src/ipc/ops/pagein.c \
250 generic/src/ipc/ops/sharein.c \
251 generic/src/ipc/ops/shareout.c \
252 generic/src/ipc/ops/stchngath.c \
253 generic/src/ipc/ipcrsc.c \
254 generic/src/ipc/irq.c \
255 generic/src/ipc/event.c \
256 generic/src/cap/cap.c \
257 generic/src/security/perm.c \
258 generic/src/sysinfo/sysinfo.c \
259 generic/src/sysinfo/stats.c
260
261## Kernel console support
262#
263
264ifeq ($(CONFIG_KCONSOLE),y)
265GENERIC_SOURCES += \
266 generic/src/console/kconsole.c \
267 generic/src/console/cmd.c
268endif
269
270## Udebug interface sources
271#
272
273ifeq ($(CONFIG_UDEBUG),y)
274GENERIC_SOURCES += \
275 generic/src/ipc/kbox.c \
276 generic/src/udebug/udebug.c \
277 generic/src/udebug/udebug_ops.c \
278 generic/src/udebug/udebug_ipc.c
279endif
280
281## Test sources
282#
283
284ifeq ($(CONFIG_TEST),y)
285 CFLAGS += -Itest/
286 GENERIC_SOURCES += \
287 test/test.c \
288 test/atomic/atomic1.c \
289 test/btree/btree1.c \
290 test/cht/cht1.c \
291 test/avltree/avltree1.c \
292 test/fault/fault1.c \
293 test/mm/falloc1.c \
294 test/mm/falloc2.c \
295 test/mm/mapping1.c \
296 test/mm/slab1.c \
297 test/mm/slab2.c \
298 test/synch/semaphore1.c \
299 test/synch/semaphore2.c \
300 test/synch/workqueue2.c \
301 test/synch/workqueue3.c \
302 test/synch/rcu1.c \
303 test/print/print1.c \
304 test/print/print2.c \
305 test/print/print3.c \
306 test/print/print4.c \
307 test/print/print5.c \
308 test/thread/thread1.c \
309 test/smpcall/smpcall1.c
310
311 ifeq ($(KARCH),mips32)
312 GENERIC_SOURCES += test/debug/mips1.c
313 else
314 GENERIC_SOURCES += test/debug/mips1_skip.c
315 endif
316
317 ifeq ($(KARCH),ia64)
318 GENERIC_SOURCES += test/mm/purge1.c
319 else
320 GENERIC_SOURCES += test/mm/purge1_skip.c
321 endif
322
323endif
324
325## Sources where instrumentation is enabled
326#
327
328ifeq ($(CONFIG_TRACE),y)
329 INSTRUMENTED_SOURCES = \
330 generic/src/adt/btree.c \
331 generic/src/cpu/cpu.c \
332 generic/src/ddi/ddi.c \
333 generic/src/interrupt/interrupt.c \
334 generic/src/main/main.c \
335 generic/src/main/kinit.c \
336 generic/src/proc/the.c \
337 generic/src/mm/frame.c \
338 generic/src/mm/page.c \
339 generic/src/mm/tlb.c \
340 generic/src/mm/as.c \
341 generic/src/mm/slab.c \
342 generic/src/sysinfo/sysinfo.c \
343 generic/src/console/kconsole.c
344else
345 INSTRUMENTED_SOURCES =
346endif
347
348ARCH_SOURCES += $(ARCH_AUTOCHECK_HEADERS:%.h=%.check.c)
349GENARCH_SOURCES += $(GENARCH_AUTOCHECK_HEADERS:%.h=%.check.c)
350
351GENERIC_OBJECTS := $(addsuffix .o,$(basename $(GENERIC_SOURCES)))
352ARCH_OBJECTS := $(addsuffix .o,$(basename $(ARCH_SOURCES)))
353GENARCH_OBJECTS := $(addsuffix .o,$(basename $(GENARCH_SOURCES)))
354
355GENERIC_DEPENDS := $(addsuffix .d,$(basename $(GENERIC_SOURCES)))
356ARCH_DEPENDS := $(addsuffix .d,$(basename $(ARCH_SOURCES)))
357GENARCH_DEPENDS := $(addsuffix .d,$(basename $(GENARCH_SOURCES)))
358
359AS_CFLAGS := $(addprefix -Xassembler ,$(AFLAGS))
360LD_CFLAGS := $(addprefix -Xlinker ,$(LFLAGS))
361
362-include $(GENERIC_DEPENDS)
363-include $(ARCH_DEPENDS)
364-include $(GENARCH_DEPENDS)
365
366ifeq ($(COMPILER),clang)
367 AS_CFLAGS += -mllvm -asm-macro-max-nesting-depth=1000
368endif
369
370ifeq ($(CONFIG_SYMTAB),y)
371 SYMTAB_OBJECTS := generic/src/debug/real_map.o
372else
373 SYMTAB_OBJECTS :=
374endif
375
376$(BIN): $(RAW)
377 $(OBJCOPY) -O $(BFD) $< $@
378
379$(DISASM): $(RAW)
380ifeq ($(CONFIG_LINE_DEBUG),y)
381 $(OBJDUMP) -d -S $< > $@
382else
383 $(OBJDUMP) -d $< > $@
384endif
385
386$(RAW): $(LINK) $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS) $(SYMTAB_OBJECTS)
387ifeq ($(CONFIG_LTO),y)
388 $(CC) $(DEFS) $(CFLAGS) $(LD_CFLAGS) -Xlinker -Map -Xlinker $(MAP) -o $@ $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS) $(EXTRA_OBJECTS) $(SYMTAB_OBJECTS)
389else
390 $(LD) $(LFLAGS) -Map $(MAP) -o $@ $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS) $(EXTRA_OBJECTS) $(SYMTAB_OBJECTS)
391endif
392
393$(LINK): $(LINK).in
394 $(CC) $(DEFS) $(CFLAGS) -D__ASSEMBLER__ -D__LINKER__ -E -x c $< | grep -v "^\#" > $@
395
396%.check.c: %.h $(AUTOCHECK)
397 cd $(<D) && $(AUTOCHECK) $(<F) > $(@F)
398
399%.o: %.S
400 $(CC_JOB) -c -MD -MP $(DEFS) $(CFLAGS) $(AS_CFLAGS)
401
402%.o: %.s
403 $(CC_JOB) -c -MD -MP $(DEFS) $(CFLAGS) $(AS_CFLAGS)
404
405%.o: %.c
406 $(CC_JOB) -c -MD -MP $(DEFS) $(CFLAGS) $(EXTRA_FLAGS) $(FPU_NO_CFLAGS) $(if $(findstring $<,$(INSTRUMENTED_SOURCES)),$(INSTRUMENTATION))
407
408$(REAL_MAP).o: $(REAL_MAP).bin
409 echo "$(AS_PROLOG)""$(SYMTAB_SECTION)"" .incbin \"$<\"" | $(CC) $(CFLAGS) $(AS_CFLAGS) -x assembler -c -o $@ -
410
411$(REAL_MAP).bin: $(LINK) $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS)
412 echo "$(AS_PROLOG)""$(SYMTAB_SECTION)" | $(CC) $(CFLAGS) $(AS_CFLAGS) -x assembler -c -o $(EMPTY_MAP) -
413ifeq ($(CONFIG_LTO),y)
414 $(CC) $(DEFS) $(CFLAGS) $(LD_CFLAGS) -Xlinker -Map -Xlinker $(MAP_PREV) -o $@ $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS) $(EXTRA_OBJECTS) $(EMPTY_MAP)
415else
416 $(LD) $(LFLAGS) -Map $(MAP_PREV) -o $@ $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS) $(EXTRA_OBJECTS) $(EMPTY_MAP)
417endif
418 $(OBJDUMP) -t $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS) > $(DUMP)
419 $(GENMAP) $(MAP_PREV) $(DUMP) $@
420
421 # Do it once again, this time to get correct even the symbols
422 # on architectures that have bss after symtab
423
424 echo "$(AS_PROLOG)""$(SYMTAB_SECTION)"" .incbin \"$@\"" | $(CC) $(CFLAGS) $(AS_CFLAGS) -x assembler -c -o $(SIZEOK_MAP) -
425ifeq ($(CONFIG_LTO),y)
426 $(CC) $(DEFS) $(CFLAGS) $(LD_CFLAGS) -Xlinker -Map -Xlinker $(MAP_PREV) -o $@ $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS) $(EXTRA_OBJECTS) $(SIZEOK_MAP)
427else
428 $(LD) $(LFLAGS) -Map $(MAP_PREV) -o $@ $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS) $(EXTRA_OBJECTS) $(SIZEOK_MAP)
429endif
430 $(OBJDUMP) -t $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS) > $(DUMP)
431 $(GENMAP) $(MAP_PREV) $(DUMP) $@
Note: See TracBrowser for help on using the repository browser.