#=----------------------------------------------------------------------------=# # 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 . # #=----------------------------------------------------------------------------=# .PHONY: all test test32 debug gdb install_mbr clean OS/K all : OS/K ## 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=-Iinclude CFLAGS1=-nostdlib -ffreestanding -mcmodel=large -std=gnu11 CFLAGS2= -c -g -mno-red-zone -mno-mmx -mno-sse -mno-sse2 CFLAGS=$(CFLAGS1) $(CFLAGS2) KCC=$(CCNAME) $(COPTIM) $(CWARNS) $(CFLAGS) $(CINCLUDES) -D_OSK_SOURCE -D_KALEID_KERNEL #Folders MBRDIR=boot/grub LOADERDIR=boot/loader KALEIDDIR=kaleid INCLUDEDIR=include OBJDIR=build/obj KOBJDIR=build/obj/kaleid LOBJDIR=build/obj/boot BINDIR=build/bin BUILDDIR=build vpath %.c $(KALEIDDIR) #Color codes CL='\033[0;32m' CL2='\033[1;36m' CL3='\033[0m' NC='\033[1;37m' # Lib C LibCObj= $(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 # Kernel sources KernSources=libbuf/buf.c libbuf/bput.c \ libbuf/bprint.c kernel/cpu/cpuid.c \ kernel/cpu/idt.c kernel/init/init.c \ kernel/init/table.c kernel/io/cursor.c \ kernel/ke/log.c kernel/io/vga.c \ kernel/ke/panic.c kernel/mm/map.c \ kernel/mm/heap.c kernel/mm/malloc.c \ kernel/mm/gdt.c kernel/ps/sched.c \ KernObj=$(patsubst %.c,$(KOBJDIR)/%.o,$(KernSources)) ## MISC MAKEFILE ------------------------------------------------------------- # ./ProjectTree: ./.stylehlp_sh @cat ./.stylehlp_sh > ./ProjectTree @echo "\n" >> ./ProjectTree @tree --dirsfirst >> ./ProjectTree @echo ${CL2}[$@] ${CL}Generated.${CL3} $(KOBJDIR): @mkdir -p $(KOBJDIR) ## Lib C MAKEFILE ------------------------------------------------------------ # $(KOBJDIR)/atoi.o: $(KALEIDDIR)/libc/atoi.c $(INCLUDEDIR)/*/*.h | $(KOBJDIR) @$(KCC) -D_NEED_ATOI $< -o $@ @echo ${CL2}[$@] ${CL}Compiled.${CL3} $(KOBJDIR)/atol.o: $(KALEIDDIR)/libc/atoi.c $(INCLUDEDIR)/*/*.h | $(KOBJDIR) @$(KCC) -D_NEED_ATOL $< -o $@ @echo ${CL2}[$@] ${CL}Compiled.${CL3} $(KOBJDIR)/atou.o: $(KALEIDDIR)/libc/atoi.c $(INCLUDEDIR)/*/*.h | $(KOBJDIR) @$(KCC) -D_NEED_ATOU $< -o $@ @echo ${CL2}[$@] ${CL}Compiled.${CL3} $(KOBJDIR)/atoul.o: $(KALEIDDIR)/libc/atoi.c $(INCLUDEDIR)/*/*.h | $(KOBJDIR) @$(KCC) -D_NEED_ATOUL $< -o $@ @echo ${CL2}[$@] ${CL}Compiled.${CL3} $(KOBJDIR)/itoa.o: $(KALEIDDIR)/libc/itoa.c $(INCLUDEDIR)/*/*.h | $(KOBJDIR) @$(KCC) -D_NEED_ITOA $< -o $@ @echo ${CL2}[$@] ${CL}Compiled.${CL3} $(KOBJDIR)/ltoa.o: $(KALEIDDIR)/libc/itoa.c $(INCLUDEDIR)/*/*.h | $(KOBJDIR) @$(KCC) -D_NEED_LTOA $< -o $@ @echo ${CL2}[$@] ${CL}Compiled.${CL3} $(KOBJDIR)/utoa.o: $(KALEIDDIR)/libc/itoa.c $(INCLUDEDIR)/*/*.h | $(KOBJDIR) @$(KCC) -D_NEED_UTOA $< -o $@ @echo ${CL2}[$@] ${CL}Compiled.${CL3} $(KOBJDIR)/ultoa.o: $(KALEIDDIR)/libc/itoa.c $(INCLUDEDIR)/*/*.h | $(KOBJDIR) @$(KCC) -D_NEED_ULTOA $< -o $@ @echo ${CL2}[$@] ${CL}Compiled.${CL3} $(KOBJDIR)/mem.o: $(KALEIDDIR)/libc/mem.c $(INCLUDEDIR)/*/*.h | $(KOBJDIR) @$(KCC) -fno-strict-aliasing $< -o $@ @echo ${CL2}[$@] ${CL}Compiled.${CL3} $(KOBJDIR)/ctype.o: $(KALEIDDIR)/libc/ctype.c $(INCLUDEDIR)/*/*.h | $(KOBJDIR) @$(KCC) $< -o $@ @echo ${CL2}[$@] ${CL}Compiled.${CL3} $(KOBJDIR)/rand.o: $(KALEIDDIR)/libc/rand.c $(INCLUDEDIR)/*/*.h | $(KOBJDIR) @$(KCC) $< -o $@ @echo ${CL2}[$@] ${CL}Compiled.${CL3} $(KOBJDIR)/sprintf.o: $(KALEIDDIR)/libc/sprintf.c $(INCLUDEDIR)/*/*.h | $(KOBJDIR) @$(KCC) $< -o $@ @echo ${CL2}[$@] ${CL}Compiled.${CL3} $(KOBJDIR)/status.o: $(KALEIDDIR)/libc/status.c $(INCLUDEDIR)/*/*.h | $(KOBJDIR) @$(KCC) $< -o $@ @echo ${CL2}[$@] ${CL}Compiled.${CL3} $(KOBJDIR)/string.o: $(KALEIDDIR)/libc/string.c $(INCLUDEDIR)/*/*.h | $(KOBJDIR) @$(KCC) $< -o $@ @echo ${CL2}[$@] ${CL}Compiled.${CL3} $(KOBJDIR)/strtol.o: $(KALEIDDIR)/libc/strtol.c $(INCLUDEDIR)/*/*.h | $(KOBJDIR) @$(KCC) $< -o $@ @echo ${CL2}[$@] ${CL}Compiled.${CL3} $(KOBJDIR)/argv.o: $(KALEIDDIR)/extras/argv.c $(INCLUDEDIR)/*/*.h | $(KOBJDIR) @$(KCC) $< -o $@ @echo ${CL2}[$@] ${CL}Compiled.${CL3} $(KOBJDIR)/prog.o: $(KALEIDDIR)/extras/prog.c $(INCLUDEDIR)/*/*.h | $(KOBJDIR) @$(KCC) $< -o $@ @echo ${CL2}[$@] ${CL}Compiled.${CL3} ## KERNEL MAKEFILE ----------------------------------------------------------- # $(KOBJDIR)/%.o: %.c $(INCLUDEDIR)/*/*.h @mkdir -p $(shell dirname $@) @$(KCC) $< -o $@ @echo ${CL2}[$@] ${CL}Compiled.${CL3} ## MAIN MAKEFILE ------------------------------------------------------------- # test: all @qemu-system-x86_64 -m 4G -hda $(BUILDDIR)/bin/disk.img \ -d cpu_reset,guest_errors,pcall,int 2> $(BUILDDIR)/qemu.log & test32: all @qemu-system-i386 -hda $(BUILDDIR)/bin/disk.img -d cpu_reset,guest_errors,pcall,int 2> $(BUILDDIR)/qemu.log & debug: all @qemu-system-x86_64 -m 64M -hda $(BUILDDIR)/bin/disk.img -no-reboot \ -no-shutdown -d cpu_reset,guest_errors,pcall,int 2> $(BUILDDIR)/qemu.log & @ndisasm $(BINDIR)/kaleid -o 0x00100000 -b 64 > $(BUILDDIR)/kaleid64_disasm.asm @ndisasm $(BINDIR)/kaleid -o 0x00100000 -b 32 > $(BUILDDIR)/kaleid32_disasm.asm gdb: all @qemu-system-x86_64 -m 64M -hda $(BUILDDIR)/bin/disk.img -no-reboot \ -no-shutdown -d cpu_reset,guest_errors,pcall,int -s 2> $(BUILDDIR)/qemu.log & @ndisasm $(BINDIR)/kaleid -o 0x00100000 -b 64 > kaleid64_disasm.asm @ndisasm $(BINDIR)/kaleid -o 0x00100000 -b 32 > kaleid32_disasm.asm @gdb \ -ex "set arch i386:x86-64:intel" \ -ex "target remote localhost:1234" \ -ex "symbol-file $(BINDIR)/kaleid" \ -ex "break BtStartKern" \ 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} clean: -@$(MBRDIR)/umount.sh $(BINDIR)/disk || /bin/true @rm -Rvf ./ProjectTree $(BUILDDIR)/*.log @rm -Rvf $(BINDIR)/* $(KernObj) $(LibCObj) $(OBJDIR)/* @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: $(LibCObj) $(KernObj) $(LOBJDIR)/loader.o @echo ${CL2}[$@] ${NC}Linking kernel objects...${CL3} @$(LD) $(LDFLAGS) -T $(BUILDDIR)/kernel.ld \ $(LOBJDIR)/loader.o $(KernObj) $(LibCObj) \ -o $(LOBJDIR)/kaleid.x86_64 @echo ${CL2}[$@] ${CL}Success.${CL3} $(LOBJDIR)/loader.o: $(LOADERDIR)/loader.asm $(LOADERDIR)/*/*.inc @echo ${CL2}[$@] ${NC}Making loader...${CL3} @mkdir -p $(shell dirname $@) @$(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} 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