aboutsummaryrefslogtreecommitdiff
path: root/kernel/CMakeLists.txt
blob: 73eea0c34db439a8d62d7b4d0f63f433e9ab7940 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
cmake_minimum_required(VERSION 3.21)
project(kernel C ASM)

set(SRC
  boot/init/boot.s
  boot/gdt/gdt.c
  boot/gdt/gdt.s

  kernel/kernel.c
  kernel/halt.c
  kernel/stack_smashing_protector.c
  kernel/io/io.c

  mm/memory_map.c
  mm/physical_mm/physical_mm.c

  drivers/vga_text_buffer/vga_text_buffer.c
  drivers/serial/serial.c

  libk/strlen.c
  libk/printk.c
  libk/printf.c
)

add_executable(kernel ${SRC})
target_include_directories(kernel PRIVATE include)

set(C_COMPILE_OPTIONS
  -ffreestanding

  -fstack-protector
  -fstack-protector-all

  -O3

  -Wall
  -Wextra
  -pedantic

  -g
)

target_compile_options(kernel PRIVATE 
  $<$<COMPILE_LANGUAGE:C>: ${C_COMPILE_OPTIONS}>
)

set(LINKER_SCRIPT "${CMAKE_CURRENT_SOURCE_DIR}/boot/linker.ld")
set(LINKER_FLAGS
  -T ${LINKER_SCRIPT}
  -nostdlib
)

execute_process(COMMAND ${CMAKE_C_COMPILER}
  -print-file-name=crtbegin.o
  OUTPUT_VARIABLE CRTBEGIN_O
  OUTPUT_STRIP_TRAILING_WHITESPACE
)

execute_process(COMMAND ${CMAKE_C_COMPILER}
  -print-file-name=crtend.o
  OUTPUT_VARIABLE CRTEND_O
  OUTPUT_STRIP_TRAILING_WHITESPACE
)

add_library(crti OBJECT boot/init/crti.s)
add_library(crtn OBJECT boot/init/crtn.s)
add_dependencies(kernel crti crtn)

get_target_property(CRTI_SRC crti SOURCES)
get_target_property(CRTN_SRC crtn SOURCES)
get_target_property(CRTI_OUT crti BINARY_DIR)
get_target_property(CRTN_OUT crtn BINARY_DIR)

set(CRTI_O "${CRTI_OUT}/CMakeFiles/crti.dir/${CRTI_SRC}.o")
set(CRTN_O "${CRTN_OUT}/CMakeFiles/crtn.dir/${CRTN_SRC}.o")

# FIXME: This isn't a good way of setting the link order.
set(CMAKE_C_LINK_EXECUTABLE "${CMAKE_C_COMPILER} <CMAKE_C_LINK_FLAGS> <FLAGS> <LINK_FLAGS> \
  ${CRTI_O} \
  ${CRTBEGIN_O} \
  <OBJECTS> \
  ${CRTEND_O} \
  ${CRTN_O} \
  -o <TARGET> <LINK_LIBRARIES>"
)

target_link_options(kernel PRIVATE ${LINKER_FLAGS})