CMakeLists.txt 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. cmake_minimum_required(VERSION 3.15)
  2. project(kernel_main C CXX ASM)
  3. set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
  4. set(CMAKE_CXX_LINK_EXECUTABLE
  5. "<CMAKE_LINKER> <CMAKE_CXX_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>")
  6. set(C_CXX_FLAGS "-nostdinc -nostdlib -mno-sse -mno-mmx -W -Wall -Wextra -Wno-stringop-overflow -Wno-builtin-declaration-mismatch -Wno-format -fverbose-asm -fno-exceptions -ffreestanding -fno-pic -mno-red-zone -mstack-protector-guard=global -mcmodel=kernel")
  7. set(CMAKE_C_FLAGS "${C_CXX_FLAGS} -Werror=implicit-int -Werror=implicit-function-declaration -Werror=strict-aliasing")
  8. set(CMAKE_CXX_FLAGS "${C_CXX_FLAGS} -fno-use-cxa-atexit -fno-rtti")
  9. set(CMAKE_CXX_LINK_FLAGS "-z noexecstack --gc-sections --no-check-sections")
  10. SET(CMAKE_ASM_FLAGS "${CFLAGS} -x assembler-with-cpp")
  11. set(CMAKE_CXX_STANDARD 20)
  12. if (CMAKE_BUILD_TYPE STREQUAL "Debug")
  13. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DDEBUG -O0 -g")
  14. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DDEBUG -O0 -g")
  15. set(CARGO_BUILD_TYPE "debug")
  16. set(CARGO_BUILD_FLAGS "")
  17. elseif(CMAKE_BUILD_TYPE STREQUAL "Release")
  18. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2 -g -DNDEBUG")
  19. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2 -g -DNDEBUG")
  20. set(CARGO_BUILD_TYPE "release")
  21. set(CARGO_BUILD_FLAGS "--release")
  22. endif()
  23. if (NOT DEFINED FDISK_BIN)
  24. set(FDISK_BIN fdisk)
  25. endif()
  26. add_subdirectory(gblibc)
  27. add_subdirectory(user-space-program)
  28. set(BOOTLOADER_SOURCES src/mbr.S)
  29. add_executable(kernel.out ${BOOTLOADER_SOURCES})
  30. add_dependencies(kernel.out rustpart)
  31. target_link_libraries(kernel.out gblibc gbos_rust_part)
  32. target_include_directories(kernel.out PRIVATE ${PROJECT_SOURCE_DIR}/include)
  33. target_link_options(kernel.out PRIVATE
  34. -T "${CMAKE_SOURCE_DIR}/src/kernel.ld"
  35. -L "${CMAKE_BINARY_DIR}/x86_64-unknown-none/${CARGO_BUILD_TYPE}"
  36. --no-check-sections
  37. )
  38. set_target_properties(kernel.out PROPERTIES LINK_DEPENDS "${CMAKE_SOURCE_DIR}/src/kernel.ld")
  39. set_target_properties(kernel.out PROPERTIES LINKER_LANGUAGE CXX)
  40. set_source_files_properties(src/mbr.S PROPERTIES OBJECT_DEPENDS
  41. "${CMAKE_BINARY_DIR}/x86_64-unknown-none/${CARGO_BUILD_TYPE}/libgbos_rust_part.a"
  42. )
  43. add_custom_target(rustpart
  44. COMMAND cargo build ${CARGO_BUILD_FLAGS}
  45. )
  46. add_custom_command(OUTPUT mbr_hole.bin
  47. DEPENDS kernel.out
  48. COMMAND ${CMAKE_OBJCOPY} --strip-debug -O binary ${CMAKE_BINARY_DIR}/kernel.out mbr_hole.bin
  49. )
  50. add_custom_target(boot.img
  51. DEPENDS mbr_hole.bin
  52. DEPENDS user_space_programs
  53. COMMAND make -C ${CMAKE_SOURCE_DIR} image
  54. )
  55. add_custom_command(OUTPUT run
  56. POST_BUILD
  57. DEPENDS boot.img
  58. COMMAND bochs -f ${CMAKE_SOURCE_DIR}/bochs.conf
  59. )