aboutsummaryrefslogtreecommitdiff
path: root/cmake
diff options
context:
space:
mode:
authorFelix Morgner <felix.morgner@ost.ch>2025-12-15 17:13:12 +0100
committerFelix Morgner <felix.morgner@ost.ch>2025-12-15 17:13:12 +0100
commit7b9482ae637126ac9337876e60f519b493437711 (patch)
tree6fc71a253c8b0325d303bd34c95b564ba536ed14 /cmake
parent116f9332a206767c45095950f09f7c7447b561cf (diff)
parenta9eeec745e29d89afd48ee43d09432eb6fc35be7 (diff)
downloadteachos-7b9482ae637126ac9337876e60f519b493437711.tar.xz
teachos-7b9482ae637126ac9337876e60f519b493437711.zip
os: rework kernel architecture
Rework the code structure and architecture of the kernel by separating platform-dependent and platform-independent code more cleanly. As of this patchset, full feature parity has not been achieved. Nonetheless, a sufficient subset of functionality has been ported to the new architecture to demonstrate the feasibility of the new structure.
Diffstat (limited to 'cmake')
-rw-r--r--cmake/Modules/ElfTransformations.cmake36
-rw-r--r--cmake/Modules/GenerateBootableIso.cmake22
-rw-r--r--cmake/Platforms/x86_64.cmake62
3 files changed, 92 insertions, 28 deletions
diff --git a/cmake/Modules/ElfTransformations.cmake b/cmake/Modules/ElfTransformations.cmake
new file mode 100644
index 0000000..dfc8576
--- /dev/null
+++ b/cmake/Modules/ElfTransformations.cmake
@@ -0,0 +1,36 @@
+include_guard(GLOBAL)
+
+function(target_extract_debug_symbols TARGET)
+ add_custom_command(TARGET "${TARGET}"
+ POST_BUILD
+ COMMAND "${CMAKE_OBJCOPY}"
+ "--only-keep-debug"
+ "$<TARGET_FILE:${TARGET}>"
+ "$<TARGET_FILE_DIR:${TARGET}>/$<TARGET_FILE_BASE_NAME:${TARGET}>.sym"
+ BYPRODUCTS "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/$<CONFIGURATION>/${TARGET}.sym"
+ COMMENT "Extracting debug symbols from $<TARGET_FILE:${TARGET}> ..."
+ )
+endfunction()
+
+function(target_strip TARGET)
+ add_custom_command(TARGET "${TARGET}"
+ POST_BUILD
+ COMMAND "${CMAKE_STRIP}"
+ "$<TARGET_FILE:${TARGET}>"
+ COMMENT "Stripping $<TARGET_FILE:${TARGET}> ..."
+ )
+endfunction()
+
+function(target_disassemble TARGET)
+ add_custom_command(TARGET "${TARGET}"
+ POST_BUILD
+ COMMAND "${CMAKE_OBJDUMP}"
+ "--disassemble"
+ "--visualize-jumps"
+ "--demangle"
+ "$<TARGET_FILE:${TARGET}>"
+ ">$<TARGET_FILE_DIR:${TARGET}>/$<TARGET_FILE_BASE_NAME:${TARGET}>.dis"
+ BYPRODUCTS "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/$<CONFIGURATION>/${TARGET}.dis"
+ COMMENT "Dumping disassembly for $<TARGET_FILE:${TARGET}> ..."
+ )
+endfunction()
diff --git a/cmake/Modules/GenerateBootableIso.cmake b/cmake/Modules/GenerateBootableIso.cmake
new file mode 100644
index 0000000..3d1ee30
--- /dev/null
+++ b/cmake/Modules/GenerateBootableIso.cmake
@@ -0,0 +1,22 @@
+include_guard(GLOBAL)
+
+function(target_generate_bootable_iso TARGET)
+ find_package("grub-mkrescue")
+
+ file(GENERATE
+ OUTPUT "$<TARGET_FILE_DIR:${TARGET}>/isofs/boot/grub/grub.cfg"
+ INPUT "${PROJECT_SOURCE_DIR}/arch/${CMAKE_SYSTEM_PROCESSOR}/support/grub.cfg.in"
+ )
+
+ add_custom_command(TARGET "${TARGET}"
+ POST_BUILD
+ COMMAND "${GRUB_MKRESCUE_EXE}"
+ "-o"
+ "$<TARGET_FILE_DIR:${TARGET}>/${TARGET}.iso"
+ "$<TARGET_FILE_DIR:${TARGET}>/isofs"
+ "$<TARGET_FILE:${TARGET}>"
+ "2>/dev/null"
+ BYPRODUCTS "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/$<CONFIGURATION>/${TARGET}.iso"
+ COMMENT "Creating bootable ISO image"
+ )
+endfunction()
diff --git a/cmake/Platforms/x86_64.cmake b/cmake/Platforms/x86_64.cmake
index e0518b5..b17fec8 100644
--- a/cmake/Platforms/x86_64.cmake
+++ b/cmake/Platforms/x86_64.cmake
@@ -1,35 +1,41 @@
-execute_process(COMMAND "x86_64-pc-elf-g++" "-mno-red-zone" "-print-file-name=crtbegin.o"
- OUTPUT_VARIABLE CRT_BEGIN
- ERROR_QUIET
-)
-string(STRIP "${CRT_BEGIN}" CRT_BEGIN)
-mark_as_advanced(CRT_BEGIN)
-
-string(REGEX REPLACE "/crtbegin.o" "" CMAKE_SYSROOT "${CRT_BEGIN}")
-mark_as_advanced(CMAKE_SYSROOT)
+include_guard(GLOBAL)
-set(SYSTEM_NAME "Generic")
+set(PLATFORM_TARGET "x86_64-pc-elf")
set(CMAKE_TRY_COMPILE_TARGET_TYPE "STATIC_LIBRARY")
-set(CMAKE_C_COMPILER "x86_64-pc-elf-gcc")
-set(CMAKE_CXX_COMPILER "x86_64-pc-elf-g++")
+set(CMAKE_SYSTEM_NAME "Generic-ELF")
+set(CMAKE_SYSTEM_PROCESSOR "x86_64")
+
+set(CMAKE_ASM_COMPILER_TARGET "${PLATFORM_TARGET}")
+set(CMAKE_CXX_COMPILER_TARGET "${PLATFORM_TARGET}")
+
+find_program(CMAKE_ASM_COMPILER "${CMAKE_ASM_COMPILER_TARGET}-g++" REQUIRED)
+find_program(CMAKE_CXX_COMPILER "${CMAKE_CXX_COMPILER_TARGET}-g++" REQUIRED)
+
+set(CMAKE_CXX_FLAGS_INIT
+ "-mno-red-zone"
+ "-mcmodel=kernel"
+ "-fno-pie"
+ "-fno-rtti"
+ "-fno-exceptions"
+ "-fno-use-cxa-atexit"
+ "-ffunction-sections"
+ "-fdata-sections"
+)
+
+list(JOIN CMAKE_CXX_FLAGS_INIT " " CMAKE_CXX_FLAGS_INIT)
+
+set(CMAKE_EXE_LINKER_FLAGS_INIT "-Wl,--gc-sections")
-set(CMAKE_CXX_FLAGS_INIT "-m64 -mno-red-zone -mcmodel=large -fno-rtti -fno-exceptions -ffunction-sections -fdata-sections")
set(CMAKE_CXX_FLAGS_DEBUG "-ggdb3")
set(CMAKE_ASM_FLAGS_DEBUG "-ggdb3")
-set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-ggdb3")
-set(CMAKE_ASM_FLAGS_RELWITHDEBINFO "-ggdb3")
-set(CMAKE_EXE_LINKER_FLAGS_INIT "-nostartfiles -Wl,--gc-sections")
-set(CMAKE_CXX_LINK_EXECUTABLE
- "<CMAKE_CXX_COMPILER> \
- <FLAGS> \
- <CMAKE_CXX_LINK_FLAGS> \
- <LINK_FLAGS> \
- ${CMAKE_SYSROOT}/crtbegin.o \
- <OBJECTS> \
- -o <TARGET> \
- <LINK_LIBRARIES> \
- -lgcc \
- ${CMAKE_SYSROOT}/crtend.o"
-)
+
+set(CMAKE_ASM_FLAGS_MINSIZEREL "-Os -DNDEBUG -ggdb3")
+set(CMAKE_CXX_FLAGS_MINSIZEREL "-Os -DNDEBUG -ggdb3")
+
+set(CMAKE_ASM_FLAGS_RELEASE "-O3 -DNDEBUG -ggdb3")
+set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG -ggdb3")
+
+set(CMAKE_ASM_FLAGS_RELWITHDEBINFO "-O2 -DNDEBUG -ggdb3")
+set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -DNDEBUG -ggdb3")