268 lines
12 KiB
Makefile
268 lines
12 KiB
Makefile
#=----------------------------------------------------------------------------=#
|
|
# GNU GPL OS/K #
|
|
# #
|
|
# Desc: Project Makefile #
|
|
# #
|
|
# #
|
|
# Copyright © 2018-2019 The OS/K Team #
|
|
# #
|
|
# This file is part of OS/K. #
|
|
# #
|
|
# OS/K is free software: you can redistribute it and/or modify #
|
|
# it under the terms of the GNU General Public License as published by #
|
|
# the Free Software Foundation, either version 3 of the License, or #
|
|
# any later version. #
|
|
# #
|
|
# OS/K is distributed in the hope that it will be useful, #
|
|
# but WITHOUT ANY WARRANTY# without even the implied warranty of #
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
|
|
# GNU General Public License for more details. #
|
|
# #
|
|
# You should have received a copy of the GNU General Public License #
|
|
# along with OS/K. If not, see <https://www.gnu.org/licenses/>. #
|
|
#=----------------------------------------------------------------------------=#
|
|
|
|
## VARIABLES ----------------------------------------------------------------- #
|
|
|
|
#Programs
|
|
ASM=nasm
|
|
LD=ld
|
|
CCNAME=x86_64-elf-gcc
|
|
|
|
ASMFLAGS=-f elf64
|
|
LDFLAGS=-melf_x86_64
|
|
COPTIM=-O2
|
|
CWARNS=-Wall -Wextra -Werror=implicit-function-declaration
|
|
CINCLUDES=-Ikaleid/include
|
|
CFLAGS1=-nostdlib -ffreestanding -mcmodel=large -std=gnu11
|
|
CFLAGS2= -c -mno-red-zone -mno-mmx -mno-sse -mno-sse2 -fno-strict-aliasing
|
|
CFLAGS=$(CFLAGS1) $(CFLAGS2)
|
|
KCC=$(CCNAME) $(COPTIM) $(CWARNS) $(CFLAGS) $(CINCLUDES) -D_OSK_SOURCE -D_KALEID_KERNEL
|
|
|
|
#Folders
|
|
MBRDIR=boot/grub
|
|
LOADERDIR=boot/loader
|
|
KERNELDIR=kaleid
|
|
OBJDIR=build/obj
|
|
KOBJDIR=build/obj/kaleid
|
|
LOBJDIR=build/obj/boot
|
|
BINDIR=build/bin
|
|
|
|
#Color codes
|
|
CL='\033[0;32m'
|
|
CL2='\033[1;36m'
|
|
CL3='\033[0m'
|
|
NC='\033[1;37m'
|
|
|
|
|
|
.PHONY: all
|
|
all : OS/K
|
|
|
|
## KALEID MAKEFILE ----------------------------------------------------------- #
|
|
|
|
# Common objects
|
|
kal_com_obj= $(KOBJDIR)/atoi.o $(KOBJDIR)/ctype.o \
|
|
$(KOBJDIR)/itoa.o $(KOBJDIR)/mem.o \
|
|
$(KOBJDIR)/rand.o $(KOBJDIR)/sprintf.o \
|
|
$(KOBJDIR)/status.o $(KOBJDIR)/string.o \
|
|
$(KOBJDIR)/strtol.o $(KOBJDIR)/argv.o \
|
|
$(KOBJDIR)/prog.o $(KOBJDIR)/atol.o \
|
|
$(KOBJDIR)/atou.o $(KOBJDIR)/atoul.o \
|
|
$(KOBJDIR)/utoa.o $(KOBJDIR)/ltoa.o \
|
|
$(KOBJDIR)/ultoa.o
|
|
|
|
$(KOBJDIR)/atoi.o: $(KERNELDIR)/crtlib/atoi.c $(KERNELDIR)/include/*/*.h
|
|
@$(KCC) -D_NEED_ATOI $< -o $@
|
|
@echo ${CL2}[$@] ${CL}Compiled.${CL3}
|
|
$(KOBJDIR)/atol.o: $(KERNELDIR)/crtlib/atoi.c $(KERNELDIR)/include/*/*.h
|
|
@$(KCC) -D_NEED_ATOL $< -o $@
|
|
@echo ${CL2}[$@] ${CL}Compiled.${CL3}
|
|
$(KOBJDIR)/atou.o: $(KERNELDIR)/crtlib/atoi.c $(KERNELDIR)/include/*/*.h
|
|
@$(KCC) -D_NEED_ATOU $< -o $@
|
|
@echo ${CL2}[$@] ${CL}Compiled.${CL3}
|
|
$(KOBJDIR)/atoul.o: $(KERNELDIR)/crtlib/atoi.c $(KERNELDIR)/include/*/*.h
|
|
@$(KCC) -D_NEED_ATOUL $< -o $@
|
|
@echo ${CL2}[$@] ${CL}Compiled.${CL3}
|
|
$(KOBJDIR)/ctype.o: $(KERNELDIR)/crtlib/ctype.c $(KERNELDIR)/include/*/*.h
|
|
@$(KCC) $< -o $@
|
|
@echo ${CL2}[$@] ${CL}Compiled.${CL3}
|
|
$(KOBJDIR)/itoa.o: $(KERNELDIR)/crtlib/itoa.c $(KERNELDIR)/include/*/*.h
|
|
@$(KCC) -D_NEED_ITOA $< -o $@
|
|
@echo ${CL2}[$@] ${CL}Compiled.${CL3}
|
|
$(KOBJDIR)/ltoa.o: $(KERNELDIR)/crtlib/itoa.c $(KERNELDIR)/include/*/*.h
|
|
@$(KCC) -D_NEED_LTOA $< -o $@
|
|
@echo ${CL2}[$@] ${CL}Compiled.${CL3}
|
|
$(KOBJDIR)/utoa.o: $(KERNELDIR)/crtlib/itoa.c $(KERNELDIR)/include/*/*.h
|
|
@$(KCC) -D_NEED_UTOA $< -o $@
|
|
@echo ${CL2}[$@] ${CL}Compiled.${CL3}
|
|
$(KOBJDIR)/ultoa.o: $(KERNELDIR)/crtlib/itoa.c $(KERNELDIR)/include/*/*.h
|
|
@$(KCC) -D_NEED_ULTOA $< -o $@
|
|
@echo ${CL2}[$@] ${CL}Compiled.${CL3}
|
|
$(KOBJDIR)/mem.o: $(KERNELDIR)/crtlib/mem.c $(KERNELDIR)/include/*/*.h
|
|
@$(KCC) -fno-strict-aliasing $< -o $@
|
|
@echo ${CL2}[$@] ${CL}Compiled.${CL3}
|
|
$(KOBJDIR)/rand.o: $(KERNELDIR)/crtlib/rand.c $(KERNELDIR)/include/*/*.h
|
|
@$(KCC) $< -o $@
|
|
@echo ${CL2}[$@] ${CL}Compiled.${CL3}
|
|
$(KOBJDIR)/sprintf.o: $(KERNELDIR)/crtlib/sprintf.c $(KERNELDIR)/include/*/*.h
|
|
@$(KCC) $< -o $@
|
|
@echo ${CL2}[$@] ${CL}Compiled.${CL3}
|
|
$(KOBJDIR)/status.o: $(KERNELDIR)/crtlib/status.c $(KERNELDIR)/include/*/*.h
|
|
@$(KCC) $< -o $@
|
|
@echo ${CL2}[$@] ${CL}Compiled.${CL3}
|
|
$(KOBJDIR)/string.o: $(KERNELDIR)/crtlib/string.c $(KERNELDIR)/include/*/*.h
|
|
@$(KCC) $< -o $@
|
|
@echo ${CL2}[$@] ${CL}Compiled.${CL3}
|
|
$(KOBJDIR)/strtol.o: $(KERNELDIR)/crtlib/strtol.c $(KERNELDIR)/include/*/*.h
|
|
@$(KCC) $< -o $@
|
|
@echo ${CL2}[$@] ${CL}Compiled.${CL3}
|
|
$(KOBJDIR)/argv.o: $(KERNELDIR)/extras/argv.c $(KERNELDIR)/include/*/*.h
|
|
@$(KCC) $< -o $@
|
|
@echo ${CL2}[$@] ${CL}Compiled.${CL3}
|
|
$(KOBJDIR)/prog.o: $(KERNELDIR)/extras/prog.c $(KERNELDIR)/include/*/*.h
|
|
@$(KCC) $< -o $@
|
|
@echo ${CL2}[$@] ${CL}Compiled.${CL3}
|
|
|
|
# Kernel objects
|
|
kal_kern_obj= $(KOBJDIR)/kernel/cpuid.o $(KOBJDIR)/kernel/init.o \
|
|
$(KOBJDIR)/kernel/table.o $(KOBJDIR)/kernel/cursor.o \
|
|
$(KOBJDIR)/kernel/term.o $(KOBJDIR)/kernel/vga.o \
|
|
$(KOBJDIR)/kernel/panic.o $(KOBJDIR)/kernel/map.o \
|
|
$(KOBJDIR)/kernel/heap.o $(KOBJDIR)/kernel/malloc.o \
|
|
$(KOBJDIR)/kernel/buf.o $(KOBJDIR)/kernel/sched.o \
|
|
$(KOBJDIR)/kernel/bput.o $(KOBJDIR)/kernel/bprint.o \
|
|
$(KOBJDIR)/kernel/gdt.o $(KOBJDIR)/kernel/gdt.o
|
|
|
|
$(KOBJDIR)/kernel/cpuid.o: $(KERNELDIR)/kernel/cpu/cpuid.c $(KERNELDIR)/include/*/*.h
|
|
@$(KCC) $< -o $@
|
|
@echo ${CL2}[$@] ${CL}Compiled.${CL3}
|
|
$(KOBJDIR)/kernel/idt.o: $(KERNELDIR)/kernel/cpu/idt.c $(KERNELDIR)/include/*/*.h
|
|
@$(KCC) $< -o $@
|
|
@echo ${CL2}[$@] ${CL}Compiled.${CL3}
|
|
$(KOBJDIR)/kernel/init.o: $(KERNELDIR)/kernel/init/init.c $(KERNELDIR)/include/*/*.h
|
|
@$(KCC) $< -o $@
|
|
@echo ${CL2}[$@] ${CL}Compiled.${CL3}
|
|
$(KOBJDIR)/kernel/table.o: $(KERNELDIR)/kernel/init/table.c $(KERNELDIR)/include/*/*.h
|
|
@$(KCC) $< -o $@
|
|
@echo ${CL2}[$@] ${CL}Compiled.${CL3}
|
|
$(KOBJDIR)/kernel/cursor.o: $(KERNELDIR)/kernel/io/cursor.c $(KERNELDIR)/include/*/*.h
|
|
@$(KCC) $< -o $@
|
|
@echo ${CL2}[$@] ${CL}Compiled.${CL3}
|
|
$(KOBJDIR)/kernel/term.o: $(KERNELDIR)/kernel/io/term.c $(KERNELDIR)/include/*/*.h
|
|
@$(KCC) $< -o $@
|
|
@echo ${CL2}[$@] ${CL}Compiled.${CL3}
|
|
$(KOBJDIR)/kernel/vga.o: $(KERNELDIR)/kernel/io/vga.c $(KERNELDIR)/include/*/*.h
|
|
@$(KCC) $< -o $@
|
|
@echo ${CL2}[$@] ${CL}Compiled.${CL3}
|
|
$(KOBJDIR)/kernel/panic.o: $(KERNELDIR)/kernel/ke/panic.c $(KERNELDIR)/include/*/*.h
|
|
@$(KCC) $< -o $@
|
|
@echo ${CL2}[$@] ${CL}Compiled.${CL3}
|
|
$(KOBJDIR)/kernel/map.o: $(KERNELDIR)/kernel/mm/map.c $(KERNELDIR)/include/*/*.h
|
|
@$(KCC) $< -o $@
|
|
@echo ${CL2}[$@] ${CL}Compiled.${CL3}
|
|
$(KOBJDIR)/kernel/heap.o: $(KERNELDIR)/kernel/mm/heap.c $(KERNELDIR)/include/*/*.h
|
|
@$(KCC) $< -o $@
|
|
@echo ${CL2}[$@] ${CL}Compiled.${CL3}
|
|
$(KOBJDIR)/kernel/malloc.o: $(KERNELDIR)/kernel/mm/malloc.c $(KERNELDIR)/include/*/*.h
|
|
@$(KCC) $< -o $@
|
|
$(KOBJDIR)/kernel/gdt.o: $(KERNELDIR)/kernel/mm/gdt.c $(KERNELDIR)/include/*/*.h
|
|
@$(KCC) $< -o $@
|
|
@echo ${CL2}[$@] ${CL}Compiled.${CL3}
|
|
$(KOBJDIR)/kernel/buf.o: $(KERNELDIR)/kernel/buf/buf.c $(KERNELDIR)/include/*/*.h
|
|
@$(KCC) $< -o $@
|
|
@echo ${CL2}[$@] ${CL}Compiled.${CL3}
|
|
$(KOBJDIR)/kernel/bput.o: $(KERNELDIR)/kernel/buf/bput.c $(KERNELDIR)/include/*/*.h
|
|
@$(KCC) $< -o $@
|
|
@echo ${CL2}[$@] ${CL}Compiled.${CL3}
|
|
$(KOBJDIR)/kernel/bprint.o: $(KERNELDIR)/kernel/buf/bprint.c $(KERNELDIR)/include/*/*.h
|
|
@$(KCC) $< -o $@
|
|
@echo ${CL2}[$@] ${CL}Compiled.${CL3}
|
|
$(KOBJDIR)/kernel/sched.o: $(KERNELDIR)/kernel/proc/sched.c $(KERNELDIR)/include/*/*.h
|
|
@$(KCC) $< -o $@
|
|
@echo ${CL2}[$@] ${CL}Compiled.${CL3}
|
|
|
|
|
|
## MISC MAKEFILE ------------------------------------------------------------- #
|
|
./ProjectTree: ./.stylehlp_sh
|
|
@cat ./.stylehlp_sh > ./ProjectTree
|
|
@echo "\n" >> ./ProjectTree
|
|
@tree --dirsfirst >> ./ProjectTree
|
|
@echo ${CL2}[$@] ${CL}Generated.${CL3}
|
|
## MAIN MAKEFILE ------------------------------------------------------------- #
|
|
|
|
.PHONY: test
|
|
test: all
|
|
@qemu-system-x86_64 -m 5G -mem-prealloc -hda build/bin/disk.img \
|
|
-d cpu_reset,guest_errors,pcall,int 2> qemu.log &
|
|
.PHONY: test32
|
|
test32: all
|
|
@qemu-system-i386 -hda build/bin/disk.img -d cpu_reset,guest_errors,pcall,int 2> qemu.log &
|
|
|
|
.PHONY: debug
|
|
debug: all
|
|
@qemu-system-x86_64 -m 64M -hda build/bin/disk.img -no-reboot \
|
|
-no-shutdown -mem-path memdump.bin -mem-prealloc -d cpu_reset,guest_errors,pcall,int 2> qemu.log &
|
|
@ndisasm $(BINDIR)/kaleid -o 0x00100000 -b 64 > kaleid64_disasm.asm
|
|
@ndisasm $(BINDIR)/kaleid -o 0x00100000 -b 32 > kaleid32_disasm.asm
|
|
|
|
.PHONY: gdb
|
|
gdb: all
|
|
@qemu-system-x86_64 -m 64M -hda build/bin/disk.img -no-reboot \
|
|
-no-shutdown -mem-path memdump.bin -d cpu_reset,guest_errors,pcall,int -s -S 2> qemu.log &
|
|
@ndisasm $(BINDIR)/kaleid -o 0x00100000 -b 64 > kaleid64_disasm.asm
|
|
@ndisasm $(BINDIR)/kaleid -o 0x00100000 -b 32 > kaleid32_disasm.asm
|
|
|
|
.PHONY: install_mbr
|
|
install_mbr: $(BINDIR)/disk.img $(MBRDIR)/grub.cfg
|
|
@mkdir -p $(BINDIR)/disk
|
|
@echo ${CL2}[$@] ${NC}Installing MBR on image...${CL3}
|
|
-@$(MBRDIR)/umount.sh $(BINDIR)/disk || /bin/true
|
|
@$(MBRDIR)/grub-install.sh $(BINDIR)/disk.img $(BINDIR)/disk $(MBRDIR)/grub.cfg
|
|
@rmdir $(BINDIR)/disk
|
|
@echo ${CL2}[$@] ${CL}Success.${CL3}
|
|
|
|
.PHONY: clean
|
|
clean:
|
|
-@$(MBRDIR)/umount.sh $(BINDIR)/disk || /bin/true
|
|
@rm -Rvf ./ProjectTree
|
|
@rm -Rvf $(BINDIR)/* $(OBJDIR)/*.o \
|
|
$(OBJDIR)/*/*.o $(OBJDIR)/*/*.x86_64 $(OBJDIR)/*/*/*.o
|
|
@echo ${CL2}[[$@]] ${CL}Cleaned.${CL3}
|
|
|
|
$(BINDIR)/kaleid: $(LOBJDIR)/kaleid.x86_64
|
|
@echo ${CL2}[$@] ${NC}Objcopy...${CL3}
|
|
@x86_64-elf-objcopy -I elf64-x86-64 -O elf32-i386 $(LOBJDIR)/kaleid.x86_64 $(BINDIR)/kaleid
|
|
@echo ${CL2}[$@] ${CL}Success.${CL3}
|
|
|
|
$(LOBJDIR)/kaleid.x86_64: $(kal_kern_obj) $(kal_com_obj) $(LOBJDIR)/loader.o
|
|
@echo ${CL2}[$@] ${NC}Linking kernel objects...${CL3}
|
|
@$(LD) $(LDFLAGS) -T build/kernel.ld \
|
|
$(LOBJDIR)/loader.o \
|
|
$(KOBJDIR)/*.o \
|
|
$(KOBJDIR)/kernel/*.o \
|
|
-o $(LOBJDIR)/kaleid.x86_64
|
|
@echo ${CL2}[$@] ${CL}Success.${CL3}
|
|
|
|
$(LOBJDIR)/loader.o: $(LOADERDIR)/loader.asm $(LOADERDIR)/*/*.inc
|
|
@echo ${CL2}[$@] ${NC}Making loader...${CL3}
|
|
@$(ASM) $(ASMFLAGS) $(LOADERDIR)/loader.asm -o $(LOBJDIR)/loader.o > /dev/null
|
|
@echo ${CL2}[$@] ${CL}Success.${CL3}
|
|
|
|
$(BINDIR)/disk.img: $(MBRDIR)/create_disk.sh
|
|
@echo ${CL2}[$@]${NC} Constructing disk image...${CL3}
|
|
-@$(MBRDIR)/umount.sh $(BINDIR)/disk || /bin/true
|
|
@$(MBRDIR)/create_disk.sh $(BINDIR)/disk.img
|
|
@make install_mbr
|
|
@echo ${CL2}[$@]${NC} Constructing disk image...${CL3}
|
|
|
|
.PHONY:OS/K
|
|
OS/K: $(BINDIR)/kaleid $(BINDIR)/disk.img ./ProjectTree
|
|
@mkdir -p $(BINDIR)/disk
|
|
@echo ${CL2}[[$@]] ${NC}Integrating kernel...${CL3}
|
|
-@$(MBRDIR)/umount.sh $(BINDIR)/disk || /bin/true
|
|
@$(MBRDIR)/mount.sh $(BINDIR)/disk.img $(BINDIR)/disk
|
|
@cp $(BINDIR)/kaleid $(BINDIR)/disk/boot/kaleid
|
|
@$(MBRDIR)/umount.sh $(BINDIR)/disk
|
|
@echo ${CL2}[[$@]] ${CL}Success.${CL3}
|
|
@rmdir $(BINDIR)/disk
|