CMakeLists.txt

back


cmake_minimum_required(VERSION 3.10)
project(tinybios LANGUAGES C ASM VERSION 0.5)

find_program(dd NAMES dd HINTS /usr/bin /usr/local/bin /bin)
find_program(clang-19 NAMES clang clang-19 HINTS /usr/bin /usr/local/bin /bin)

set(target_mainboard "qemu" CACHE STRING "Currently we only support qemu for now")
set(target_cpu "x86-64" CACHE STRING "We only support x86-64 cpus for now")
set(CC distcc clang)

# These source files are used by _all_ versions of x86 bios of ours
#
add_executable(tinybios 
    src/cpu/gdt.S
    src/cpu/init.S

    src/mm/slab.c
    src/mm/malloc.c

    src/interrupts/idt.c
    src/interrupts/default_int_handler.c

    src/romcall/romcall.c

    src/stacks/ctx.c
    src/stacks/ctx.S

    src/c_entry.c
    src/panic.c
    src/post.c
    src/console.c
    src/reset.S
)

# Device drivers
add_subdirectory(src/drivers)

# Helper stuff
add_subdirectory(src/stdlib)

# These sources are mainboard dependant
#
add_subdirectory(src/mainboards/${target_mainboard})

add_custom_command(
    TARGET tinybios
    POST_BUILD
    COMMENT "Building BIOS Image from ELF file" 
    COMMAND objcopy -j .rom_text -j .data -j .text -j .reset -O binary tinybios.elf tinybios.bin
)

add_custom_target(run
    COMMAND qemu-system-x86_64 -bios tinybios.bin -device piix3-ide,id=ide -drive id=disk,file=${CMAKE_CURRENT_SOURCE_DIR}/test_disk,format=raw,if=none -device ide-hd,drive=disk,bus=ide.0
    DEPENDS tinybios.bin
    USES_TERMINAL
)

add_custom_target(log-int
    COMMAND qemu-system-x86_64 -bios tinybios.bin -d int -device piix3-ide,id=ide -drive id=disk,file=${CMAKE_CURRENT_SOURCE_DIR}/test_disk,format=raw,if=none -device ide-hd,drive=disk,bus=ide.0
    DEPENDS tinybios.bin
    USES_TERMINAL
)

add_custom_target(log-asm
    COMMAND qemu-system-x86_64 -bios tinybios.bin -d in_asm -device piix3-ide,id=ide -drive id=disk,file=${CMAKE_CURRENT_SOURCE_DIR}/test_disk,format=raw,if=none -device ide-hd,drive=disk,bus=ide.0
    DEPENDS tinybios.bin
    USES_TERMINAL
)


add_custom_target(debug
    COMMAND qemu-system-x86_64 -S --daemonize -s -bios tinybios.bin -device piix3-ide,id=ide -drive id=disk,file=${CMAKE_CURRENT_SOURCE_DIR}/test_disk,format=raw,if=none -device ide-hd,drive=disk,bus=ide.0
    COMMAND gdb -ix ${CMAKE_CURRENT_SOURCE_DIR}/gdbinit
    DEPENDS tinybios.bin
    USES_TERMINAL
)

target_include_directories(tinybios SYSTEM PUBLIC 
    "src/include"
)

target_compile_options(tinybios PUBLIC 
    -Wall -Wextra
    -nostdlib
    -ibuiltininc
    -ffreestanding
    -masm=intel
    -fno-pic
    -std=gnu2x
    -D TARGET_MAINBOARD=${target_mainboard}
    -march=${target_cpu}
)

target_link_options(tinybios PUBLIC 
    -nostdlib -no-pie -Wl,--script=${CMAKE_CURRENT_SOURCE_DIR}/linker.conf
)

set_target_properties(tinybios PROPERTIES OUTPUT_NAME tinybios.elf)