#=----------------------------------------------------------------------------=# # OS on Kaleid # # # # Desc: Project Makefile # # # # # # Copyright © 2018-2020 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 testnokvm testnosnd test32 debug gdb ddd gdbnokvm dddnokvm installonimage dust clean OS/K run update-cross-cc .DELETE_ON_ERROR: $(BINDIR)/kaleid .DEFAULT_GOAL := all ## VARIABLES ----------------------------------------------------------------- # # Debug mode ?= debug ram ?= 4G cpu ?= core2duo # Cross-cc CROSS-CC-DIR := $(shell pwd)/cross-cc LATEST-CROSS-CC := https://gitlab.os-k.eu/os-k-team/cross-cc-builder/uploads/fcb43b0cc04c75ff89e40b4b24567484/cross-cc.tar.xz export PATH := $(CROSS-CC-DIR)/bin:$(PATH) NTHREADS := $(shell nproc) # Programs ASM=nasm LD=x86_64-elf-ld OBJCOPY=x86_64-elf-objcopy CCNAME=x86_64-elf-gcc # Flags ASMFLAGS=-f elf64 LDFLAGS=-melf_x86_64 COPTIM=-O2 CWARNS=-Wall -Wextra -Wno-unused-parameter -Wno-implicit-fallthrough -Werror=implicit-function-declaration -Werror=return-type #-Wpadded CINCLUDES=-Iinclude -Iinclude/drivers -Iinclude/kernel CFLAGS1=-nostdlib -ffreestanding -mcmodel=large -std=gnu11 -fstack-protector-strong -fdump-rtl-expand CFLAGS2= -c -mno-red-zone -mno-mmx -mno-sse -mno-sse2 CFLAGS= $(CFLAGS1) $(CFLAGS2) CFLAGS_MATHS= $(CFLAGS1) -c -mno-red-zone -mno-mmx ifeq ($(mode), release) CFLAGS += -D_NO_DEBUG CFLAGS_MATHS += -D_NO_DEBUG dep += dust endif ifeq ($(mode), debug) CFLAGS += -g CFLAGS_MATHS += -g endif # GCC KCC=$(CCNAME) $(COPTIM) $(CWARNS) $(CFLAGS) $(CINCLUDES) \ -D_OSK_SOURCE -D_KALEID_KERNEL KCC_MATHS=$(CCNAME) $(COPTIM) $(CWARNS) $(CFLAGS_MATHS) $(CINCLUDES) \ -D_OSK_SOURCE -D_KALEID_KERNEL # Folders MBRDIR=boot/grub LOADERDIR=boot/loader KALEIDDIR=kaleid OBJDIR=build/obj KOBJDIR=build/obj/kaleid LOBJDIR=build/obj/boot BINDIR=build/bin BUILDDIR=build vpath %.c $(KALEIDDIR) # Installation parameters installdisk ?= $(BINDIR)/disk.img # Color codes CL='\033[0;32m' CL2='\033[1;36m' CL3='\033[0m' NC='\033[1;37m' ## SOURCES INSCRIPTION-------------------------------------------------------- # # Lib C sources + libbuf source LibCSources = libc/mem.c libc/ctype.c \ libc/rand.c libc/sprintf.c \ libc/errno.c libc/string.c \ libc/strtol.c \ libbuf/bopen.c libbuf/bputc.c libbuf/bscroll.c \ libbuf/bprint.c libbuf/bgetc.c libbuf/bscan.c \ libbuf/bflush.c libbuf/bwrite.c libbuf/bread.c \ libbuf/bmisc.c libbuf/bclose.c \ LibCObj=$(patsubst %.c,$(KOBJDIR)/%.o,$(LibCSources)) LibCDep=$(patsubst %.c,$(KOBJDIR)/%.d,$(LibCSources)) LibCObj += $(KOBJDIR)/libc/atoi.o $(KOBJDIR)/libc/itoa.o # Kernel sources KernSources = kernel/ke/cpuid.c kernel/mm/paging.c \ kernel/ke/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 \ kernel/init/info.c kernel/init/ssp.c \ kernel/ke/rtc.c kernel/io/keyb.c \ kernel/io/spkr.c kernel/po/shtdwn.c \ kernel/sh/shell.c kernel/sh/shcmds.c \ kernel/sh/musage.c kernel/sh/argv.c \ kernel/ke/pit.c kernel/sh/testcmds.c \ kernel/mm/palloc.c kernel/io/acpi.c \ kernel/io/pci.c KernObj=$(patsubst %.c,$(KOBJDIR)/%.o,$(KernSources)) KernDep=$(patsubst %.c,$(KOBJDIR)/%.d,$(KernSources)) # Drivers sources DriverSources = drivers/ata.c DriverObj=$(patsubst %.c,$(KOBJDIR)/%.o,$(DriverSources)) DriverDep=$(patsubst %.c,$(KOBJDIR)/%.d,$(DriverSources)) -include $(LibCDep) -include $(KernDep) -include $(DriverDep) ## MISC MAKEFILE ------------------------------------------------------------- # $(CROSS-CC-DIR)/bin/x86_64-elf-gcc: @echo ${CL2}[$@] ${NC} Downloading and extracting the cross-compiler...${CL3} @wget $(LATEST-CROSS-CC) -O $(CROSS-CC-DIR).tar.xz -q -c --show-progress @tar -xaf $(CROSS-CC-DIR).tar.xz --skip-old-files @echo ${CL2}[$@] ${CL}Success.${CL3} ./ProjectTree: ./.stylehlp_sh @cat ./.stylehlp_sh > ./ProjectTree @echo "\n" >> ./ProjectTree @tree --dirsfirst -I "bin|obj">> ./ProjectTree @echo ${CL2}[$@] ${CL}Generated.${CL3} $(KOBJDIR): @mkdir -p $(KOBJDIR) wc: @rm -f build/kaleid*_disasm.asm @cat $(shell find -name *.[ch]) $(shell find -name *.asm) $(shell find -name *.inc) | wc -l egypt: CFLAGS := -DNDEBUG $(filter-out -fstack-protector-all,$(CFLAGS)) egypt: dust $(LibCObj) $(KernObj) $(DriverObj) @find -name '*.expand' -o -name '*.expand' | xargs cat > rtl_exp.out @egypt < rtl_exp.out | dot -Tps -o osk-graph.ps @rm -f rtl_exp.out @evince osk-graph.ps & ## LIB C MAKEFILE ------------------------------------------------------------ # $(KOBJDIR)/libc/atoi.o: $(KALEIDDIR)/libc/atoi.c | $(KOBJDIR) @mkdir -p $(shell dirname $@) @$(KCC) -D_NEED_ATOI $< -o $@.1 @$(KCC) -D_NEED_ATOL $< -o $@.2 @$(KCC) -D_NEED_ATOU $< -o $@.3 @$(KCC) -D_NEED_ATOUL $< -o $@.4 @$(LD) $(LDFLAGS) -r $@.1 $@.2 $@.3 $@.4 -o $@ @rm -f $@.1 $@.2 $@.3 $@.4 @echo ${CL2}[$@] ${CL}Compiled.${CL3} $(KOBJDIR)/libc/itoa.o: $(KALEIDDIR)/libc/itoa.c | $(KOBJDIR) @mkdir -p $(shell dirname $@) @$(KCC) -D_NEED_ITOA $< -o $@.1 @$(KCC) -D_NEED_LTOA $< -o $@.2 @$(KCC) -D_NEED_UTOA $< -o $@.3 @$(KCC) -D_NEED_ULTOA $< -o $@.4 @$(LD) $(LDFLAGS) -r $@.1 $@.2 $@.3 $@.4 -o $@ @rm -f $@.1 $@.2 $@.3 $@.4 @echo ${CL2}[$@] ${CL}Compiled.${CL3} $(KOBJDIR)/libc/mem.o: $(KALEIDDIR)/libc/mem.c | $(KOBJDIR) @mkdir -p $(shell dirname $@) @$(KCC) -fno-strict-aliasing $< -o $@ @echo ${CL2}[$@] ${CL}Compiled.${CL3} ## KERNEL SPECIAL RECIPES MAKEFILE ------------------------------------------- # $(KOBJDIR)/kernel/ke/idt.o: $(KALEIDDIR)/kernel/ke/idt.c \ $(KALEIDDIR)/kernel/ke/isr.asm | $(KOBJDIR) @mkdir -p $(shell dirname $@) @$(ASM) $(ASMFLAGS) $(KALEIDDIR)/kernel/ke/isr.asm -o $@.1 @$(KCC) $< -o $@.2 @$(LD) $(LDFLAGS) -r $@.1 $@.2 -o $@ @rm -f $@.1 $@.2 @echo ${CL2}[$@] ${CL}Compiled.${CL3} $(KOBJDIR)/kernel/ke/cpuid.o: $(KALEIDDIR)/kernel/ke/cpuid.c \ $(KALEIDDIR)/kernel/ke/cpuf.asm | $(KOBJDIR) @mkdir -p $(shell dirname $@) @$(ASM) $(ASMFLAGS) $(KALEIDDIR)/kernel/ke/cpuf.asm -o $@.1 @$(KCC_MATHS) $< -o $@.2 @$(LD) $(LDFLAGS) -r $@.1 $@.2 -o $@ @rm -f $@.1 $@.2 @echo ${CL2}[$@] ${CL}Compiled.${CL3} $(KOBJDIR)/kernel/ke/shcmds.o: $(KALEIDDIR)/kernel/sh/shcmds.c | $(KOBJDIR) @mkdir -p $(shell dirname $@) @$(KCC_MATHS) -MM -MT $(@:%.d=%.o) -MF $@ $< @echo ${CL2}[$@] ${CL}Compiled.${CL3} $(KOBJDIR)/kernel/mm/paging.o: $(KALEIDDIR)/kernel/mm/paging.c \ $(KALEIDDIR)/kernel/mm/paging.asm | $(KOBJDIR) @mkdir -p $(shell dirname $@) @$(ASM) $(ASMFLAGS) $(KALEIDDIR)/kernel/mm/paging.asm -o $@.1 @$(KCC) $< -o $@.2 @$(LD) $(LDFLAGS) -r $@.1 $@.2 -o $@ @rm -f $@.1 $@.2 @echo ${CL2}[$@] ${CL}Compiled.${CL3} $(KOBJDIR)/kernel/mm/gdt.o: $(KALEIDDIR)/kernel/mm/gdt.c \ $(KALEIDDIR)/kernel/mm/gdt.asm | $(KOBJDIR) @mkdir -p $(shell dirname $@) @$(ASM) $(ASMFLAGS) $(KALEIDDIR)/kernel/mm/gdt.asm -o $@.1 @$(KCC) $< -o $@.2 @$(LD) $(LDFLAGS) -r $@.1 $@.2 -o $@ @rm -f $@.1 $@.2 @echo ${CL2}[$@] ${CL}Compiled.${CL3} ## DRIVERS SPECIAL RECIPES MAKEFILE ------------------------------------------ # $(KOBJDIR)/drivers/ata.o: $(KALEIDDIR)/drivers/ata.c $(KALEIDDIR)/drivers/ata.asm | $(KOBJDIR) @mkdir -p $(shell dirname $@) @$(ASM) $(ASMFLAGS) $(KALEIDDIR)/drivers/ata.asm -o $@.1 @$(KCC) $< -o $@.2 @$(LD) $(LDFLAGS) -r $@.1 $@.2 -o $@ @rm -f $@.1 $@.2 @echo ${CL2}[$@] ${CL}Compiled.${CL3} ## DEPENDENCIES MAKEFILE ----------------------------------------------------- # $(KOBJDIR)/%.d: %.c $(CROSS-CC-DIR)/bin/x86_64-elf-gcc | $(KOBJDIR) @mkdir -p $(shell dirname $@) @$(KCC) -MM -MT $(@:%.d=%.o) -MF $@ $< @echo ${CL2}[$@] ${CL}Dependencies generated.${CL3} ## MAIN MAKEFILE ------------------------------------------------------------- # $(KOBJDIR)/%.o: %.c | $(KOBJDIR) @mkdir -p $(shell dirname $@) @$(KCC) $< -o $@ @echo ${CL2}[$@] ${CL}Compiled.${CL3} $(BINDIR)/kaleid: $(LOBJDIR)/kaleid.x86_64 @echo ${CL2}[$@] ${NC}Objcopy...${CL3} @mkdir -p $(shell dirname $@) @$(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) $(DriverObj) \ $(LOBJDIR)/loader.o $(BUILDDIR)/kernel.ld @echo ${CL2}[$@] ${NC}Linking kernel objects...${CL3} @mkdir -p $(shell dirname $@) @$(LD) $(LDFLAGS) -T $(BUILDDIR)/kernel.ld \ $(LOBJDIR)/loader.o $(KernObj) $(DriverObj) $(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} OS/K: $(dep) ./ProjectTree $(BINDIR)/kaleid @echo ${CL2}[[$@]] ${NC} OS/K successfully made, $(mode) mode.${CL3} all : $(CROSS-CC-DIR)/bin/x86_64-elf-gcc @make OS/K -j $(NTHREADS) ## QEMU/DEBUG RELATED test: all installonimage @qemu-system-x86_64 -vga std -enable-kvm -machine type=q35 -soundhw pcspk -cpu host -s \ -rtc base=localtime -m $(ram) -hda $(installdisk) -net nic,model=rtl8139 \ -d cpu_reset,guest_errors,pcall,int 2> $(BUILDDIR)/qemu.log & run: test testnokvm: all installonimage @qemu-system-x86_64 -vga std -cpu $(cpu) -soundhw pcspk -s \ -rtc base=localtime -m $(ram) -hda $(installdisk) \ -d cpu_reset,guest_errors,pcall,int 2> $(BUILDDIR)/qemu.log & testnosnd: all installonimage @qemu-system-x86_64 -vga std -enable-kvm -cpu host -s \ -rtc base=localtime -m $(ram) -hda $(installdisk) \ -d cpu_reset,guest_errors,pcall,int 2> $(BUILDDIR)/qemu.log & test32: all installonimage @qemu-system-i386 -m $(ram) -hda $(installdisk) -d \ cpu_reset,guest_errors,pcall,int 2> $(BUILDDIR)/qemu.log & gdb: all installonimage @setsid qemu-system-x86_64 -m $(ram) -enable-kvm -rtc base=localtime \ -hda $(installdisk) -no-reboot -no-shutdown -d \ cpu_reset,guest_errors,pcall,int -s -S 2> $(BUILDDIR)/qemu.log & @gdb \ -ex "set arch i386:x86-64:intel" \ -ex "target remote localhost:1234" \ -ex "symbol-file $(BINDIR)/kaleid" \ -ex "break BtStartKern" \ ddd: all installonimage @setsid qemu-system-x86_64 -m $(ram) -enable-kvm -rtc base=localtime \ -hda $(installdisk) -no-reboot -no-shutdown -d \ cpu_reset,guest_errors,pcall,int -s -S 2> $(BUILDDIR)/qemu.log & @ddd -n gdbnokvm: all installonimage @setsid qemu-system-x86_64 -m $(ram) -rtc base=localtime \ -hda $(installdisk) -no-reboot -no-shutdown -d \ cpu_reset,guest_errors,pcall,int -s -S 2> $(BUILDDIR)/qemu.log & @gdb \ -ex "set arch i386:x86-64:intel" \ -ex "target remote localhost:1234" \ -ex "symbol-file $(BINDIR)/kaleid" \ -ex "break BtStartKern" \ dddnokvm: all installonimage @setsid qemu-system-x86_64 -m $(ram) -rtc base=localtime \ -hda $(installdisk) -no-reboot -no-shutdown -d \ cpu_reset,guest_errors,pcall,int -s -S 2> $(BUILDDIR)/qemu.log & @ddd -n ## HD IMAGE RELATED ---------------------------------------------------------- # installonimage: $(installdisk) $(MBRDIR)/grub.cfg @echo ${CL2}[$@] ${NC}Installing boot configuration on image...${CL3} @$(BUILDDIR)/install-os-k.sh $(installdisk) $(MBRDIR)/grub.cfg $(BINDIR)/kaleid @echo ${CL2}[$@] ${CL}Success.${CL3} $(installdisk): $(BUILDDIR)/create_disk.sh @echo ${CL2}[$@]${NC} Constructing disk image $@...${CL3} @mkdir -p $(shell dirname $@) @$(BUILDDIR)/create_disk.sh $(installdisk) @echo ${CL2}[$@]${NC} Constructing disk image...${CL3} ## CLEANUP RELATED ----------------------------------------------------------- # dust: @rm -Rf $(OBJDIR)/* @echo ${CL2}[$@] ${CL}Cleaned.${CL3} clean: @rm -Rvf ./ProjectTree $(BUILDDIR)/*.log @rm -Rvf $(BINDIR) $(OBJDIR) @echo ${CL2}[$@] ${CL}Cleaned.${CL3} update-cross-cc: @rm -rf cross-cc @echo ${CL2}[$@] ${CL}Ready to update.${CL3}