CMakeLists.txt 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. cmake_minimum_required(VERSION 3.15)
  2. project(kernel_main C CXX ASM)
  3. set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
  4. if(NOT DEFINED ARCH)
  5. set(ARCH "x86_64" CACHE STRING "Target architecture")
  6. endif()
  7. message(STATUS "Building for architecture: ${ARCH}")
  8. if(ARCH STREQUAL "x86_64")
  9. set(ARCH_C_CXX_FLAGS "-mno-sse -mno-mmx -mno-red-zone -mcmodel=kernel")
  10. set(ARCH_ASM_FILES arch/src/x86_64/boot.s)
  11. set(ARCH_LINKER_SCRIPT "${CMAKE_SOURCE_DIR}/arch/src/x86_64/kernel.ld")
  12. set(RUST_TARGET "x86_64-unknown-none")
  13. elseif(ARCH STREQUAL "riscv64")
  14. set(ARCH_C_CXX_FLAGS "-march=rv64gc")
  15. set(ARCH_LINKER_SCRIPT "${CMAKE_SOURCE_DIR}/arch/src/riscv64/kernel.ld")
  16. set(RUST_TARGET "riscv64gc-unknown-none-elf")
  17. else()
  18. message(FATAL_ERROR "Unsupported architecture: ${ARCH}")
  19. endif()
  20. set(CMAKE_CXX_LINK_EXECUTABLE
  21. "<CMAKE_LINKER> <CMAKE_CXX_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>")
  22. set(C_CXX_FLAGS "-nostdinc -nostdlib ${ARCH_C_CXX_FLAGS} -W -Wall -Wextra -Wno-stringop-overflow -Wno-builtin-declaration-mismatch -Wno-format -fverbose-asm -fno-exceptions -ffreestanding -fno-pic -mstack-protector-guard=global")
  23. set(CMAKE_C_FLAGS "${C_CXX_FLAGS} -Werror=implicit-int -Werror=implicit-function-declaration -Werror=strict-aliasing")
  24. set(CMAKE_CXX_FLAGS "${C_CXX_FLAGS} -fno-use-cxa-atexit -fno-rtti")
  25. set(CMAKE_CXX_LINK_FLAGS "-z noexecstack --gc-sections")
  26. SET(CMAKE_ASM_FLAGS "${CFLAGS} -x assembler-with-cpp")
  27. set(CMAKE_CXX_STANDARD 20)
  28. if (CMAKE_BUILD_TYPE STREQUAL "Debug")
  29. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DDEBUG -O0 -g")
  30. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DDEBUG -O0 -g")
  31. set(CARGO_BUILD_TYPE "debug")
  32. set(CARGO_BUILD_FLAGS "")
  33. elseif(CMAKE_BUILD_TYPE STREQUAL "Release")
  34. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2 -g -DNDEBUG")
  35. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2 -g -DNDEBUG")
  36. set(CARGO_BUILD_TYPE "release")
  37. set(CARGO_BUILD_FLAGS "--release")
  38. endif()
  39. if (NOT DEFINED FDISK_BIN)
  40. set(FDISK_BIN fdisk)
  41. endif()
  42. add_subdirectory(gblibc)
  43. add_subdirectory(gblibstdc++)
  44. add_subdirectory(user-space-program)
  45. if(ARCH STREQUAL "x86_64")
  46. set(BOOTLOADER_SOURCES arch/src/x86_64/boot.s
  47. arch/src/x86_64/mbr.S
  48. )
  49. endif()
  50. #[[set(KERNEL_ARCH_SOURCES "")
  51. if(ARCH STREQUAL "x86_64")
  52. set(KERNEL_ARCH_SOURCES arch/src/x86_64/init.cpp
  53. arch/src/x86_64/interrupt.cpp
  54. # more
  55. )
  56. elseif(ARCH STREQUAL "riscv64")
  57. set(KERNEL_ARCH_SOURCES arch/src/riscv64/init.cpp
  58. arch/src/riscv64/trap.cpp
  59. # more
  60. )
  61. endif()]]
  62. set(KERNEL_MAIN_SOURCES src/kinit.cpp
  63. src/kernel/async/lock.cc
  64. src/kernel/allocator.cc
  65. src/kernel/mem/slab.cc
  66. src/kernel/hw/acpi.cc
  67. src/kernel/hw/pci.cc
  68. src/types/libstdcpp.cpp
  69. include/defs.hpp
  70. include/kernel/async/lock.hpp
  71. include/kernel/mem/paging.hpp
  72. include/kernel/mem/slab.hpp
  73. include/kernel/mem/types.hpp
  74. include/kernel/utsname.hpp
  75. include/kernel/hw/acpi.hpp
  76. include/kernel/hw/pci.hpp
  77. include/kernel/hw/port.hpp
  78. include/types/list.hpp
  79. include/types/types.h
  80. include/types/allocator.hpp
  81. include/kernel/log.hpp
  82. #${KERNEL_ARCH_SOURCES}
  83. )
  84. add_executable(kernel.out ${KERNEL_MAIN_SOURCES} ${BOOTLOADER_SOURCES})
  85. add_dependencies(kernel.out rustpart)
  86. target_link_libraries(kernel.out gblibc gblibstdc++ gbos_rust_part)
  87. target_include_directories(kernel.out PRIVATE ${PROJECT_SOURCE_DIR}/include)
  88. target_link_options(kernel.out PRIVATE
  89. -T "${ARCH_LINKER_SCRIPT}"
  90. -L "${CMAKE_BINARY_DIR}/${RUST_TARGET}/${CARGO_BUILD_TYPE}"
  91. --no-check-sections
  92. )
  93. set_target_properties(kernel.out PROPERTIES LINK_DEPENDS "${ARCH_LINKER_SCRIPT}")
  94. if(ARCH STREQUAL "x86_64")
  95. set_source_files_properties(arch/src/x86_64/mbr.S PROPERTIES OBJECT_DEPENDS
  96. "${CMAKE_BINARY_DIR}/${RUST_TARGET}/${CARGO_BUILD_TYPE}/libgbos_rust_part.a"
  97. )
  98. endif()
  99. add_custom_target(rustpart
  100. COMMAND cargo build ${CARGO_BUILD_FLAGS} --target=${RUST_TARGET}
  101. )
  102. add_custom_command(OUTPUT mbr_hole.bin
  103. DEPENDS kernel.out
  104. COMMAND ${CMAKE_OBJCOPY} --strip-debug -O binary ${CMAKE_BINARY_DIR}/kernel.out mbr_hole.bin
  105. )
  106. add_custom_target(boot.img
  107. DEPENDS mbr_hole.bin
  108. DEPENDS user_space_programs
  109. COMMAND make -C ${CMAKE_SOURCE_DIR} image
  110. )
  111. add_custom_command(OUTPUT run
  112. POST_BUILD
  113. DEPENDS boot.img
  114. COMMAND bochs -f ${CMAKE_SOURCE_DIR}/bochs.conf
  115. )