LIMINE_DIR = $(abspath dependencies/limine) MINTSUKI_HEADERS_DIR = $(abspath dependencies/mintsuki-headers) TOOLCHAIN_DIR = $(abspath toolchain) EXTRA_CC_ARGS = -Wall -Wextra -Og -ggdb -fno-exceptions HILBERT_NASM = nasm -f elf64 HILBERT_CC = ${TOOLCHAIN_DIR}/usr/bin/x86_64-elf-c++ -std=c++20 \ ${EXTRA_CC_ARGS} -static -mno-sse -I include -I $(abspath euler/include) \ -I $(abspath libraries/daguerre/include) -I ${MINTSUKI_HEADERS_DIR} \ -I $(abspath libraries/pake/include) HILBERT_AR = ${TOOLCHAIN_DIR}/usr/bin/x86_64-elf-ar HILBERT_LD = ${TOOLCHAIN_DIR}/usr/bin/x86_64-elf-ld -z noexecstack .EXPORT_ALL_VARIABLES: LIB_DIR = ${TOOLCHAIN_DIR}/usr/x86_64-elf/lib LIMINE_DEP = dependencies/.limine-done MINTSUKI_HEADERS_DEP = dependencies/.mintsuki-headers-done BINUTILS_DEP = toolchain/.binutils-done GCC_DEP = toolchain/.gcc-done LIBGCC_DEP = toolchain/.libgcc-done LIBSTDCPP_DEP = toolchain/.libstdcpp-done EULER_DEP = toolchain/.euler-done DAGUERRE_DEP = toolchain/.daguerre-done PAKE_DEP = toolchain/.pake-done APP_DEPS = ${EULER_DEP} LIBRARY_DEPS = ${LIBSTDCPP_DEP} .PHONY: default run clean clean-dependencies default: build/disk.iso run: build/disk.iso gdb -x qemu.gdb clean: rm -rf build ${EULER_DEP} ${DAGUERRE_DEP} ${PAKE_DEP} make -C euler clean make -C kernel clean make -C applications/init clean make -C applications/goldman clean make -C applications/hello clean make -C libraries/daguerre clean make -C libraries/pake clean clean-dependencies: clean rm -rf toolchain dependencies ${LIMINE_DEP}: mkdir -p dependencies test -e dependencies/limine || git clone --depth 1 -b v7.5.1 https://github.com/limine-bootloader/limine dependencies/limine cd ${LIMINE_DIR} && ./bootstrap cd ${LIMINE_DIR} && ./configure --enable-bios --enable-bios-cd +make -C ${LIMINE_DIR} touch $@ ${MINTSUKI_HEADERS_DEP}: mkdir -p dependencies test -e dependencies/mintsuki-headers || git clone --depth 1 https://github.com/osdev0/freestanding-headers dependencies/mintsuki-headers cd dependencies/mintsuki-headers && git fetch --depth=1 origin dd3abd2d7147efc4170dff478d3b7730bed14147 cd dependencies/mintsuki-headers && git checkout dd3abd2d7147efc4170dff478d3b7730bed14147 patch dependencies/mintsuki-headers/stddef.h patches/mintsuki-stddef.patch touch $@ ${BINUTILS_DEP}: mkdir -p dependencies toolchain/usr test -e dependencies/binutils || git clone --depth 1 -b binutils-2_42 https://sourceware.org/git/binutils-gdb dependencies/binutils mkdir -p dependencies/binutils/build cd dependencies/binutils/build && ../configure --disable-gdb \ --target=x86_64-elf --prefix=${TOOLCHAIN_DIR}/usr +make -C dependencies/binutils/build +make -C dependencies/binutils/build install touch $@ ${GCC_DEP}: ${BINUTILS_DEP} mkdir -p toolchain/usr/include test -e dependencies/gcc || git clone --depth 1 -b releases/gcc-14.1.0 https://gcc.gnu.org/git/gcc dependencies/gcc mkdir -p dependencies/gcc/build cd dependencies/gcc/build && ../configure --disable-fixed-point \ --disable-gcov --disable-multilib --disable-shared \ --disable-hosted-libstdcxx \ --enable-languages=c++ --target=x86_64-elf --enable-cstdio=stdio_pure \ --prefix=${TOOLCHAIN_DIR}/usr --without-headers --enable-cxx-flags=-mno-sse +make -C dependencies/gcc/build all-gcc +make -C dependencies/gcc/build install-gcc touch $@ ${LIBGCC_DEP}: ${GCC_DEP} +make -C dependencies/gcc/build all-target-libgcc +make -C dependencies/gcc/build install-target-libgcc touch $@ ${LIBSTDCPP_DEP}: ${LIBGCC_DEP} +make -C dependencies/gcc/build all-target-libstdc++-v3 +make -C dependencies/gcc/build install-target-libstdc++-v3 patch toolchain/usr/x86_64-elf/include/c++/14.1.0/memory patches/gcc-memory.patch touch $@ .PHONY: ${EULER_DEP} ${EULER_DEP}: ${LIBRARY_DEPS} +make -C euler build/crt0.o build/libc.a build/libg.a build/libm.a mkdir -p ${LIB_DIR} cp euler/build/crt0.o euler/build/libc.a \ euler/build/libg.a euler/build/libm.a ${LIB_DIR}/ touch $@ .PHONY: ${DAGUERRE_DEP} ${DAGUERRE_DEP}: ${LIBRARY_DEPS} +make -C libraries/daguerre build/libdaguerre.a cp libraries/daguerre/build/libdaguerre.a ${LIB_DIR}/ touch $@ .PHONY: ${PAKE_DEP} ${PAKE_DEP}: ${LIBRARY_DEPS} +make -C libraries/pake build/libpake.a cp libraries/pake/build/libpake.a ${LIB_DIR}/ touch $@ .PHONY: kernel/build/kernel.elf kernel/build/kernel.elf: ${GCC_DEP} ${MINTSUKI_HEADERS_DEP} ${LIMINE_DEP} +make -C kernel build/kernel.elf .PHONY: applications/init/build/init.elf applications/init/build/init.elf: ${APP_DEPS} +make -C applications/init build/init.elf .PHONY: applications/goldman/build/goldman.elf applications/goldman/build/goldman.elf: ${APP_DEPS} ${DAGUERRE_DEP} +make -C applications/goldman build/goldman.elf .PHONY: applications/hello/build/hello.elf applications/hello/build/hello.elf: ${APP_DEPS} ${DAGUERRE_DEP} ${PAKE_DEP} +make -C applications/hello build/hello.elf build/initfs.tgz: applications/init/build/init.elf \ applications/goldman/build/goldman.elf \ applications/hello/build/hello.elf @mkdir -p build rm -rf build/initfs cp -r skeleton build/initfs cp applications/init/build/init.elf build/initfs/bin/init cp applications/goldman/build/goldman.elf build/initfs/bin/goldman cp applications/hello/build/hello.elf build/initfs/bin/hello cd build/initfs && tar czf ../initfs.tgz . build/disk.iso: kernel/build/kernel.elf build/initfs.tgz ${LIMINE_DEP} @mkdir -p build rm -rf build/iso mkdir build/iso cp kernel/build/kernel.elf ${LIMINE_DIR}/bin/limine-bios.sys \ ${LIMINE_DIR}/bin/limine-bios-cd.bin build/initfs.tgz build/iso/ echo 'TIMEOUT=0' > build/iso/limine.cfg echo ':Hilbert OS' >> build/iso/limine.cfg echo 'PROTOCOL=limine' >> build/iso/limine.cfg echo 'KERNEL_PATH=boot:///kernel.elf' >> build/iso/limine.cfg echo 'MODULE_PATH=$$boot:///initfs.tgz' >> build/iso/limine.cfg echo 'MODULE_CMDLINE=initfs' >> build/iso/limine.cfg xorriso -as mkisofs -b limine-bios-cd.bin -no-emul-boot -boot-load-size 4 \ -boot-info-table --protective-msdos-label build/iso -o $@