@@ -36,60 +36,57 @@ include_directories(include)
3636file (GLOB_RECURSE ASM_SOURCES "src/*.asm" )
3737file (GLOB_RECURSE C_SOURCES "src/*.c" )
3838
39- # Ensure boot.asm is ALWAYS FIRST in the link order to keep Multiboot header at the top
40- set (BOOT_ASM "${CMAKE_CURRENT_SOURCE_DIR} /src/boot.asm" )
41- list (REMOVE_ITEM ASM_SOURCES "${BOOT_ASM} " )
42- set (ASM_SOURCES "${BOOT_ASM} " ${ASM_SOURCES} )
43-
44- # Exclude specific files if needed
45- list (FILTER C_SOURCES EXCLUDE REGEX "src/drivers/vga.c" )
46-
47- # Handle AI Model Blob
48- set (ASSETS_DIR "${CMAKE_CURRENT_SOURCE_DIR} /assets" )
49- set (MODEL_BLOB "" )
50-
51- # Check for model candidates
52- set (CANDIDATES
53- "${ASSETS_DIR} /smollm2.gguf"
54- "${ASSETS_DIR} /smollm-135m.gguf"
55- "${ASSETS_DIR} /SmolLM2-135M-Instruct-Q4_K_M.gguf"
56- )
57-
58- foreach (CANDIDATE ${CANDIDATES} )
59- if (EXISTS "${CANDIDATE} " )
60- set (MODEL_BLOB "${CANDIDATE} " )
61- message (STATUS "Found AI model blob: ${MODEL_BLOB} " )
62- break ()
63- endif ()
64- endforeach ()
65-
66- if (MODEL_BLOB)
67- set (MODEL_OBJ "${CMAKE_CURRENT_BINARY_DIR} /model.o" )
39+ # AI model blob handling
40+ set (MODEL_BLOB "${CMAKE_CURRENT_SOURCE_DIR} /model.bin" )
41+ if (EXISTS "${MODEL_BLOB} " )
42+ set (MODEL_OBJ "model.o" )
6843 add_custom_command (
6944 OUTPUT ${MODEL_OBJ}
7045 COMMAND i686-linux-gnu-objcopy -I binary -O elf32-i386 -B i386
7146 --rename-section .data=.ai_model,alloc,load,readonly,data,contents
7247 "${MODEL_BLOB} " "${MODEL_OBJ} "
7348 DEPENDS "${MODEL_BLOB} "
7449 COMMENT "Converting AI model blob to object file"
50+ WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR} "
7551 )
76- # Add the object file to the sources
77- list ( APPEND ASM_SOURCES ${ MODEL_OBJ} )
52+ # Use the generated object file in the link step
53+ set (MODEL_OBJ_PATH " ${CMAKE_CURRENT_BINARY_DIR} / ${ MODEL_OBJ}" )
7854else ()
7955 message (WARNING "AI model blob not found. Kernel will be built without AI support." )
56+ set (MODEL_OBJ_PATH "" )
8057endif ()
8158
59+ # Ensure boot.asm is ALWAYS FIRST in the link order to keep Multiboot header at the top
60+ set (BOOT_ASM "${CMAKE_CURRENT_SOURCE_DIR} /src/boot.asm" )
61+ list (REMOVE_ITEM ASM_SOURCES "${BOOT_ASM} " )
62+ set (ASM_SOURCES "${BOOT_ASM} " ${ASM_SOURCES} )
63+
64+ # Exclude specific files if needed
65+ list (FILTER C_SOURCES EXCLUDE REGEX "src/drivers/vga.c" )
66+
8267# Build Kernel Binary
8368set (LINKER_SCRIPT "${CMAKE_CURRENT_SOURCE_DIR} /linker.ld" )
8469
85- # We use add_executable but we need to control the linking process
86- add_executable (kernel.bin ${ASM_SOURCES} ${C_SOURCES} )
70+ add_executable (kernel.bin ${ASM_SOURCES} ${C_SOURCES} ${MODEL_OBJ_PATH} )
71+
72+ target_link_options (kernel.bin PRIVATE
73+ "-T${LINKER_SCRIPT} "
74+ "-nostdlib"
75+ "-m32"
76+ "-no-pie"
77+ "-Wl,-z,noexecstack"
78+ )
79+
80+ # Find libgcc
81+ execute_process (
82+ COMMAND ${CMAKE_C_COMPILER} -m32 -print-libgcc-file-name
83+ OUTPUT_VARIABLE LIBGCC_PATH
84+ OUTPUT_STRIP_TRAILING_WHITESPACE
85+ )
86+
87+ target_link_libraries (kernel.bin PRIVATE "${LIBGCC_PATH} " )
8788
8889set_target_properties (kernel.bin PROPERTIES
89- LINK_FLAGS "-T \" ${LINKER_SCRIPT} \" -nostdlib -m32 -no-pie -Wl,-z,noexecstack"
9090 SUFFIX ""
9191 RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR} "
9292)
93-
94- # Link with libgcc for arithmetic operations
95- target_link_libraries (kernel.bin gcc )
0 commit comments