CMakeLists.txt 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  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_ASM_FILES arch/src/riscv64/boot.s)
  16. set(ARCH_LINKER_SCRIPT "${CMAKE_SOURCE_DIR}/arch/src/riscv64/kernel.ld")
  17. set(RUST_TARGET "riscv64gc-unknown-none-elf")
  18. else()
  19. message(FATAL_ERROR "Unsupported architecture: ${ARCH}")
  20. endif()
  21. set(CMAKE_CXX_LINK_EXECUTABLE
  22. "<CMAKE_LINKER> <CMAKE_CXX_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>")
  23. 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")
  24. set(CMAKE_C_FLAGS "${C_CXX_FLAGS} -Werror=implicit-int -Werror=implicit-function-declaration -Werror=strict-aliasing")
  25. set(CMAKE_CXX_FLAGS "${C_CXX_FLAGS} -fno-use-cxa-atexit -fno-rtti")
  26. set(CMAKE_CXX_LINK_FLAGS "-z noexecstack --gc-sections")
  27. SET(CMAKE_ASM_FLAGS "${CFLAGS} -x assembler-with-cpp")
  28. set(CMAKE_CXX_STANDARD 20)
  29. if (CMAKE_BUILD_TYPE STREQUAL "Debug")
  30. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DDEBUG -O0 -g")
  31. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DDEBUG -O0 -g")
  32. set(CARGO_BUILD_TYPE "debug")
  33. set(CARGO_BUILD_FLAGS "")
  34. elseif(CMAKE_BUILD_TYPE STREQUAL "Release")
  35. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2 -g -DNDEBUG")
  36. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2 -g -DNDEBUG")
  37. set(CARGO_BUILD_TYPE "release")
  38. set(CARGO_BUILD_FLAGS "--release")
  39. endif()
  40. if (NOT DEFINED FDISK_BIN)
  41. set(FDISK_BIN fdisk)
  42. endif()
  43. add_subdirectory(gblibc)
  44. add_subdirectory(gblibstdc++)
  45. add_subdirectory(user-space-program)
  46. if(ARCH STREQUAL "x86_64")
  47. set(BOOTLOADER_SOURCES arch/src/x86_64/boot.s
  48. arch/src/x86_64/mbr.S
  49. )
  50. elseif(ARCH STREQUAL "riscv64")
  51. set(BOOTLOADER_SOURCES arch/src/riscv64/boot.s
  52. arch/src/riscv64/entry.S
  53. )
  54. endif()
  55. #[[set(KERNEL_ARCH_SOURCES "")
  56. if(ARCH STREQUAL "x86_64")
  57. set(KERNEL_ARCH_SOURCES arch/src/x86_64/init.cpp
  58. arch/src/x86_64/interrupt.cpp
  59. # more
  60. )
  61. elseif(ARCH STREQUAL "riscv64")
  62. set(KERNEL_ARCH_SOURCES arch/src/riscv64/init.cpp
  63. arch/src/riscv64/trap.cpp
  64. # more
  65. )
  66. endif()]]
  67. set(KERNEL_MAIN_SOURCES src/kinit.cpp
  68. src/kernel/async/lock.cc
  69. src/kernel/allocator.cc
  70. src/kernel/mem/slab.cc
  71. src/kernel/hw/acpi.cc
  72. src/kernel/hw/pci.cc
  73. src/types/libstdcpp.cpp
  74. include/defs.hpp
  75. include/kernel/async/lock.hpp
  76. include/kernel/mem/paging.hpp
  77. include/kernel/mem/slab.hpp
  78. include/kernel/mem/types.hpp
  79. include/kernel/utsname.hpp
  80. include/kernel/hw/acpi.hpp
  81. include/kernel/hw/pci.hpp
  82. include/kernel/hw/port.hpp
  83. include/types/list.hpp
  84. include/types/types.h
  85. include/types/allocator.hpp
  86. include/kernel/log.hpp
  87. #${KERNEL_ARCH_SOURCES}
  88. )
  89. add_executable(kernel.out ${KERNEL_MAIN_SOURCES} ${BOOTLOADER_SOURCES})
  90. add_dependencies(kernel.out rustpart)
  91. target_link_libraries(kernel.out gblibc gblibstdc++ gbos_rust_part)
  92. target_include_directories(kernel.out PRIVATE ${PROJECT_SOURCE_DIR}/include)
  93. target_link_options(kernel.out PRIVATE
  94. -T "${ARCH_LINKER_SCRIPT}"
  95. -L "${CMAKE_BINARY_DIR}/${RUST_TARGET}/${CARGO_BUILD_TYPE}"
  96. --no-check-sections
  97. )
  98. set_target_properties(kernel.out PROPERTIES LINK_DEPENDS "${ARCH_LINKER_SCRIPT}")
  99. if(ARCH STREQUAL "x86_64")
  100. set_source_files_properties(arch/src/x86_64/mbr.S PROPERTIES OBJECT_DEPENDS
  101. "${CMAKE_BINARY_DIR}/${RUST_TARGET}/${CARGO_BUILD_TYPE}/libgbos_rust_part.a"
  102. )
  103. endif()
  104. add_custom_target(rustpart
  105. COMMAND cargo build ${CARGO_BUILD_FLAGS} --target=${RUST_TARGET}
  106. )
  107. add_custom_command(OUTPUT mbr_hole.bin
  108. DEPENDS kernel.out
  109. COMMAND ${CMAKE_OBJCOPY} --strip-debug -O binary ${CMAKE_BINARY_DIR}/kernel.out mbr_hole.bin
  110. )
  111. add_custom_target(boot.img
  112. DEPENDS mbr_hole.bin
  113. DEPENDS user_space_programs
  114. COMMAND make -C ${CMAKE_SOURCE_DIR} image
  115. )
  116. add_custom_command(OUTPUT run
  117. POST_BUILD
  118. DEPENDS boot.img
  119. COMMAND bochs -f ${CMAKE_SOURCE_DIR}/bochs.conf
  120. )