7CFLAGS = -m32 -std=c99 -pedantic-errors -fno-asm -ffreestanding -nostdlib -nostdinc -fno-stack-protector \
8 -fno-builtin -fno-omit-frame-pointer -static -I src -fno-pic \
9 -g2 -ggdb -gdwarf-2 -O0 -fasynchronous-unwind-tables \
10 -Wnull-dereference -Wtrampolines -Wfloat-equal \
11 -Wunsafe-loop-optimizations \
12 -fno-strict-aliasing -fno-strict-overflow -fno-delete-null-pointer-checks -fno-ident -fno-common \
13 -fvar-tracking-assignments -fno-merge-constants \
14 -Wno-unused-parameter -Wswitch-enum -Wswitch-default -Wredundant-decls -Wpacked \
15 -Wold-style-definition -Wmissing-field-initializers -Waggregate-return \
16 -Wall -Wextra -Wpedantic -Wshadow -Wundef -Werror -Wc11-c23-compat -Wc99-c11-compat \
17 -Wstrict-prototypes -Wmissing-prototypes -Wpointer-arith -Wdouble-promotion \
18 -Wwrite-strings -Wcast-align -Wcast-qual \
19 -Wconversion -Wsign-conversion -Wunused -Wformat=2 -Wvla \
20 -Wstack-usage=16384 -fstack-usage
21LDFLAGS = -m elf_i386 -T linker.ld -static -nostdlib \
22 -z max-page-size=0x1000 -z separate-code --gc-sections \
23 -z noexecstack -z relro -z now \
24 -Map=build/kernel.map \
25 --warn-common --warn-unresolved-symbols \
26 --no-undefined --no-undefined-version --check-sections \
27 --no-warn-rwx-segments --fatal-warnings
28AFLAGS = --32 -g --gdwarf-2 --noexecstack \
31QEMU_FLAGS = -cpu 486 -m 3.8M -vga std
35ISO_DIR = $(BUILD_DIR)/iso
36DISK_IMG = $(BUILD_DIR)/disk.img
41ISOLINUX_BIN := syslinux/isolinux.bin
42LDLINUX_C32 := syslinux/ldlinux.c32
43MBOOT_C32 := syslinux/mboot.c32
44LIBCOM_C32 := syslinux/libcom32.c32
46C_SRCS = $(shell find $(SRC_DIR) -name "*.c")
47ASM_SRCS = $(shell find $(SRC_DIR) -name "*.s")
48OBJS = $(C_SRCS:$(SRC_DIR)/%.c=$(BUILD_DIR)/%.o) \
49 $(ASM_SRCS:$(SRC_DIR)/%.s=$(BUILD_DIR)/%.o)
51KERNEL = $(BUILD_DIR)/tape.elf
58 ECHO_CC = @echo " [ CC ] $< -> $@"
59 ECHO_AS = @echo " [ AS ] $< -> $@"
60 ECHO_LD = @echo " [ LD ] linking kernel..."
61 ECHO_MKDIR = @echo " [ DR ] creating build dirs..."
62 ECHO_CP = @echo " [ CP ] copying files..."
63 ECHO_ISO = @echo " [ IO ] creating iso image..."
74all: $(BUILD_DIR) $(KERNEL)
78 $(Q)mkdir -p $(BUILD_DIR)
79 $(Q)cd $(BUILD_DIR) && mkdir -p $(shell find $(SRC_DIR) -type d | sed 's|$(SRC_DIR)/||')
82 $(Q)dd if=/dev/zero of=$(DISK_IMG) bs=1k count=1440 2>/dev/null
83 $(Q)mkfs.vfat -F 12 $(DISK_IMG) >/dev/null 2>&1
84 @echo " [ OK ] $(DISK_IMG) $$(ls -lh $(DISK_IMG) | awk '{print $$5}')"
86$(BUILD_DIR)/%.o: $(SRC_DIR)/%.c | $(BUILD_DIR)
88 $(Q)$(CC) $(CFLAGS) -c $< -o $@
90$(BUILD_DIR)/%.o: $(SRC_DIR)/%.s | $(BUILD_DIR)
92 $(Q)$(AS) $(AFLAGS) $< -o $@
93 $(Q)if [ -f $@ ]; then echo " [ OK ] $@ $$(ls -lh $@ | awk '{print $$5}')"; fi
97 $(Q)$(LD) $(LDFLAGS) $^ -o $@
98 @echo " [ OK ] $(KERNEL) $$(ls -lh $(KERNEL) | awk '{print $$5}')"
100$(ISO_DIR)/isolinux.cfg:
101 $(Q)mkdir -p $(ISO_DIR)
102 $(Q)echo "DEFAULT tape" > $@
103 $(Q)echo "LABEL tape" >> $@
104 $(Q)echo " KERNEL mboot.c32" >> $@
105 $(Q)echo " APPEND /tape.elf" >> $@
107iso: $(KERNEL) $(ISO_DIR)/isolinux.cfg $(DISK_IMG)
109 $(Q)cp $(KERNEL) $(ISO_DIR)/tape.elf
110 $(Q)cp $(ISOLINUX_BIN) $(ISO_DIR)/
111 $(Q)cp $(LDLINUX_C32) $(ISO_DIR)/
112 $(Q)cp $(MBOOT_C32) $(ISO_DIR)/
113 $(Q)cp $(LIBCOM_C32) $(ISO_DIR)/
114 @echo " [ OK ] kernel and boot files copied"
116 $(Q)xorriso -as mkisofs \
122 -o $(ISO) $(ISO_DIR) >/dev/null 2>&1
123 @echo " [ OK ] $(ISO) $$(ls -lh $(ISO) | awk '{print $$5}')"
125 @echo " [ OK ] build complete"
126 @echo " kernel: $$(ls -lh $(KERNEL) | awk '{print $$5}')"
127 @echo " iso: $$(ls -lh $(ISO) | awk '{print $$5}')"
128 @echo " disk: $$(ls -lh $(DISK_IMG) | awk '{print $$5}')"
131 @echo " [ RN ] starting qemu..."
132 $(Q)qemu-system-i386 $(QEMU_FLAGS) -drive file=$(DISK_IMG),format=raw -cdrom $(ISO) -boot d -vnc none -display gtk
135 @echo " [ DG ] starting qemu with gdb server on port 1234..."
136 $(Q)qemu-system-i386 $(QEMU_FLAGS) -drive file=$(DISK_IMG),format=raw -cdrom $(ISO) -boot d -s -S --no-reboot --no-shutdown -vnc none -display gtk
139 @echo " [ CN ] cleaning build artifacts..."
140 $(Q)rm -rf $(BUILD_DIR) $(ISO)
141 @echo " [ OK ] clean complete"
144 @echo " [ DC ] generating docs..."
145 $(Q)$(DOXYGEN) $(DOXYFILE)
146 @echo " [ OK ] docs generated in $(DOCS_DIR)"
149 @echo " [ CN ] cleaning docs..."
150 $(Q)rm -rf $(DOCS_DIR)
151 @echo " [ OK ] docs cleaned"
154 @echo " make iso - build kernel iso"
155 @echo " make run - Run in qemu"
156 @echo " make debug - run with gdb debugging"
157 @echo " make clean - clean build files"
158 @echo " make docs - generate documentation"
159 @echo " make docs-clean - clean documentation"
160 @echo " make help - show this help"
162 @echo " verbose build: make VERBOSE=1 ..."
164.PHONY: all iso run clean debug docs docs-clean help