CMakeLists.txt 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. cmake_minimum_required(VERSION 3.15)
  2. project(my_os_bootloader ASM)
  3. set(CMAKE_ASM_FLAGS "-m32")
  4. set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
  5. include_directories(${PROJECT_SOURCE_DIR}/include)
  6. set(EXTRACT_DIR ${PROJECT_BINARY_DIR}/extract)
  7. file(MAKE_DIRECTORY ${EXTRACT_DIR})
  8. set(BOOTLOADER_SOURCES src/boot.s
  9. src/asm/a20.s
  10. src/asm/interrupt.s
  11. src/asm/port_io.s
  12. src/asm/sys.s
  13. )
  14. add_library(bootloader STATIC ${BOOTLOADER_SOURCES})
  15. add_custom_command(OUTPUT mbr.bin
  16. DEPENDS ${PROJECT_SOURCE_DIR}/src/mbr.S ${PROJECT_SOURCE_DIR}/src/mbr.ld
  17. COMMAND ${CMAKE_ASM_COMPILER} -m32 -c ${PROJECT_SOURCE_DIR}/src/mbr.S -o mbr.o
  18. COMMAND ${CMAKE_LINKER} -T ${PROJECT_SOURCE_DIR}/src/mbr.ld mbr.o -o mbr.bin
  19. )
  20. add_custom_command(OUTPUT extracted_bootloader
  21. DEPENDS bootloader
  22. COMMAND ${CMAKE_AR} xf ${PROJECT_BINARY_DIR}/libbootloader.a --output=${EXTRACT_DIR}
  23. )
  24. project(kernel_main)
  25. 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")
  26. 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")
  27. set(CMAKE_CXX_STANDARD 20)
  28. if (CMAKE_BUILD_TYPE STREQUAL "Debug")
  29. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0 -g")
  30. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O0 -g")
  31. elseif(CMAKE_BUILD_TYPE STREQUAL "Release")
  32. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2")
  33. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2")
  34. endif()
  35. if (NOT DEFINED FDISK_BIN)
  36. set(FDISK_BIN fdisk)
  37. endif()
  38. set(KERNEL_MAIN_SOURCES src/fs/fat.cpp
  39. src/kernel_main.cpp
  40. src/kernel/errno.c
  41. src/kernel/interrupt.cpp
  42. src/kernel/process.cpp
  43. src/kernel/tty.cpp
  44. src/kernel/stdio.cpp
  45. src/kernel/syscall.cpp
  46. src/kernel/mem.cpp
  47. src/kernel/vfs.cpp
  48. src/kernel/vga.cpp
  49. src/kernel/hw/ata.cpp
  50. src/kernel/hw/keyboard.cpp
  51. src/kernel/hw/serial.cpp
  52. src/kernel/hw/timer.c
  53. src/kernel/event/event.cpp
  54. src/types/bitmap.c
  55. src/types/elf.cpp
  56. src/types/libstdcpp.cpp
  57. include/asm/boot.h
  58. include/asm/port_io.h
  59. include/asm/sys.h
  60. include/fs/fat.hpp
  61. include/kernel/event/event.h
  62. include/kernel/event/evtqueue.hpp
  63. include/kernel/errno.h
  64. include/kernel/tty.hpp
  65. include/kernel/interrupt.h
  66. include/kernel/process.hpp
  67. include/kernel/stdio.hpp
  68. include/kernel/syscall.hpp
  69. include/kernel/mem.h
  70. include/kernel/mm.hpp
  71. include/kernel/vfs.hpp
  72. include/kernel/vga.hpp
  73. include/kernel/hw/ata.hpp
  74. include/kernel/hw/keyboard.h
  75. include/kernel/hw/port.hpp
  76. include/kernel/hw/serial.h
  77. include/kernel/hw/timer.h
  78. include/kernel/input/keycodes.h
  79. include/kernel/input/input_event.h
  80. include/types/assert.h
  81. include/types/bitmap.h
  82. include/types/buffer.hpp
  83. include/types/elf.hpp
  84. include/types/hash_map.hpp
  85. include/types/map.hpp
  86. include/types/pair.hpp
  87. include/types/types.h
  88. include/types/size.h
  89. include/types/status.h
  90. include/types/stdint.h
  91. include/types/allocator.hpp
  92. include/types/cplusplus.hpp
  93. include/types/list.hpp
  94. include/types/lock.hpp
  95. include/types/string.hpp
  96. include/types/vector.hpp
  97. include/types/function.hpp
  98. include/kernel_main.hpp
  99. )
  100. add_library(kernel_main STATIC ${KERNEL_MAIN_SOURCES})
  101. add_custom_command(OUTPUT extracted_kernel_main
  102. DEPENDS kernel_main
  103. COMMAND ${CMAKE_AR} xf ${PROJECT_BINARY_DIR}/libkernel_main.a --output=${EXTRACT_DIR}
  104. )
  105. add_custom_target(user_space_programs
  106. COMMAND cp ${CMAKE_SOURCE_DIR}/user-space-program/Makefile.src ${CMAKE_SOURCE_DIR}/user-space-program/Makefile
  107. COMMAND make -C ${CMAKE_SOURCE_DIR}/user-space-program CROSS_COMPILE=${TOOLCHAIN_PATH_AND_PREFIX} all
  108. )
  109. add_custom_target(kernel.out
  110. DEPENDS extracted_bootloader
  111. DEPENDS extracted_kernel_main
  112. DEPENDS user_space_programs
  113. DEPENDS ${CMAKE_SOURCE_DIR}/src/kernel.ld
  114. COMMAND ${CMAKE_LINKER} -T ${CMAKE_SOURCE_DIR}/src/kernel.ld ${EXTRACT_DIR}/*.o
  115. -melf_i386 -o ${CMAKE_BINARY_DIR}/kernel.out
  116. )
  117. add_custom_target(mbr_hole.bin
  118. DEPENDS kernel.out
  119. COMMAND ${CMAKE_OBJCOPY} --strip-debug -O binary ${CMAKE_BINARY_DIR}/kernel.out mbr_hole.bin
  120. )
  121. add_custom_target(boot.img
  122. DEPENDS mbr.bin
  123. DEPENDS mbr_hole.bin
  124. DEPENDS user_space_programs
  125. COMMAND dd if=mbr.bin of=boot.img
  126. COMMAND cat mbr_hole.bin >> boot.img
  127. COMMAND dd if=/dev/zero of=boot.img bs=`expr 512 \\* 1024 \\* 1024` count=0 seek=1
  128. COMMAND sh -c \"echo n\; echo\; echo\; echo\; echo\; echo a\; echo w\" | ${FDISK_BIN} boot.img
  129. COMMAND mkfs.fat --offset=2048 -v -n SYSTEM boot.img
  130. COMMAND mcopy -i boot.img@@1M ${CMAKE_SOURCE_DIR}/user-space-program/build/hello-world.out ::hello.out
  131. COMMAND mcopy -i boot.img@@1M ${CMAKE_SOURCE_DIR}/user-space-program/build/interrupt-test.out ::int.out
  132. COMMAND mcopy -i boot.img@@1M ${CMAKE_SOURCE_DIR}/user-space-program/build/stack-test.out ::stack.out
  133. COMMAND mcopy -i boot.img@@1M ${CMAKE_SOURCE_DIR}/user-space-program/build/init.out ::init.elf
  134. )
  135. add_custom_command(OUTPUT run
  136. POST_BUILD
  137. DEPENDS boot.img
  138. COMMAND bochs -f ${CMAKE_SOURCE_DIR}/bochs.conf
  139. )