CMakeLists.txt 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  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(CMAKE_ASM_FLAGS "-m32")
  7. set(C_CXX_FLAGS "-nostdinc -m32 -nostdlib -W -Wall -Wextra -Wno-builtin-declaration-mismatch -Wno-format -fverbose-asm -fno-exceptions -ffreestanding -fno-pic -mstack-protector-guard=global")
  8. set(CMAKE_C_FLAGS "${C_CXX_FLAGS} -Werror=implicit-int -Werror=implicit-function-declaration -Werror=strict-aliasing")
  9. set(CMAKE_CXX_FLAGS "${C_CXX_FLAGS} -fno-use-cxa-atexit -fno-rtti")
  10. set(CMAKE_CXX_LINK_FLAGS "")
  11. set(CMAKE_CXX_STANDARD 20)
  12. if (CMAKE_BUILD_TYPE STREQUAL "Debug")
  13. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0 -g")
  14. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O0 -g")
  15. elseif(CMAKE_BUILD_TYPE STREQUAL "Release")
  16. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2")
  17. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2")
  18. endif()
  19. if (NOT DEFINED FDISK_BIN)
  20. set(FDISK_BIN fdisk)
  21. endif()
  22. add_subdirectory(gblibc)
  23. add_subdirectory(user-space-program)
  24. set(BOOTLOADER_SOURCES src/boot.s
  25. src/asm/interrupt.s
  26. src/asm/port_io.s
  27. src/asm/sys.s
  28. )
  29. set(KERNEL_MAIN_SOURCES src/fs/fat.cpp
  30. src/kinit.cpp
  31. src/kernel/interrupt.cpp
  32. src/kernel/process.cpp
  33. src/kernel/tty.cpp
  34. src/kernel/syscall.cpp
  35. src/kernel/mem.cpp
  36. src/kernel/vfs.cpp
  37. src/kernel/vga.cpp
  38. src/kernel/hw/ata.cpp
  39. src/kernel/hw/keyboard.cpp
  40. src/kernel/hw/serial.cpp
  41. src/kernel/hw/timer.c
  42. src/kernel/event/event.cpp
  43. src/kernel/signal.cpp
  44. src/types/bitmap.c
  45. src/types/elf.cpp
  46. src/types/libstdcpp.cpp
  47. include/asm/port_io.h
  48. include/asm/sys.h
  49. include/fs/fat.hpp
  50. include/kernel/event/event.h
  51. include/kernel/event/evtqueue.hpp
  52. include/kernel/tty.hpp
  53. include/kernel/interrupt.h
  54. include/kernel/process.hpp
  55. include/kernel/syscall.hpp
  56. include/kernel/mem.h
  57. include/kernel/mm.hpp
  58. include/kernel/vfs.hpp
  59. include/kernel/vga.hpp
  60. include/kernel/signal.hpp
  61. include/kernel/hw/ata.hpp
  62. include/kernel/hw/keyboard.h
  63. include/kernel/hw/port.hpp
  64. include/kernel/hw/serial.h
  65. include/kernel/hw/timer.h
  66. include/kernel/input/keycodes.h
  67. include/kernel/input/input_event.h
  68. include/types/bitmap.h
  69. include/types/buffer.hpp
  70. include/types/elf.hpp
  71. include/types/hash_map.hpp
  72. include/types/map.hpp
  73. include/types/pair.hpp
  74. include/types/types.h
  75. include/types/size.h
  76. include/types/status.h
  77. include/types/allocator.hpp
  78. include/types/cplusplus.hpp
  79. include/types/list.hpp
  80. include/types/lock.hpp
  81. include/types/string.hpp
  82. include/types/vector.hpp
  83. include/types/function.hpp
  84. include/kernel/log.hpp
  85. )
  86. add_executable(kernel.out ${KERNEL_MAIN_SOURCES} ${BOOTLOADER_SOURCES})
  87. target_link_libraries(kernel.out gblibc)
  88. target_include_directories(kernel.out PRIVATE ${PROJECT_SOURCE_DIR}/include)
  89. target_link_options(kernel.out PRIVATE
  90. -T ${CMAKE_SOURCE_DIR}/src/kernel.ld -melf_i386 -lgblibc -L${CMAKE_BINARY_DIR}/gblibc)
  91. set_target_properties(kernel.out PROPERTIES LINK_DEPENDS ${CMAKE_SOURCE_DIR}/src/kernel.ld)
  92. add_custom_command(OUTPUT mbr.bin
  93. DEPENDS ${PROJECT_SOURCE_DIR}/src/mbr.S ${PROJECT_SOURCE_DIR}/src/mbr.ld
  94. COMMAND ${CMAKE_ASM_COMPILER} -m32 -c ${PROJECT_SOURCE_DIR}/src/mbr.S -o mbr.o
  95. COMMAND ${CMAKE_LINKER} -T ${PROJECT_SOURCE_DIR}/src/mbr.ld mbr.o -o mbr.bin
  96. )
  97. add_custom_command(OUTPUT mbr_hole.bin
  98. DEPENDS kernel.out
  99. COMMAND ${CMAKE_OBJCOPY} --strip-debug -O binary ${CMAKE_BINARY_DIR}/kernel.out mbr_hole.bin
  100. )
  101. add_custom_target(boot.img
  102. DEPENDS mbr.bin
  103. DEPENDS mbr_hole.bin
  104. DEPENDS user_space_programs
  105. COMMAND dd if=mbr.bin of=boot.img
  106. COMMAND cat mbr_hole.bin >> boot.img
  107. COMMAND dd if=/dev/zero of=boot.img bs=`expr 512 \\* 1024 \\* 1024` count=0 seek=1
  108. COMMAND sh -c \"echo n\; echo\; echo\; echo\; echo\; echo a\; echo w\" | ${FDISK_BIN} boot.img
  109. COMMAND mkfs.fat --offset=2048 -v -n SYSTEM boot.img
  110. COMMAND mcopy -i boot.img@@1M ${CMAKE_BINARY_DIR}/user-space-program/hello-world.out ::hello
  111. COMMAND mcopy -i boot.img@@1M ${CMAKE_BINARY_DIR}/user-space-program/interrupt-test.out ::int
  112. COMMAND mcopy -i boot.img@@1M ${CMAKE_BINARY_DIR}/user-space-program/stack-test.out ::stack
  113. COMMAND mcopy -i boot.img@@1M ${CMAKE_BINARY_DIR}/user-space-program/init.out ::init
  114. COMMAND mcopy -i boot.img@@1M ${CMAKE_BINARY_DIR}/user-space-program/sh.out ::sh
  115. COMMAND mcopy -i boot.img@@1M ${CMAKE_BINARY_DIR}/user-space-program/priv-test.out ::priv
  116. COMMAND mcopy -i boot.img@@1M ${CMAKE_BINARY_DIR}/user-space-program/lazybox.out ::lazybox
  117. COMMAND mcopy -i boot.img@@1M ${CMAKE_BINARY_DIR}/user-space-program/lazybox.out ::pwd
  118. )
  119. add_custom_command(OUTPUT run
  120. POST_BUILD
  121. DEPENDS boot.img
  122. COMMAND bochs -f ${CMAKE_SOURCE_DIR}/bochs.conf
  123. )