orion/src/Makefile

79 lines
1.9 KiB
Makefile

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 = $(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 = $(BUILDDIR)/arch/$(ARCH)/crtn.o
OBJFILES = \
$(CRTI_OBJ) \
$(CRTBEGIN_OBJ) \
$(BUILDDIR)/arch/$(ARCH)/boot.o \
$(LIBKOBJS) \
$(COBJS) \
$(CRTEND_OBJ) \
$(CRTN_OBJ)
DIRS = $(BUILDDIR)/arch/$(ARCH) $(BUILDDIR)/libk
KERNELFILE = $(BUILDDIR)/orion.bin
ISOFILE = $(BUILDDIR)/orion.iso
.PHONY: all makedirs build link run run-grub clean
all: makedirs build link
makedirs $(DIRS):
mkdir -p build/arch/$(ARCH)
mkdir -p build/libk
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)/*
run:
qemu-system-$(ARCH) -kernel $(KERNELFILE) -serial stdio -S -s
run-grub:
mkdir -p $(BUILDDIR)/isodir
mkdir -p $(BUILDDIR)/isodir/boot
mkdir -p $(BUILDDIR)/isodir/boot/grub
cp $(KERNELFILE) $(BUILDDIR)/isodir/boot/orion.kernel
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 $(ISOFILE) $(BUILDDIR)/isodir
qemu-system-$(ARCH) -cdrom $(BUILDDIR)/orion.iso -serial stdio -S -s