#!/bin/sh COMMON_CC_EXTRA_FLAGS="-O3 -Wall -Wextra" COMMON_CC_FLAGS="-std=c23 -ffreestanding -I include ${COMMON_CC_EXTRA_FLAGS}" KERNEL_CC_FLAGS="-mno-sse -I dependencies/limine ${COMMON_CC_FLAGS}" #in the future user code will be allowed to use sse USER_CC_FLAGS="-mno-sse ${COMMON_CC_FLAGS}" if [ -e build.ninja ]; then echo build.ninja already exists. exit fi set -e echo "rule nasm" >> build.ninja echo " command = nasm -f elf64 \$in -o \$out" >> build.ninja echo "rule kernel_cc" >> build.ninja echo " depfile = \$out.d" >> build.ninja echo " command = cc -c -MD -MF \$out.d ${KERNEL_CC_FLAGS} \$in -o \$out" >> build.ninja echo "rule user_cc" >> build.ninja echo " depfile = \$out.d" >> build.ninja echo " command = cc -c -MD -MF \$out.d ${USER_CC_FLAGS} \$in -o \$out" >> build.ninja echo "rule kernel_ld" >> build.ninja echo " command = ld -T src/kernel/link.ld \$in -o \$out" >> build.ninja echo "rule user_lib_ld" >> build.ninja echo " command = ld -r \$in -o \$out" >> build.ninja #eventually maybe a libc will be linked in echo "rule user_app_ld" >> build.ninja echo " command = ld \$in -o \$out" >> build.ninja #builds everything in a directory # $1 - source directory # $2 - cc rule # $3 - ld rule # $4 - linked object name # $5 - extra objects to link in build_all() { sources="$1/*.asm $1/*.c" objects="$5" for src in $sources; do if echo $src | grep -q -v '*'; then build=$(echo $src | sed -e 's/^src/build/').o if echo $src | grep -q '.c$'; then echo "build $build: $2 $src" >> build.ninja else echo "build $build: nasm $src" >> build.ninja fi objects="$objects $build" fi done build_dir=$(echo $1 | sed -e 's/^src/build/') echo "build $build_dir/$4: $3 $objects" >> build.ninja } build_all src/kernel kernel_cc kernel_ld kernel.elf for dir in src/user-libs/*; do lib_name=$(echo $dir | sed -e 's/^src\/user-libs\///') build_all $dir user_cc user_lib_ld lib$lib_name.o done apps="" for dir in src/user-apps/*; do if [ -e $dir/libraries.txt ]; then lib_paths=$(cat $dir/libraries.txt | sed -e 's/^.*$/build\/user-libs\/\0\/lib\0.o/') else lib_paths="" fi app_name=$(echo $dir | sed -e 's/^src\/user-apps\///') build_all $dir user_cc user_app_ld $app_name.elf $lib_paths build_dir=$(echo $dir | sed -e 's/^src/build/') apps="$apps $build_dir/$app_name.elf" done echo "rule initfs" >> build.ninja echo " command =" \ "rm -rf build/initfs &&" \ "mkdir -p build/initfs/apps &&" \ "cp build/user-apps/hello/hello.elf build/initfs/apps/ &&" \ "cd build/initfs &&" \ "tar cf ../initfs.tar *" >> build.ninja echo "build build/initfs.tar: initfs $apps" >> build.ninja echo "rule disk" >> build.ninja echo " command =" \ "rm -rf build/disk &&" \ "cp -r disk build/disk &&" \ "cp dependencies/limine/limine-uefi-cd.bin build/disk/limine/ &&" \ "cp dependencies/limine/limine-bios-cd.bin build/disk/limine/ &&" \ "cp dependencies/limine/limine-bios.sys build/disk/limine/ &&"\ "mkdir -p build/disk/EFI/BOOT &&" \ "cp dependencies/limine/BOOTX64.EFI build/disk/EFI/BOOT/ &&" \ "mkdir build/disk/calcite &&" \ "cp build/kernel/kernel.elf build/disk/calcite/ &&" \ "cp build/initfs.tar build/disk/calcite/ &&" \ "xorriso -as mkisofs -R -r -J -b limine/limine-bios-cd.bin -no-emul-boot -boot-load-size 4 -boot-info-table -hfsplus -apm-block-size 2048 --efi-boot limine/limine-uefi-cd.bin -efi-boot-part --efi-boot-image --protective-msdos-label build/disk -o build/disk.iso &&" \ "dependencies/limine/limine bios-install build/disk.iso" >> build.ninja echo "build build/disk.iso: disk | build/kernel/kernel.elf build/initfs.tar" >> build.ninja echo "default build/disk.iso" >> build.ninja