diff --git a/src/Makefile b/src/Makefile index 28f589f..7fd1bcf 100644 --- a/src/Makefile +++ b/src/Makefile @@ -1,66 +1,78 @@ -CC= i686-elf-gcc -ASMFILES = arch/i386/boot.asm -CFILES = kernel.c vga.c +ARCH=i386 +CC=i686-elf-gcc + +BUILDDIR=build + +ASMFILES=$(wildcard arch/$(ARCH)/*.asm) +ASMOBJS=$(patsubst %.asm, $(BUILDDIR)/%.o, $(ASMFILES)) + +CFILES=$(wildcard *.c) +COBJS=$(patsubst %.c, $(BUILDDIR)/%.o, $(CFILES)) + +LIBKFILES=$(wildcard libk/*.c) +LIBKOBJS=$(patsubst %.c, $(BUILDDIR)/%.o, $(LIBKFILES)) INCLUDEFLAGS=-Iinclude -Ilibk/include DEBUGFLAGS= CFLAGS=-std=c99 -ffreestanding -fstack-protector-all $(INCLUDEFLAGS) $(DEBUGFLAGS) -Wall -Wextra -CRTI_OBJ = build/crti.o +CRTI_OBJ = $(BUILDDIR)/arch/$(ARCH)/crti.o CRTBEGIN_OBJ:=$(shell $(CC) $(CFLAGS) -print-file-name=crtbegin.o) CRTEND_OBJ:=$(shell $(CC) $(CFLAGS) -print-file-name=crtend.o) -CRTN_OBJ = build/crtn.o - -LIBKOBJFILES = build/libk/string.o build/libk/stdio.o build/libk/stdlib.o build/libk/stack_protector.o build/libk/asm.o +CRTN_OBJ = $(BUILDDIR)/arch/$(ARCH)/crtn.o OBJFILES = \ $(CRTI_OBJ) \ $(CRTBEGIN_OBJ) \ -build/boot.o \ -$(LIBKOBJFILES) \ -build/early_kernel.o \ -build/kernel.o \ -build/vga.o \ -build/idt.o \ -build/paging.o \ -$(CRTEND_OBJ) $(CRTN_OBJ) +$(BUILDDIR)/arch/$(ARCH)/boot.o \ +$(LIBKOBJS) \ +$(COBJS) \ +$(CRTEND_OBJ) \ +$(CRTN_OBJ) -KERNELFILE = build/orion.bin +DIRS = $(BUILDDIR)/arch/$(ARCH) $(BUILDDIR)/libk +KERNELFILE = $(BUILDDIR)/orion.bin +ISOFILE = $(BUILDDIR)/orion.iso -all: - mkdir -p build +.PHONY: all makedirs build link run run-grub clean + +all: makedirs build link + +makedirs $(DIRS): + mkdir -p build/arch/$(ARCH) mkdir -p build/libk - i686-elf-gcc -c libk/string.c -o build/libk/string.o $(CFLAGS) - i686-elf-gcc -c libk/stdio.c -o build/libk/stdio.o $(CFLAGS) - i686-elf-gcc -c libk/stdlib.c -o build/libk/stdlib.o $(CFLAGS) - i686-elf-gcc -c libk/stack_protector.c -o build/libk/stack_protector.o $(CFLAGS) - i686-elf-gcc -c libk/asm.c -o build/libk/asm.o $(CFLAGS) - nasm arch/i386/boot.asm -f elf32 -o build/boot.o - nasm arch/i386/crti.asm -f elf32 -o build/crti.o - nasm arch/i386/crtn.asm -f elf32 -o build/crtn.o - - i686-elf-gcc -c vga.c -o build/vga.o $(CFLAGS) - i686-elf-gcc -c idt.c -o build/idt.o $(CFLAGS) - i686-elf-gcc -c paging.c -o build/paging.o $(CFLAGS) - i686-elf-gcc -c kernel.c -o build/kernel.o $(CFLAGS) - i686-elf-gcc -c early_kernel.c -o build/early_kernel.o $(CFLAGS) +build: $(ASMOBJS) $(COBJS) $(LIBKOBJS) + +link: + $(CC) -T linker.ld -o $(KERNELFILE) $(CFLAGS) -nostdlib $(OBJFILES) -lgcc + +$(BUILDDIR)/%.o: %.asm + nasm -f elf32 $< -o $@ + +$(BUILDDIR)/%.o: %.c + $(CC) -c $< -o $@ $(CFLAGS) -lgcc + +$(BUILDDIR)/%.o: libk/%.c + $(CC) -c $< -o $@ $(CFLAGS) -lgcc + +clean: + rm -rf $(BUILDDIR)/* - i686-elf-gcc -T linker.ld -o $(KERNELFILE) $(CFLAGS) -nostdlib $(OBJFILES) -lgcc run: - qemu-system-i386 -kernel $(KERNELFILE) -serial stdio -S -s + qemu-system-$(ARCH) -kernel $(KERNELFILE) -serial stdio -S -s run-grub: - mkdir -p build/isodir - mkdir -p build/isodir/boot - mkdir -p build/isodir/boot/grub + mkdir -p $(BUILDDIR)/isodir + mkdir -p $(BUILDDIR)/isodir/boot + mkdir -p $(BUILDDIR)/isodir/boot/grub - cp build/orion.bin build/isodir/boot/orion.kernel + cp $(KERNELFILE) $(BUILDDIR)/isodir/boot/orion.kernel - echo 'menuentry "orion" { ' > build/isodir/boot/grub/grub.cfg - echo ' multiboot /boot/orion.kernel' >> build/isodir/boot/grub/grub.cfg - echo '}' >> build/isodir/boot/grub/grub.cfg + echo 'menuentry "orion" { ' > $(BUILDDIR)/isodir/boot/grub/grub.cfg + echo ' multiboot /boot/orion.kernel' >> $(BUILDDIR)/isodir/boot/grub/grub.cfg + echo '}' >> $(BUILDDIR)/isodir/boot/grub/grub.cfg - grub-mkrescue -o build/orion.iso build/isodir - qemu-system-i386 -cdrom build/orion.iso -serial stdio -S -s + grub-mkrescue -o $(ISOFILE) $(BUILDDIR)/isodir + qemu-system-$(ARCH) -cdrom $(BUILDDIR)/orion.iso -serial stdio -S -s