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 ) #[============================================================================[ # Global Build System Configuration #]============================================================================] 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_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake/Modules") set(CMAKE_CXX_STANDARD "20") set(CMAKE_CXX_STANDARD_REQUIRED YES) set(CMAKE_CXX_EXTENSIONS NO) #[============================================================================[ # Documentation #]============================================================================] find_package("Doxygen") set(DOXYGEN_GENERATE_HTML YES) set(DOXYGEN_GENERATE_XML YES) set(DOXYGEN_EXCLUDE_PATTERNS "*.cpp") set(DOXYGEN_OUTPUT_DIRECTORY "doxygen") set(DOXYGEN_QUIET YES) file(GLOB_RECURSE DOXYGEN_SOURCES CONFIGURE_DEPENDS "*.hpp") message(STATUS "${SPHINX_SOURCES}") doxygen_add_docs("docs_xml" ${DOXYGEN_SOURCES} ALL USE_STAMP_FILE COMMENT "Generating developer documentation sources" ) set_target_properties("docs_xml" PROPERTIES ADDITIONAL_CLEAN_FILES "${PROJECT_BINARY_DIR}/doxygen" ) file(GLOB_RECURSE SPHINX_SOURCES CONFIGURE_DEPENDS "../docs/**.rst") add_custom_target("docs" ALL COMMAND "${SPHINX_BUILD_EXE}" "../docs" "docs" "-q" DEPENDS "docs_xml" SOURCES ${SPHINX_SOURCES} COMMENT "Generating developer documentation html" ) set_target_properties("docs" PROPERTIES ADDITIONAL_CLEAN_FILES "${PROJECT_BINARY_DIR}/docs" ) #[============================================================================[ # Global Compiler Configuration #]============================================================================] add_compile_options( "$<$:-Wall>" "$<$:-Wextra>" "$<$:-Werror>" "$<$:-pedantic-errors>" "$<$:-fsanitize=address,leak,bounds,alignment,return,integer-divide-by-zero,vla-bound,null,enum,pointer-overflow>" ) #[============================================================================[ # Global Directories #]============================================================================] include_directories( "include" "arch/${CMAKE_SYSTEM_PROCESSOR}/include" ) #[============================================================================[ # The Bootstrap Library #]============================================================================] add_library("_boot" OBJECT) add_library("teachos::boot" ALIAS "_boot") #[============================================================================[ # The Video Library #]============================================================================] add_library("_video" OBJECT) add_library("teachos::video" ALIAS "_video") #[============================================================================[ # THE Memory Library #]============================================================================] add_library("_memory" OBJECT) add_library("teachos::memory" ALIAS "_memory") #[============================================================================[ # The Exception handling Library #]============================================================================] add_library("_exception" OBJECT) add_library("teachos::exception" ALIAS "_exception") #[============================================================================[ # The Context switching Library #]============================================================================] add_library("_context" OBJECT) add_library("teachos::context_switching" ALIAS "_context") add_library("_interrupt_handling" OBJECT) add_library("teachos::interrupt_handling" ALIAS "_interrupt_handling") # https://forum.osdev.org/viewtopic.php?f=1&t=36712 # https://gcc.gnu.org/onlinedocs/gcc/x86-Function-Attributes.html#index-interrupt-function-attribute_002c-x86 target_compile_options("_interrupt_handling" PRIVATE "-mgeneral-regs-only") #[============================================================================[ # The Stub Standard Library #]============================================================================] add_library("_stl" OBJECT) add_library("teachos::stl" ALIAS "_stl") #[============================================================================[ # The Kernel #]============================================================================] add_executable("_kernel" "src/kernel/main.cpp" ) add_executable("teachos::kernel" ALIAS "_kernel") target_link_libraries("_kernel" PRIVATE "teachos::boot" "teachos::video" "teachos::memory" "teachos::exception" "teachos::stl" "teachos::context_switching" "teachos::interrupt_handling" ) #[============================================================================[ # Platform Specific Components #]============================================================================] add_subdirectory("arch/${CMAKE_SYSTEM_PROCESSOR}")