CC := gcc DEFINES = -DOS_ABAOS OPT := -O0 INCLUDES = -I. -Ilibc -Ihardware -Idrivers -Idrivers/hdi -Idrivers/hdi/ps2 -Idrivers/video -Inet -Idrivers/net -Ikernel -Igui CFLAGS := -std=c99 -m32 -march=i486 -ffreestanding $(OPT) -g -Werror $(INCLUDES) $(DEFINES) LD := ld LDFLAGS := -m elf_i386 NASMFLAGS := -f elf32 NASM := nasm OBJCOPY := objcopy MAGIC := $(shell printf '%x' `date +%s`) TRUNCATE := truncate QEMU := qemu-system-i386 all: image.bin kernel.sym # truncate to correct number of sectors, we have # 512 (boot, stage 1) + N * 512 (N currenty is 5, stage 2) for boot.bin # + M * 512 (M is currently 169) for kernel.bin # (M + N + 1 is the number of sectors to be read in stage 2, as stage 1 # loads only the first sector, and stage 1 loads 5 sectors of stage 2, # adapt NOF_LOAD_SECTORS to 169) # then we make sure the image has the size of a 1.44 MB floppy # (emulators like qemu do some guess work for CHS resolution based # on the size of the image) image.bin: boot.bin kernel.bin magic.bin cat boot.bin kernel.bin > image.tmp $(TRUNCATE) -s 89088 image.tmp cat image.tmp magic.bin > image.bin $(TRUNCATE) -s 1474560 image.bin boot.bin: boot/boot.asm boot/boot_gdt.asm boot/stage1_functions.asm boot/stage2_real_functions.asm boot/stage2_pm_functions.asm boot/stage2_switch_mode.asm boot/stage2_a20.asm $(NASM) boot/boot.asm -DMAGIC='"$(MAGIC)"' -f bin -o boot.bin kernel.bin: kernel.elf $(OBJCOPY) -O binary kernel.elf kernel.bin kernel.sym: kernel.elf $(OBJCOPY) --only-keep-debug kernel.elf kernel.sym kernel.elf: kernel/entry.o kernel/kernel.o kernel/kernel_asm.o kernel/console.o kernel/vgatext.o kernel/serial.o kernel/memorymanagement.o kernel/tasks.o hardware/port.o hardware/port_asm.o hardware/interrupts.o hardware/interrupts_asm.o hardware/pci.o drivers/driver.o drivers/hdi/mouse.o drivers/hdi/keyboard.o drivers/hdi/ps2/ps2keyboard.o drivers/hdi/ps2/ps2mouse.o drivers/video/video.o drivers/video/vga.o drivers/video/vga_font.o net/ethernet.o net/arp.o net/ipv4.o drivers/net/network.o drivers/net/rtl8139.o gui/widget.o gui/composite_widget.o gui/window.o gui/desktop.o gui/text_widget.o libc/string.o libc/stdlib.o libc/stdio.o libc/setjmp.o $(LD) $(LDFLAGS) -o kernel.elf -N -n -Ttext 0x8800 -e kernel_entry --oformat elf32-i386 \ kernel/entry.o \ kernel/kernel.o kernel/kernel_asm.o \ kernel/console.o kernel/vgatext.o kernel/serial.o \ kernel/memorymanagement.o kernel/tasks.o \ hardware/port.o hardware/port_asm.o \ hardware/interrupts.o hardware/interrupts_asm.o \ hardware/pci.o \ net/ethernet.o net/arp.o net/ipv4.o \ drivers/driver.o \ drivers/hdi/mouse.o drivers/hdi/keyboard.o \ drivers/hdi/ps2/ps2keyboard.o drivers/hdi/ps2/ps2mouse.o \ drivers/video/video.o \ drivers/video/vga.o drivers/video/vga_font.o \ drivers/net/network.o \ drivers/net/rtl8139.o \ libc/string.o libc/stdlib.o libc/stdio.o libc/setjmp.o \ gui/widget.o gui/composite_widget.o gui/window.o \ gui/desktop.o gui/text_widget.o magic.bin: boot/magic.asm $(NASM) boot/magic.asm -DMAGIC='"$(MAGIC)"' -f bin -o magic.bin kernel/entry.o: kernel/entry.c $(CC) $(CFLAGS) -c -o kernel/entry.o kernel/entry.c kernel/kernel.o: kernel/kernel.c $(CC) $(CFLAGS) -c -o kernel/kernel.o kernel/kernel.c kernel/kernel_asm.o: kernel/kernel.asm $(NASM) kernel/kernel.asm $(NASMFLAGS) -o kernel/kernel_asm.o hardware/port.o: hardware/port.c hardware/port.h $(CC) $(CFLAGS) -c -o hardware/port.o hardware/port.c hardware/port_asm.o: hardware/port.asm $(NASM) hardware/port.asm $(NASMFLAGS) -o hardware/port_asm.o kernel/console.o: kernel/console.c kernel/console.h kernel/vgatext.h kernel/serial.h $(CC) $(CFLAGS) -c -o kernel/console.o kernel/console.c kernel/vgatext.o: kernel/vgatext.c kernel/vgatext.h $(CC) $(CFLAGS) -c -o kernel/vgatext.o kernel/vgatext.c kernel/serial.o: kernel/serial.c kernel/serial.h $(CC) $(CFLAGS) -c -o kernel/serial.o kernel/serial.c kernel/memorymanagement.o: kernel/memorymanagement.c kernel/memorymanagement.h $(CC) $(CFLAGS) -c -o kernel/memorymanagement.o kernel/memorymanagement.c kernel/tasks.o: kernel/tasks.c kernel/tasks.h $(CC) $(CFLAGS) -c -o kernel/tasks.o kernel/tasks.c hardware/interrupts.o: hardware/interrupts.c hardware/interrupts.h $(CC) $(CFLAGS) -c -o hardware/interrupts.o hardware/interrupts.c hardware/interrupts_asm.o: hardware/interrupts.asm $(NASM) hardware/interrupts.asm $(NASMFLAGS) -o hardware/interrupts_asm.o hardware/pci.o: hardware/pci.c hardware/pci.h $(CC) $(CFLAGS) -c -o hardware/pci.o hardware/pci.c network/ethernet.o: network/ethernet.c network/ethernet.h $(CC) $(CFLAGS) -c -o network/ethernet.o network/ethernet.c network/arp.o: network/arp.c network/arp.h $(CC) $(CFLAGS) -c -o network/arp.o network/arp.c network/ipv4.o: network/ipv4.c network/ipv4.h $(CC) $(CFLAGS) -c -o network/ipv4.o network/ipv4.c drivers/driver.o: drivers/driver.c drivers/driver.h $(CC) $(CFLAGS) -c -o drivers/driver.o drivers/driver.c drivers/hdi/mouse.o: drivers/hdi/mouse.c drivers/hdi/mouse.h $(CC) $(CFLAGS) -c -o drivers/hdi/mouse.o drivers/hdi/mouse.c drivers/hdi/keyboard.o: drivers/hdi/keyboard.c drivers/hdi/keyboard.h $(CC) $(CFLAGS) -c -o drivers/hdi/keyboard.o drivers/hdi/keyboard.c drivers/hdi/ps2/ps2keyboard.o: drivers/hdi/ps2/ps2keyboard.c drivers/hdi/ps2/ps2keyboard.h $(CC) $(CFLAGS) -c -o drivers/hdi/ps2/ps2keyboard.o drivers/hdi/ps2/ps2keyboard.c drivers/hdi/ps2/ps2mouse.o: drivers/hdi/ps2/ps2mouse.c drivers/hdi/ps2/ps2mouse.h $(CC) $(CFLAGS) -c -o drivers/hdi/ps2/ps2mouse.o drivers/hdi/ps2/ps2mouse.c drivers/video/video.o: drivers/video/video.c drivers/video/video.h $(CC) $(CFLAGS) -c -o drivers/video/video.o drivers/video/video.c drivers/video/vga.o: drivers/video/vga.c drivers/video/vga.h $(CC) $(CFLAGS) -c -o drivers/video/vga.o drivers/video/vga.c drivers/network/network.o: drivers/network/network.c drivers/network/network.h $(CC) $(CFLAGS) -c -o drivers/network/network.o drivers/network/network.c drivers/network/rtl8139.o: drivers/network/rtl8139.c drivers/network/rtl8139.h $(CC) $(CFLAGS) -c -o drivers/network/rtl8139.o drivers/network/rtl8139.c libc/string.o: libc/string.c libc/string.h $(CC) $(CFLAGS) -c -o libc/string.o libc/string.c libc/stdlib.o: libc/stdlib.c libc/stdlib.h $(CC) $(CFLAGS) -c -o libc/stdlib.o libc/stdlib.c libc/stdio.o: libc/stdio.c libc/stdio.h $(CC) $(CFLAGS) -c -o libc/stdio.o libc/stdio.c libc/setjmp.o: libc/setjmp.asm $(NASM) libc/setjmp.asm $(NASMFLAGS) -o libc/setjmp.o gui/widget.o: gui/widget.c gui/widget.h $(CC) $(CFLAGS) -c -o gui/widget.o gui/widget.c gui/composite_widget.o: gui/composite_widget.c gui/composite_widget.h $(CC) $(CFLAGS) -c -o gui/composite_widget.o gui/composite_widget.c gui/window.o: gui/window.c gui/window.h $(CC) $(CFLAGS) -c -o gui/window.o gui/window.c gui/desktop.o: gui/desktop.c gui/desktop.h $(CC) $(CFLAGS) -c -o gui/desktop.o gui/desktop.c gui/text_widget.o: gui/text_widget.c gui/text_widget.h $(CC) $(CFLAGS) -c -o gui/text_widget.o gui/text_widget.c clean: -rm -f boot.bin kernel.bin kernel.sym kernel.elf image.bin magic.bin boot.map image.tmp \ serial.log \ libc/*.o hardware/*.o kernel/*.o \ drivers/*.o drivers/*/*.o drivers/*/*/*.o gui/*.o run-qemu-hd: image.bin $(QEMU) -cpu 486 -usb -netdev user,id=net0,net=10.0.0.0/24,host=10.0.0.2,dhcpstart=10.0.0.16 -device rtl8139,netdev=net0-d guest_errors -m 32 -drive "file=image.bin,if=ide,format=raw" \ -serial file:serial.log run-qemu-usb: image.bin $(QEMU) -cpu 486 -usb -netdev user,id=net0,net=10.0.0.0/24,host=10.0.0.2,dhcpstart=10.0.0.16 -device rtl8139,netdev=net0-d guest_errors -m 32 -usb -usbdevice disk:/dev/sde \ -serial file:serial.log run-qemu: image.bin $(QEMU) -cpu 486 -usb \ -netdev user,id=net0,net=10.0.0.0/24,host=10.0.0.2,dhcpstart=10.0.0.16,hostfwd=tcp::8080-:80,hostfwd=udp::8081-:81 \ -device rtl8139,netdev=net0 \ -object filter-dump,id=net0,netdev=net0,file=network.log \ -d guest_errors -m 32 -drive "file=image.bin,if=floppy,format=raw" \ -serial file:serial.log run-qemu-debug: image.bin $(QEMU) -cpu 486 -usb \ -netdev user,id=net0,net=10.0.0.0/24,host=10.0.0.2,dhcpstart=10.0.0.16,hostfwd=tcp::8080-:80,hostfwd=udp::8081-:81 \ -device rtl8139,netdev=net0 \ -object filter-dump,id=net0,netdev=net0,file=network.log \ -S -s -d guest_errors -m 32 -drive "file=image.bin,if=floppy,format=raw" \ -serial file:serial.log run-bochs: bochs -q -f bochs.config 'boot:floppy' 'floppya: 1_44=image.bin, status=inserted' run-bochs-hd: bochs -q -f bochs.config 'boot:disk' 'ata0-master: type=disk, path=image.bin, mode=flat, cylinders=64, heads=4, spt=8, translation=none'