_PATH := $(dir $(abspath $(lastword $(MAKEFILE_LIST))))

CD = cd
CP = cp
LS = ls
CPDIR = cp -r
RM = /usr/bin/rm
RMDIR = /usr/bin/rm -rf
NASM = /usr/bin/nasm
MAKE = /usr/bin/make
MKDIR = /usr/bin/mkdir
SUDO = /usr/bin/sudo
SLEEP = /usr/bin/sleep
DD = /usr/bin/dd
MOUNT = /usr/bin/mount
UMOUNT = /usr/bin/umount
SYNC = /usr/bin/sync
MKFAT32 = /usr/sbin/mkfs.vfat
NOTIFY = /usr/bin/notify-send
GIT = /usr/bin/git
SED = /usr/bin/sed
DATE = /usr/bin/date

ZERO = /dev/zero

# 编译信息
BRANCH=$(shell $(GIT) rev-parse --abbrev-ref HEAD)
VERSION=$(shell $(GIT) describe --tags --always | $(SED) 's/^v//')
COMMIT=$(shell $(GIT) rev-parse --verify HEAD)
BUILD_TIME=$(shell $(DATE) +"%Y-%m-%d %H:%M:%S %z")

FULL_VERSION = AOS $(VERSION) ($(BUILD_TIME)) x86_64


TERM = /usr/bin/terminator
TERM_FLAGS = -x "gdb build/system -ex=\"target remote :1234\""

BOCHS = /usr/bin/bochs
BOCHS_FLAGS = -debugger -f asset/bochsrc
QEMU = /usr/bin/qemu-system-x86_64
QEMU_FLAGS = -m 128M -smp sockets=1,cores=1,threads=1 -S -s -monitor stdio
#QEMU_FLAGS = -m 1024M -smp sockets=1,cores=4,threads=2 -S -s
#QEMU = /usr/bin/kvm
#QEMU_FLAGS = -m 1024M -cpu host -smp sockets=1,cores=4,threads=2 -S -s

PHYSICAL_DISK = /dev/sda
DISK := $(PHYSICAL_DISK)


default :
	$(MAKE) build
	$(MAKE) bochs
#	$(MAKE) qemu


.PHONY : build
build : $(DISK)
# clean old file
	-$(RMDIR) build
	$(MKDIR) build
# build bootloader
	$(MAKE) -C bootloader build BUILD="$(_PATH)build"
# clean disk
	$(SUDO) $(DD) if=$(ZERO) of=$(DISK) bs=1M count=64 conv=notrunc status=progress
	$(SUDO) $(MKFAT32) $(DISK)
# write boot.bin
	$(SUDO) $(DD) if=$(_PATH)build/boot.bin of=$(DISK) bs=512 count=1 conv=notrunc
# mount disk
	-$(MKDIR) mount
	$(SUDO) $(MOUNT) $(DISK) mount
# copy file
	$(SUDO) $(CP) build/loader.bin mount
# umount disk
	$(SUDO) $(UMOUNT) $(DISK)
	$(NOTIFY) "AOS build finished"


qemu :
	$(TERM) $(TERM_FLAGS)
	$(SUDO) $(QEMU) -hda $(DISK) $(QEMU_FLAGS)


bochs :
	-$(SUDO) $(RM) $(DISK).lock
	$(SUDO) $(BOCHS) $(BOCHS_FLAGS)


.PHONY : clean
clean :
	-$(SUDO) $(UMOUNT) mount
	-$(RMDIR) build
	-$(RMDIR) mount
	-$(SUDO) $(RM) $(DISK).lock

