You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
88 lines
2.5 KiB
88 lines
2.5 KiB
# Used to generated .d file that deal with header dependencies |
|
CPPFLAGS = -MMD |
|
AS=nasm |
|
ASFLAGS += -f elf32 |
|
LDFLAGS += -m elf_i386 |
|
CFLAGS += -m32 -Wall -Wextra -Werror -ffreestanding -fno-exceptions -fno-pie -fno-stack-protector -fno-tree-vectorize -D__KERNEL__ |
|
CXXFLAGS += -m32 -Wall -Wextra -Werror -ffreestanding -fno-exceptions -fno-rtti -fno-pie |
|
DEBUG_FLAGS += -g -Og -DDEBUG -fno-omit-frame-pointer -fno-inline |
|
LIBGCC = $(shell $(CC) -print-libgcc-file-name $(CFLAGS)) |
|
|
|
QEMU_OPT += -hda disk.img |
|
ARCH?=x86 |
|
SUBDIRS := core drivers tests arch/$(ARCH) |
|
|
|
INCDIRS += $(foreach dir, $(SUBDIRS), -I$(dir)) |
|
CPPFLAGS += $(INCDIRS) |
|
|
|
asmsrc= |
|
asmobj=$(asmsrc:%.asm=%.o) |
|
gasmsrc=$(wildcard arch/$(ARCH)/*.S arch/$(ARCH)/boot/*.S) |
|
gasmobj=$(gasmsrc:%.S=%.o) |
|
csrc=$(shell find $(SUBDIRS) -type f -name "*.c")# $(wildcard *.c) |
|
cobj=$(csrc:%.c=%.o) |
|
deps=$(csrc:%.c=%.d) $(gasmsrc:%.S=%.d) |
|
|
|
kernel kernel.sym &: $(asmobj) $(gasmobj) $(cobj) linker.ld |
|
$(LD) $(LDFLAGS) $(asmobj) $(gasmobj) $(cobj) -o kernel -T linker.ld $(LIBGCC) |
|
objcopy --only-keep-debug kernel kernel.sym |
|
objcopy --strip-debug kernel |
|
objcopy --add-gnu-debuglink=kernel.sym kernel |
|
|
|
fd.iso: kernel |
|
mkdir -p isodir/boot/grub |
|
cp $< isodir/boot/ |
|
@printf "menuentry \"myos\" {\n\tmultiboot /boot/kernel\n}" > isodir/boot/grub/grub.cfg |
|
grub-mkrescue -o $@ isodir |
|
|
|
userspace: FORCE |
|
$(MAKE) -C userspace |
|
|
|
FORCE: |
|
@ |
|
|
|
disk.img: disk.sfdisk userspace |
|
qemu-img create -f raw $@ 32M |
|
sfdisk $@ < $< |
|
# Before having filesystem support, just dump the user prog into the first partition |
|
strip userspace/user -o userspace/user.strip |
|
$(eval file_size:=$(shell du -b userspace/user.strip|awk '{print $$1}' | xargs printf "%016d" )) \ |
|
sed '1s/^/$(file_size)/' userspace/user.strip | dd of=disk.img seek=2048 bs=512 |
|
|
|
# NASM without preprocessing |
|
%.o:%.asm |
|
$(AS) $(ASFLAGS) -o $@ $< |
|
|
|
#GNU GAS ASM with C Preprocessing |
|
%.o: %.S |
|
$(CC) $(CFLAGS) $(CPPFLAGS) -c "$<" -o "$@" |
|
|
|
|
|
test: CFLAGS += -DRUN_TEST |
|
test: clean kernel disk.img |
|
qemu-system-x86_64 -kernel kernel -serial stdio -m 32M $(QEMU_OPT) |
|
|
|
run:kernel disk.img |
|
qemu-system-x86_64 -kernel $< $(QEMU_OPT) |
|
|
|
debug: CFLAGS += $(DEBUG_FLAGS) |
|
debug: CXXFLAGS += $(DEBUG_FLAGS) |
|
debug:kernel kernel.sym disk.img |
|
gdb -q -x debug.gdb |
|
|
|
debug_test: CFLAGS += $(DEBUG_FLAGS) -DRUN_TEST |
|
debug_test: debug |
|
|
|
screenshot: |
|
shutter --window=qemu -o screenshot_1.png -e && zopflipng screenshot_1.png screenshot_1.png |
|
|
|
clean: |
|
$(RM) kernel $(asmobj) $(gasmobj) $(cobj) $(deps) fd.iso kernel.sym |
|
$(RM) -r isodir |
|
|
|
.PHONY: |
|
userspace screenshot |
|
|
|
ifneq ($(MAKECMDGOALS),clean) |
|
-include $(deps) |
|
endif
|
|
|