calcite/make-build.sh

114 lines
3.5 KiB
Bash

#!/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
cp_apps=""
app_deps=""
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/' | tr '\n' ' ')
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_elf=$(echo $dir | sed -e 's/^src/build/')/$app_name.elf
disk_dir=build/disk/calcite/apps/$app_name
disk_elf=$disk_dir/$app_name.elf
cp_apps=$(echo "$cp_apps" \
"mkdir -p $disk_dir &&" \
"cp $build_elf $disk_elf &&")
app_deps="$app_deps $build_elf"
done
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 -p build/disk/calcite &&" \
"cp build/kernel/kernel.elf build/disk/calcite/ &&" \
$cp_apps \
"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 $app_deps" >> build.ninja
echo "default build/disk.iso" >> build.ninja