aboutsummaryrefslogtreecommitdiffstats
path: root/src/Makefile.build
blob: 96757cba577ad24c3058781e3950b4f496535cea (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
# -*- makefile -*-

SRCDIR = ../..

all: os.dsk

include ../../Make.config
include ../Make.vars
include ../../tests/Make.tests

# Compiler and assembler options.
os.dsk: CPPFLAGS += -I$(SRCDIR)/lib/kernel

# Core kernel.
threads_SRC  = threads/init.c		# Main program.
threads_SRC += threads/thread.c		# Thread management core.
threads_SRC += threads/switch.S		# Thread switch routine.
threads_SRC += threads/interrupt.c	# Interrupt core.
threads_SRC += threads/intr-stubs.S	# Interrupt stubs.
threads_SRC += threads/synch.c		# Synchronization.
threads_SRC += threads/palloc.c		# Page allocator.
threads_SRC += threads/malloc.c		# Subpage allocator.
threads_SRC += threads/start.S		# Startup code.
threads_SRC += threads/boundedbuffer.c	# bounded buffer code
threads_SRC += threads/synchlist.c	# synchronized list code

# Device driver code.
devices_SRC  = devices/timer.c		# Timer device.
devices_SRC += devices/kbd.c		# Keyboard device.
devices_SRC += devices/vga.c		# Video device.
devices_SRC += devices/serial.c		# Serial port device.
devices_SRC += devices/disk.c		# IDE disk device.
devices_SRC += devices/input.c		# Serial and keyboard input.
devices_SRC += devices/intq.c		# Interrupt queue.

# Library code shared between kernel and user programs.
lib_SRC  = lib/debug.c			# Debug helpers.
lib_SRC += lib/random.c			# Pseudo-random numbers.
lib_SRC += lib/stdio.c			# I/O library.
lib_SRC += lib/stdlib.c			# Utility functions.
lib_SRC += lib/string.c			# String functions.
lib_SRC += lib/arithmetic.c

# Kernel-specific library code.
lib/kernel_SRC  = lib/kernel/debug.c	# Debug helpers.
lib/kernel_SRC += lib/kernel/list.c	# Doubly-linked lists.
lib/kernel_SRC += lib/kernel/bitmap.c	# Bitmaps.
lib/kernel_SRC += lib/kernel/hash.c	# Hash tables.
lib/kernel_SRC += lib/kernel/console.c	# printf(), putchar().
lib/kernel_SRC += lib/kernel/slist.c    # simple list

# User process code.
userprog_SRC  = userprog/process.c	# Process loading.
userprog_SRC += userprog/load.c		# Process loading.
userprog_SRC += userprog/pagedir.c	# Page directories.
userprog_SRC += userprog/exception.c	# User exception handler.
userprog_SRC += userprog/syscall.c	# System call handler.
userprog_SRC += userprog/gdt.c		# GDT initialization.
userprog_SRC += userprog/tss.c		# TSS management.
userprog_SRC += userprog/flist.c	# Open file list.
userprog_SRC += userprog/plist.c	# Process list.

# No virtual memory code yet.
#vm_SRC = vm/file.c			# Some file.

# Filesystem code.
filesys_SRC  = filesys/filesys.c	# Filesystem core.
filesys_SRC += filesys/free-map.c	# Free sector bitmap.
filesys_SRC += filesys/file.c		# Files.
filesys_SRC += filesys/directory.c	# Directories.
filesys_SRC += filesys/inode.c		# File headers.
filesys_SRC += filesys/fsutil.c		# Utilities.

SOURCES = $(foreach dir,$(KERNEL_SUBDIRS),$($(dir)_SRC))
OBJECTS = $(patsubst %.c,%.o,$(patsubst %.S,%.o,$(SOURCES)))
DEPENDS = $(patsubst %.o,%.d,$(OBJECTS))

threads/kernel.lds.s: CPPFLAGS += -P
threads/kernel.lds.s: threads/kernel.lds.S threads/loader.h

LIBDIR_RUST = $(SRCDIR)/../kernel

LIB_RUST = libkernel-rs.a

$(LIB_RUST):
	make -C $(LIBDIR_RUST) debug
	cp $(LIBDIR_RUST)/target/debug/libkernel.a $@

kernel.o: threads/kernel.lds.s $(OBJECTS) $(LIB_RUST)
	$(LD) -T $< -o $@ $(OBJECTS) $(LIB_RUST)

kernel.bin: kernel.o
	$(OBJCOPY) -O binary -R .note -R .comment -S $< $@.tmp
	dd if=$@.tmp of=$@ bs=4096 conv=sync
	rm $@.tmp

threads/loader.o: threads/loader.S kernel.bin
	$(CC) -c $< -o $@ $(ASFLAGS) $(CPPFLAGS) $(DEFINES) -DKERNEL_LOAD_PAGES=`perl -e 'print +(-s "kernel.bin") / 4096;'`

loader.bin: threads/loader.o
	$(LD) -N -e start -Ttext 0x7c00 --oformat binary -o $@ $<

os.dsk: loader.bin kernel.bin
	cat $^ > $@

clean::
	make -C $(LIBDIR_RUST) clean
	rm -f $(OBJECTS) $(DEPENDS) 
	rm -f threads/loader.o threads/kernel.lds.s threads/loader.d
	rm -f kernel.o kernel.lds.s
	rm -f kernel.bin loader.bin os.dsk
	rm -f bochsout.txt bochsrc.txt
	rm -f results grade

Makefile: $(SRCDIR)/Makefile.build
	cp $< $@

-include $(DEPENDS)