Files
KirkOS/CMakeLists.txt
2026-05-18 04:02:59 -04:00

184 lines
5.4 KiB
CMake

cmake_minimum_required(VERSION 3.16)
project(KirkOS C ASM_NASM)
set(VERSION 1)
set(PATCHLEVEL 0)
set(SUBLEVEL 0)
set(EXTRAVERSION "")
set(KIRKOS_VERSION_STRING
"${VERSION}.${PATCHLEVEL}.${SUBLEVEL}${EXTRAVERSION}"
)
include(${CMAKE_SOURCE_DIR}/libs/uacpi/uacpi.cmake)
message(STATUS "Building KirkOS version: ${KIRKOS_VERSION_STRING}")
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
set(CMAKE_ASM_NASM_OBJECT_FORMAT elf64)
file(GLOB_RECURSE KIRKOS_SOURCES
"${CMAKE_SOURCE_DIR}/src/*.c"
"${CMAKE_SOURCE_DIR}/src/*.asm"
)
set(ISO_ROOT "${CMAKE_BINARY_DIR}/iso_root")
set(DISK_IMG "${CMAKE_BINARY_DIR}/disk.img")
set(ISO "${CMAKE_BINARY_DIR}/image.iso")
set(EXT2_ROOT "${CMAKE_SOURCE_DIR}/ext2_root")
add_executable(KirkOS ${KIRKOS_SOURCES})
target_sources(KirkOS PRIVATE
${UACPI_SOURCES}
${CMAKE_SOURCE_DIR}/libs/uacpi/source/kernel_api.c
)
target_include_directories(KirkOS PRIVATE
${UACPI_INCLUDES}
)
target_compile_definitions(KirkOS PRIVATE
KIRKOS_VERSION="${KIRKOS_VERSION_STRING}"
KIRKOS_VERSION_MAJOR=${VERSION}
KIRKOS_VERSION_PATCH=${PATCHLEVEL}
KIRKOS_VERSION_SUB=${SUBLEVEL}
)
add_custom_command(
OUTPUT ${ISO_ROOT}/boot/KirkOS
DEPENDS KirkOS
COMMAND ${CMAKE_COMMAND} -E copy
$<TARGET_FILE:KirkOS>
${ISO_ROOT}/boot/KirkOS
)
add_custom_target(iso_kernel DEPENDS ${ISO_ROOT}/boot/KirkOS)
set(LIMINE_DIR "${CMAKE_SOURCE_DIR}/limine")
add_custom_target(limine_files
COMMAND ${CMAKE_COMMAND} -E make_directory ${ISO_ROOT}/boot/limine
COMMAND ${CMAKE_COMMAND} -E make_directory ${ISO_ROOT}/EFI/BOOT
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/limine.conf ${ISO_ROOT}/boot/limine/
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/ramdisk.tar ${ISO_ROOT}/boot/
COMMAND ${CMAKE_COMMAND} -E copy ${LIMINE_DIR}/limine-bios.sys ${ISO_ROOT}/boot/limine/
COMMAND ${CMAKE_COMMAND} -E copy ${LIMINE_DIR}/limine-bios-cd.bin ${ISO_ROOT}/boot/limine/
COMMAND ${CMAKE_COMMAND} -E copy ${LIMINE_DIR}/limine-uefi-cd.bin ${ISO_ROOT}/boot/limine/
COMMAND ${CMAKE_COMMAND} -E copy ${LIMINE_DIR}/BOOTX64.EFI ${ISO_ROOT}/EFI/BOOT/
COMMAND ${CMAKE_COMMAND} -E copy ${LIMINE_DIR}/BOOTIA32.EFI ${ISO_ROOT}/EFI/BOOT/
)
add_custom_target(iso
DEPENDS iso_kernel limine_files
COMMAND xorriso -as mkisofs -R -r -J
-b boot/limine/limine-bios-cd.bin
-no-emul-boot -boot-load-size 4 -boot-info-table
-hfsplus
-apm-block-size 2048
--efi-boot boot/limine/limine-uefi-cd.bin
-efi-boot-part --efi-boot-image
--protective-msdos-label
${ISO_ROOT}
-o ${ISO}
COMMAND ${LIMINE_DIR}/limine bios-install ${ISO}
)
add_custom_target(disk_img
COMMAND dd if=/dev/zero of=${DISK_IMG} bs=1M count=512
COMMAND mkfs.ext2 -F -L KIRKOS ${DISK_IMG}
COMMAND guestfish --rw -a ${DISK_IMG} run
COMMAND guestfish --rw -a ${DISK_IMG} -m /dev/sda mkdir /root
COMMAND guestfish --rw -a ${DISK_IMG} -m /dev/sda copy-in ${EXT2_ROOT}/. /
COMMENT "Creating ext2 disk image via guestfish"
)
add_custom_target(run
DEPENDS iso disk_img
COMMAND qemu-system-x86_64
-cdrom ${ISO}
-hda ${DISK_IMG}
-serial stdio
-m 8G
-smp 4
-device ich9-intel-hda
-device hda-duplex
-cpu qemu64,+fsgsbase
)
add_custom_target(debug
DEPENDS iso disk_img
COMMAND qemu-system-x86_64
-cdrom ${ISO}
-hda ${DISK_IMG}
-serial stdio
-s -S
-d int,cpu_reset
-m 8G
-smp 2
-device ich9-intel-hda
-device hda-duplex
-cpu qemu64,+fsgsbase
)
add_custom_command(TARGET KirkOS POST_BUILD
COMMAND ${CMAKE_OBJCOPY} --only-keep-debug
$<TARGET_FILE:KirkOS>
${CMAKE_BINARY_DIR}/KirkOS.sym
COMMAND ${CMAKE_OBJCOPY} --strip-debug
$<TARGET_FILE:KirkOS>
COMMAND ${CMAKE_OBJCOPY} --add-gnu-debuglink=${CMAKE_BINARY_DIR}/KirkOS.sym
$<TARGET_FILE:KirkOS>
COMMENT "Splitting debug symbols (KirkOS.sym)"
)
target_include_directories(KirkOS PRIVATE
"${CMAKE_SOURCE_DIR}/src"
)
# ----------------------------------------
# DEFAULT C FLAGS (cacheable overrides)
# ----------------------------------------
set(KIRKOS_CFLAGS "-g3 -m64 -march=x86-64 -mgeneral-regs-only -fsanitize=undefined -Wall -Wextra -Wno-error -Wno-builtin-declaration-mismatch -mno-red-zone -std=gnu11 -fms-extensions -ffreestanding -fno-stack-protector -fno-stack-check -fpie -MMD"
CACHE STRING "Default CFLAGS for KirkOS")
set(KIRKOS_ASM_NASM_FLAGS "-MD -MP -f elf64 -g"
CACHE STRING "Default ASM Flags for NASM in KirkOS")
set(KIRKOS_LDFLAGS "-nostdlib -Wl,-static,-pie -Wl,--gc-sections -Wl,--no-dynamic-linker -Wl,-z,max-page-size=0x1000 -Wl,-T../linker.lds -Wl,-m,elf_x86_64"
CACHE STRING "Default LDFLAGS for KirkOS")
# ----------------------------------------
# Apply flags
# ----------------------------------------
separate_arguments(_cflags UNIX_COMMAND "${KIRKOS_CFLAGS}")
separate_arguments(_ldflags UNIX_COMMAND "${KIRKOS_LDFLAGS}")
separate_arguments(_asmflags UNIX_COMMAND "${KIRKOS_ASM_NASM_FLAGS}")
set_target_properties(KirkOS PROPERTIES
LINK_FLAGS "-Wl,--build-id=none"
)
target_compile_options(KirkOS PRIVATE
$<$<COMPILE_LANGUAGE:C>:-masm=intel>
$<$<COMPILE_LANGUAGE:C>:${_cflags}>
$<$<COMPILE_LANGUAGE:ASM_NASM>:${_asmflags}>
)
target_link_options(KirkOS PRIVATE ${_ldflags})