Browse Source

change(cmake): link the kernel with cmake

greatbridf 2 năm trước cách đây
mục cha
commit
33e5982d79
1 tập tin đã thay đổi với 26 bổ sung44 xóa
  1. 26 44
      CMakeLists.txt

+ 26 - 44
CMakeLists.txt

@@ -1,35 +1,12 @@
 cmake_minimum_required(VERSION 3.15)
-project(my_os_bootloader ASM)
-
-set(CMAKE_ASM_FLAGS "-m32")
+project(kernel_main C CXX ASM)
 
 set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
 
-set(EXTRACT_DIR ${PROJECT_BINARY_DIR}/extract)
-file(MAKE_DIRECTORY ${EXTRACT_DIR})
-
-set(BOOTLOADER_SOURCES src/boot.s
-                       src/asm/a20.s
-                       src/asm/interrupt.s
-                       src/asm/port_io.s
-                       src/asm/sys.s
-                       )
-
-add_library(bootloader STATIC ${BOOTLOADER_SOURCES})
-
-add_custom_command(OUTPUT mbr.bin
-    DEPENDS ${PROJECT_SOURCE_DIR}/src/mbr.S ${PROJECT_SOURCE_DIR}/src/mbr.ld
-    COMMAND ${CMAKE_ASM_COMPILER} -m32 -c ${PROJECT_SOURCE_DIR}/src/mbr.S -o mbr.o
-    COMMAND ${CMAKE_LINKER} -T ${PROJECT_SOURCE_DIR}/src/mbr.ld mbr.o -o mbr.bin
-)
-
-add_custom_command(OUTPUT extracted_bootloader
-    DEPENDS bootloader
-    COMMAND ${CMAKE_AR} xf ${PROJECT_BINARY_DIR}/libbootloader.a --output=${EXTRACT_DIR}
-)
-
-project(kernel_main)
+set(CMAKE_CXX_LINK_EXECUTABLE
+    "<CMAKE_LINKER> <CMAKE_CXX_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>")
 
+set(CMAKE_ASM_FLAGS "-m32")
 set(CMAKE_C_FLAGS "-nostdinc -m32 -nostdlib -W -Wall -Wextra -Wno-builtin-declaration-mismatch -Wno-format -Werror=implicit-int -Werror=implicit-function-declaration -Werror=strict-aliasing -fverbose-asm -fno-exceptions -fno-pic -ffreestanding -mstack-protector-guard=global")
 set(CMAKE_CXX_FLAGS "-nostdinc -m32 -nostdlib -W -Wall -Wextra -Wno-builtin-declaration-mismatch -Wno-format -fverbose-asm -fno-use-cxa-atexit -fno-exceptions -fno-pic -ffreestanding -fno-rtti -mstack-protector-guard=global")
 set(CMAKE_CXX_STANDARD 20)
@@ -46,6 +23,15 @@ if (NOT DEFINED FDISK_BIN)
     set(FDISK_BIN fdisk)
 endif()
 
+add_subdirectory(gblibc)
+
+set(BOOTLOADER_SOURCES src/boot.s
+                       src/asm/a20.s
+                       src/asm/interrupt.s
+                       src/asm/port_io.s
+                       src/asm/sys.s
+                       )
+
 set(KERNEL_MAIN_SOURCES src/fs/fat.cpp
                         src/kernel_main.cpp
                         src/kernel/errno.c
@@ -106,31 +92,27 @@ set(KERNEL_MAIN_SOURCES src/fs/fat.cpp
                         include/kernel/log.hpp
                         include/kernel_main.hpp
                         )
-add_library(kernel_main STATIC ${KERNEL_MAIN_SOURCES})
-target_link_libraries(kernel_main gblibc)
-target_include_directories(kernel_main PRIVATE ${PROJECT_SOURCE_DIR}/include)
-add_subdirectory(gblibc)
-
-add_custom_command(OUTPUT extracted_kernel_main
-    DEPENDS kernel_main
-    COMMAND ${CMAKE_AR} xf ${PROJECT_BINARY_DIR}/libkernel_main.a --output=${EXTRACT_DIR}
-)
 
 add_custom_target(user_space_programs
     COMMAND cp ${CMAKE_SOURCE_DIR}/user-space-program/Makefile.src ${CMAKE_SOURCE_DIR}/user-space-program/Makefile
     COMMAND make -C ${CMAKE_SOURCE_DIR}/user-space-program CROSS_COMPILE=${TOOLCHAIN_PATH_AND_PREFIX} all
 )
 
-add_custom_target(kernel.out
-    DEPENDS extracted_bootloader
-    DEPENDS extracted_kernel_main
-    DEPENDS user_space_programs
-    DEPENDS ${CMAKE_SOURCE_DIR}/src/kernel.ld
-    COMMAND ${CMAKE_LINKER} -T ${CMAKE_SOURCE_DIR}/src/kernel.ld ${EXTRACT_DIR}/*.o
-    -melf_i386 -o ${CMAKE_BINARY_DIR}/kernel.out -lgblibc -L${CMAKE_BINARY_DIR}/gblibc
+add_executable(kernel.out ${KERNEL_MAIN_SOURCES} ${BOOTLOADER_SOURCES})
+add_dependencies(kernel.out user_space_programs)
+target_link_libraries(kernel.out gblibc)
+target_include_directories(kernel.out PRIVATE ${PROJECT_SOURCE_DIR}/include)
+target_link_options(kernel.out PRIVATE
+    -T ${CMAKE_SOURCE_DIR}/src/kernel.ld -melf_i386 -lgblibc -L${CMAKE_BINARY_DIR}/gblibc)
+set_target_properties(kernel.out PROPERTIES LINK_DEPENDS ${CMAKE_SOURCE_DIR}/src/kernel.ld)
+
+add_custom_command(OUTPUT mbr.bin
+    DEPENDS ${PROJECT_SOURCE_DIR}/src/mbr.S ${PROJECT_SOURCE_DIR}/src/mbr.ld
+    COMMAND ${CMAKE_ASM_COMPILER} -m32 -c ${PROJECT_SOURCE_DIR}/src/mbr.S -o mbr.o
+    COMMAND ${CMAKE_LINKER} -T ${PROJECT_SOURCE_DIR}/src/mbr.ld mbr.o -o mbr.bin
 )
 
-add_custom_target(mbr_hole.bin
+add_custom_command(OUTPUT mbr_hole.bin
     DEPENDS kernel.out
     COMMAND ${CMAKE_OBJCOPY} --strip-debug -O binary ${CMAKE_BINARY_DIR}/kernel.out mbr_hole.bin
 )