CeDOS - CMakeLists.txt

CMakeLists.txt (view raw)

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
)
add_compile_options(-DVERSION="${GIT_VERSION}")

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/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
)

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/
)

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()

# 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
)