cmake_minimum_required(VERSION "3.27") project("kernel" DESCRIPTION "An educational OS kernel" HOMEPAGE_URL "https://gitlab.ost.ch/teachos/kernel" VERSION "0.0.1" LANGUAGES ASM C CXX ) set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake/Modules") include("ElfTransformations") include("GenerateBootableIso") include("CTest") include("EnableCoverage") #[============================================================================[ # External Dependencies #]============================================================================] include("FetchContent") if (BUILD_TESTING) FetchContent_Declare( "Catch2" URL "https://github.com/catchorg/Catch2/archive/refs/tags/v3.15.3.tar.gz" URL_HASH "SHA256=b0299ae552918220a7a6e21e7de5b714777f4e8c883fb70c4bb23fe01df8c6e3" EXCLUDE_FROM_ALL FIND_PACKAGE_ARGS ) FetchContent_MakeAvailable("Catch2") add_compile_definitions("CATCH_CONFIG_NO_COUNTER") endif() #[============================================================================[ # Global Build System Options #]============================================================================] option(TEACHOS_ENABLE_LINTING "Enable linting during build" ON) option(TEACHOS_ENABLE_TEST_SANITIZERS "Enable sanitizers for test executables" ON) option(TEACHOS_ENABLE_TEST_COVERAGE "Enable generation of test coverage" ON) option(TEACHOS_ENABLE_TEST_TSAN "Enable TSan for the test executable" OFF) set(ACPI_ENABLE_TEST_COVERAGE ${TEACHOS_ENABLE_TEST_COVERAGE}) set(KSTD_ENABLE_TEST_COVERAGE ${TEACHOS_ENABLE_TEST_COVERAGE}) set(CACHE{TEACHOS_STACK_FRAME_LIMIT} TYPE STRING HELP "The maximum allowed stack frame size in bytes." VALUE "0" ) set(CACHE{TEACHOS_STACK_FRAME_LIMIT_DEBUG} TYPE INTERNAL VALUE "3072") set(CACHE{TEACHOS_STACK_FRAME_LIMIT_RELEASE} TYPE INTERNAL VALUE "1280") #[============================================================================[ # Global Build System Configuration #]============================================================================] if(POLICY CMP0209) cmake_policy(SET CMP0209 NEW) endif() set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/bin") set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/lib") set(CMAKE_INTERPROCEDURAL_OPTIMIZATION YES) set(CMAKE_CXX_STANDARD "23") set(CMAKE_CXX_STANDARD_REQUIRED YES) set(CMAKE_CXX_EXTENSIONS NO) add_compile_options( "$<$:-Wall>" "$<$:-Wextra>" "$<$:-Werror>" "$<$:-pedantic-errors>" "$<$:-fstack-protector-strong>" ) if(NOT BUILD_TESTING) if(TEACHOS_STACK_FRAME_LIMIT) set(STACK_FRAME_LIMIT "${TEACHOS_STACK_FRAME_LIMIT}") else() set(STACK_FRAME_LIMIT "$,${TEACHOS_STACK_FRAME_LIMIT_DEBUG},${TEACHOS_STACK_FRAME_LIMIT_RELEASE}>") endif() add_compile_options( "$<$:-fstack-usage>" "$<$:-Wframe-larger-than=${STACK_FRAME_LIMIT}>" ) add_link_options( "$<$:-fstack-usage>" "$<$:-Wframe-larger-than=${STACK_FRAME_LIMIT}>" "$<$:-Werror=frame-larger-than=${STACK_FRAME_LIMIT}>" ) unset(STACK_FRAME_LIMIT) endif() #[============================================================================[ # Global Linting Configuration #]============================================================================] find_program(CLANG_TIDY_EXE NAMES "clang-tidy-23" "clang-tidy-22" "clang-tidy-21" "clang-tidy" ) if(CLANG_TIDY_EXE AND TEACHOS_ENABLE_LINTING) set(CMAKE_C_CLANG_TIDY "${CLANG_TIDY_EXE}") set(CMAKE_CXX_CLANG_TIDY "${CLANG_TIDY_EXE}") endif() #[============================================================================[ # Build Host Testing #]============================================================================] if(BUILD_TESTING) if(TARGET "Catch2" AND TARGET "Catch2WithMain") set_target_properties("Catch2" "Catch2WithMain" PROPERTIES C_CLANG_TIDY "" CXX_CLANG_TIDY "" ) endif() if(TEACHOS_ENABLE_TEST_SANITIZERS AND TEACHOS_ENABLE_TEST_TSAN) message(FATAL_ERROR "TEACHOS_ENABLE_TEST_SANITIZERS and TEACHOS_ENABLE_TEST_TSAN are mutually exclusive") elseif(TEACHOS_ENABLE_TEST_SANITIZERS) add_compile_options("$<$:-fsanitize=undefined,address>") add_link_options("$<$:-fsanitize=undefined,address,leak>") elseif(TEACHOS_ENABLE_TEST_TSAN) add_compile_options("$<$:-fsanitize=thread;-g>") add_link_options("$<$:-fsanitize=thread>") endif() endif() #[============================================================================[ # Global Targets #]============================================================================] if(CMAKE_CROSSCOMPILING) add_subdirectory("arch/${CMAKE_SYSTEM_PROCESSOR}") endif() add_subdirectory("kapi") add_subdirectory("kernel") add_subdirectory("libs")