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

function(cedos_add_image image_name kernel_target bootloader_target)
	# image root directory
	add_custom_target(
		${image_name}_root ALL
		COMMAND mkdir -p ${CMAKE_BINARY_DIR}/root ${CMAKE_BINARY_DIR}/input
	)

	# image
	add_custom_target(
		cedos.img ALL
		DEPENDS ${kernel_target} ${bootloader_target} ${image_name}_root
		COMMAND cp ${kernel_target} ${CMAKE_BINARY_DIR}/root
		COMMAND cp ${bootloader_target} ${CMAKE_BINARY_DIR}/input
		COMMAND genimage --config ${CMAKE_SOURCE_DIR}/image.conf
	)
endfunction()

function(cedos_add_executable image_target executable_target)
	add_executable(${executable_target})

	add_custom_command(
		TARGET ${executable_target} POST_BUILD
		COMMAND cp ${executable_target} ${CMAKE_BINARY_DIR}/root
		DEPENDS root_dir
	)

	add_dependencies(${executable_target} ${image_target}_root)
	add_dependencies(${image_target} ${executable_target})

	target_link_libraries(${executable_target} cedos)
	target_include_directories(${executable_target} PRIVATE
		libcedos/
		common/
	)
	cedos_linker_script(${executable_target} ${CMAKE_SOURCE_DIR}/shell/link.txt)

	target_link_options(${executable_target} PRIVATE
		LINKER:-Map=${CMAKE_BINARY_DIR}/${executable_target}.map
	)
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)

if (DEFINED CEDOS_TEST)
set(CEDOS_TTY_CON serial_con)
set(CEDOS_INIT_EXE "test")
else()
set(CEDOS_TTY_CON vga_con)
set(CEDOS_INIT_EXE "shelf")
endif()

list(APPEND COMMON_SRC
	common/memory.c
	common/string.c
	common/fat12.c
	common/list.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
	kernel/pci.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
)

list(APPEND TEST_APPS
	test
)

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)

cedos_add_image(cedos.img kernel.bin boot.bin)

# libcedos
add_library(cedos STATIC
	${COMMON_SRC}
	${LIBCEDOS_SRC}
)

target_include_directories(cedos PRIVATE
	libcedos/
	common/
)

# shell
foreach(SHELL_APP IN LISTS SHELL_APPS)
	cedos_add_executable(cedos.img ${SHELL_APP})
	target_sources(${SHELL_APP}
		PRIVATE
		shell/${SHELL_APP}.c
	)
endforeach()

if (DEFINED CEDOS_TEST)
	list(APPEND IMAGE_APPS ${TEST_APPS})
	foreach(TEST_APP IN LISTS TEST_APPS)
		cedos_add_executable(cedos.img ${TEST_APP})
		target_sources(${TEST_APP}
			PRIVATE
			tests/${TEST_APP}.c
		)
		target_include_directories(${TEST_APP} PRIVATE
			tests/
		)
	endforeach()
endif()

target_compile_options(ce3d PRIVATE -mhard-float)