cmake_minimum_required(VERSION 3.15) project(cedos C ASM) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) function(cedos_linker_script target linker_script) target_link_options(${target} PRIVATE -T ${linker_script} ) endfunction() function(cedos_mapfile target_elf) string(REPLACE ".elf" ".map" target_map ${target_elf}) target_link_options(${target_elf} PRIVATE LINKER:-Map=${CMAKE_BINARY_DIR}/${target_map} ) add_custom_target(${target_map} ALL DEPENDS ${target_map} ) endfunction() function(cedos_print_usage target_elf) target_link_options(${target_elf} PRIVATE LINKER:--print-memory-usage ) endfunction() function(cedos_strip_binary target_elf) string(REPLACE ".elf" ".bin" target_bin ${target_elf}) add_custom_target(${target_bin} ALL DEPENDS ${target_elf} COMMAND ${CMAKE_OBJCOPY} -O binary ${target_elf} ${target_bin} ) endfunction() execute_process( COMMAND git describe --abbrev=4 --dirty --always --tags OUTPUT_VARIABLE GIT_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE ) add_compile_options(-DVERSION="${GIT_VERSION}") add_compile_options(-Wall -Wextra -Werror) set(CEDOS_TTY_CON vga_con) set(CEDOS_INIT_EXE "shelf") list(APPEND COMMON_SRC common/memory.c common/string.c common/fat12.c ) list(APPEND BOOT_SRC boot/drives.s boot/mbr.s boot/paging.c boot/gdt.c boot/a20.s boot/main.c boot/display.s boot/entry.s ) list(APPEND KERNEL_SRC kernel/pic.c kernel/syscall.c kernel/drivers/console.c kernel/drivers/graphics.s kernel/drivers/keyboard.c kernel/drivers/vga_console.c kernel/drivers/graphics.c kernel/drivers/ps2_keyboard.c kernel/drivers/tty.c kernel/drivers/serial_console.c kernel/drivers/bios_speaker.c kernel/syscall.s kernel/sched/sched.c kernel/sched/stack_check.c kernel/sched/sched.s kernel/sched/process.c kernel/sched/sched_strats.c kernel/pit.c kernel/time.c kernel/core.c kernel/mm/paging.c kernel/mm/page_allocator.c kernel/file.c kernel/main.c kernel/elf.c kernel/fat.c kernel/entry.s kernel/pipe.c kernel/alarm.c kernel/interrupts.c ) list(APPEND LIBCEDOS_SRC libcedos/stdio.c libcedos/cedos.c libcedos/start.c libcedos/stdlib.c libcedos/assert.c ) list(APPEND SHELL_APPS imgview mtest shelf gmode hexdump memusage ticks ls kill echo reboot md5 cat ce3d ) if(DEFINED DEBUG) add_compile_options(-DDEBUG) endif() # Boot add_executable(boot.elf ${COMMON_SRC} ${BOOT_SRC} ) target_include_directories(boot.elf PRIVATE boot/ common/ ) target_compile_options(boot.elf PRIVATE -Os ) cedos_linker_script(boot.elf ${CMAKE_SOURCE_DIR}/boot/link.txt) cedos_strip_binary(boot.elf) cedos_mapfile(boot.elf) cedos_print_usage(boot.elf) # Kernel add_executable(kernel.elf ${COMMON_SRC} ${KERNEL_SRC} ) target_include_directories(kernel.elf PRIVATE kernel/ common/ ) target_compile_options(kernel.elf PRIVATE -DCEDOS_TTY_CON=${CEDOS_TTY_CON} -DCEDOS_INIT_EXE=${CEDOS_INIT_EXE} ) cedos_linker_script(kernel.elf ${CMAKE_SOURCE_DIR}/kernel/link.txt) cedos_strip_binary(kernel.elf) cedos_mapfile(kernel.elf) cedos_print_usage(kernel.elf) # libcedos add_library(cedos STATIC ${COMMON_SRC} ${LIBCEDOS_SRC} ) target_include_directories(cedos PRIVATE libcedos/ common/ ) # shell foreach(SHELL_APP IN LISTS SHELL_APPS) add_executable(${SHELL_APP} shell/${SHELL_APP}.c ) target_link_libraries(${SHELL_APP} cedos) target_include_directories(${SHELL_APP} PRIVATE libcedos/ common/ ) cedos_linker_script(${SHELL_APP} ${CMAKE_SOURCE_DIR}/shell/link.txt) target_link_options(${SHELL_APP} PRIVATE LINKER:-Map=${CMAKE_BINARY_DIR}/${SHELL_APP}.map ) endforeach() target_compile_options(ce3d PRIVATE -mhard-float) # image add_custom_target( cedos.img ALL DEPENDS kernel.bin boot.bin ${SHELL_APPS} COMMAND mkdir -p ${CMAKE_BINARY_DIR}/root ${CMAKE_BINARY_DIR}/input COMMAND cp kernel.bin ${SHELL_APPS} ${CMAKE_BINARY_DIR}/root COMMAND cp boot.bin ${CMAKE_BINARY_DIR}/input COMMAND genimage --config ${CMAKE_SOURCE_DIR}/image.conf )