~build_image.sh
.sh
Shell
(text/x-sh)
#!/bin/bash

# Flags

kernelCompileFlags="-ffreestanding -nostdinc -nostdinc++ \
					-Wall -Wextra \
					-o ./bin/kernel.bin -target x86_64-unknown-linux-elf \
					-I ./kernel/"
kernelLinkFlags="-nostdlib -Wl,--oformat=binary,-T./kernel/linker.ld"
kernelFiles="./kernel/unityBuild.cpp ./build/kernelEntryPoint.o"

# Build

mkdir {bin,build} 2> /dev/null

echo -e "Cleaning..."
rm *.bin *.img *.iso *.o *.vmdk 2> /dev/null

echo -e "\nBuilding..."
nasm ./boot/bootloader.asm -I ./boot/ -o ./bin/bootloader.bin || exit 1
nasm -f elf64 ./kernel/entry.asm -o ./build/kernelEntryPoint.o || exit 1

use_crystal_kernel=true

if [ "$use_crystal_kernel" = false ]
then
	crystal build --no-debug -Dkernel --cross-compile --target x86_64-unknown-linux-elf --prelude=../prelude.cr -o ./build/kernel ./kernel/kernel.cr || exit 1
	ld -m elf_x86_64 -nostdlib -T ./kernel/linker.ld -o ./build/kernel.bin ./build/kernelEntryPoint.o ./build/kernel.o || exit 1
	# objcopy -O binary ./build/kernel.elf ./bin/kernel.bin || exit 1

	# # Calculate and patch bootloader sector metadata
	# bootloader_size=$(stat -c%s ./bin/bootloader.bin)
	# bootloader_extra_sectors=$(( (bootloader_size + 511) / 512 - 1 ))
	# kernel_size=$(stat -c%s ./bin/kernel.bin)
	# kernel_number_of_sectors=$(( (kernel_size + 511) / 512 ))
	# kernel_start_sector=$((1 + bootloader_extra_sectors))

	# printf '%b' "\\x$(printf '%02x' "$((bootloader_extra_sectors & 0xff))")\\x00" | dd of=./bin/bootloader.bin bs=1 seek=504 conv=notrunc status=none
	# printf '%b' "\\x$(printf '%02x' "$((kernel_start_sector & 0xff))")\\x00" | dd of=./bin/bootloader.bin bs=1 seek=506 conv=notrunc status=none
	# printf '%b' "\\x$(printf '%02x' "$((kernel_number_of_sectors & 0xff))")\\x00" | dd of=./bin/bootloader.bin bs=1 seek=508 conv=notrunc status=none
	# echo "Patched bootloader: extra_sectors=$bootloader_extra_sectors kernel_start=$kernel_start_sector kernel_sectors=$kernel_number_of_sectors"
else
	clang++ $kernelCompileFlags $kernelLinkFlags $kernelFiles || exit 1
fi

./tools/genVDisk --output "crystalos.img" --floppy \
			  --bootloader ./bin/bootloader.bin --kernel ./bin/kernel.bin

echo -e "\nRunning..."
qemu-system-x86_64 -drive if=floppy,index=0,format=raw,file=crystalos.img || exit 1

exit 0