-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathMakefile
More file actions
178 lines (146 loc) · 5.62 KB
/
Makefile
File metadata and controls
178 lines (146 loc) · 5.62 KB
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# /======================\\`
# | /==================\`||;
# | | || |;||;
# | | ,, || ,, |;||;
# | | || || || |;||;
# | | || || || |;||;
# | | || `` || |;||;
# | | || || |;||;
# | \––––––––––––––––––/´||;
# \––––––––––––––––––––––//,
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# COPYRIGHT (c) 2025 MYTHOS PROJECT
# ALL RIGHTS RESERVED
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SHELL = C:\Windows\System32\cmd.exe
# 工具
GCC = gcc
ELF_GCC = x86_64-elf-gcc
LD = x86_64-elf-ld
QEMU = qemu-system-x86_64
# 构建模式
BUILD_MODE ?= debug
ifeq ($(BUILD_MODE),release)
OPTIMIZATION = -O3
DEBUG_FLAGS =
else
OPTIMIZATION = -O0
DEBUG_FLAGS = -g
endif
# 处理Windows控制台编码问题
ifeq ($(OS),Windows_NT)
CHCP = chcp 65001 > nul
else
CHCP = :
endif
# 编译和链接标志
GCC_FLAGS = -I includes -nostdlib -nostdinc -fno-builtin -Wl,--subsystem,10 -e $(ENTRY_POINT) -o
ELF_GCC_BASE_FLAGS = -I includes -Wall -Werror -ffreestanding -fno-exceptions -std=c99
ELF_GCC_FLAGS = $(ELF_GCC_BASE_FLAGS) $(OPTIMIZATION) $(DEBUG_FLAGS) -MMD -MP -c -o
LD_FLAGS = -e $(LD_ENTRY) -z norelro -Ttext-segment 0x100000 --static -o
QEMU_FLAGS = -bios ./OVMF.fd -net none -drive file=fat:rw:$(ESP_DIR),index=0,format=vvfat
# 入口点
ENTRY_POINT = entryPoint
LD_ENTRY = FlameCoreMain
# 目录
SRC_DIR = FlameCore
OBJ_DIR = build/obj
BIN_DIR = bin
ESP_DIR = esp
# BootLoader
BOOT_LOADER_SRC = BootLoader/BootLoader.c
BOOT_LOADER_EFI = $(BIN_DIR)\BootLoader.efi
# 源文件和对象文件
FLAMECORE_SRCS = $(wildcard $(SRC_DIR)/*.c) \
$(wildcard $(SRC_DIR)/*/*.c) \
$(wildcard $(SRC_DIR)/*/*/*.c)
FLAMECORE_OBJS = $(patsubst %.c,$(OBJ_DIR)/%.o,$(FLAMECORE_SRCS))
FLAMECORE_DEPS = $(FLAMECORE_OBJS:.o=.d)
FLAMECORE_ELF = $(BIN_DIR)\FlameCore.elf
# ESP路径
ESP_BOOTLOADER = $(ESP_DIR)\EFI\BOOT\BOOTX64.EFI
ESP_FLAMECORE = $(ESP_DIR)\FlameCore.elf
# 默认目标
all: info $(BIN_DIR) $(OBJ_DIR) $(ESP_DIR) efi objects link
# 目录创建
$(BIN_DIR):
@if not exist "$(BIN_DIR)" mkdir "$(BIN_DIR)"
@if not exist "$(BIN_DIR)/EFI" mkdir "$(BIN_DIR)/EFI"
@if not exist "$(BIN_DIR)/EFI/BOOT" mkdir "$(BIN_DIR)/EFI/BOOT"
$(OBJ_DIR):
@if not exist "$(OBJ_DIR)" mkdir "$(OBJ_DIR)"
@if not exist "$(OBJ_DIR)/$(SRC_DIR)" mkdir "$(OBJ_DIR)/$(SRC_DIR)"
@if not exist "$(OBJ_DIR)/$(SRC_DIR)/asm" mkdir "$(OBJ_DIR)/$(SRC_DIR)/asm"
@if not exist "$(OBJ_DIR)/$(SRC_DIR)/asm/gdt" mkdir "$(OBJ_DIR)/$(SRC_DIR)/asm/gdt"
@if not exist "$(OBJ_DIR)/$(SRC_DIR)/asm/hal" mkdir "$(OBJ_DIR)/$(SRC_DIR)/asm/hal"
@if not exist "$(OBJ_DIR)/$(SRC_DIR)/asm/idt" mkdir "$(OBJ_DIR)/$(SRC_DIR)/asm/idt"
@if not exist "$(OBJ_DIR)/$(SRC_DIR)/gui" mkdir "$(OBJ_DIR)/$(SRC_DIR)/gui"
@if not exist "$(OBJ_DIR)/$(SRC_DIR)/gui/console" mkdir "$(OBJ_DIR)/$(SRC_DIR)/gui/console"
@if not exist "$(OBJ_DIR)/$(SRC_DIR)/gui/graphic" mkdir "$(OBJ_DIR)/$(SRC_DIR)/gui/graphic"
@if not exist "$(OBJ_DIR)/$(SRC_DIR)/gui/view" mkdir "$(OBJ_DIR)/$(SRC_DIR)/gui/view"
@if not exist "$(OBJ_DIR)/$(SRC_DIR)/mem" mkdir "$(OBJ_DIR)/$(SRC_DIR)/mem"
@if not exist "$(OBJ_DIR)/$(SRC_DIR)/std" mkdir "$(OBJ_DIR)/$(SRC_DIR)/std"
$(ESP_DIR):
@if not exist "$(ESP_DIR)" mkdir "$(ESP_DIR)"
@if not exist "$(ESP_DIR)/EFI" mkdir "$(ESP_DIR)/EFI"
@if not exist "$(ESP_DIR)/EFI/BOOT" mkdir "$(ESP_DIR)/EFI/BOOT"
info:
@echo 欢迎来到 MythOS 的构建系统!
@echo 构建模式:$(BUILD_MODE)
@echo 正在准备构建环境...
clean:
@echo 正在清理构建产物...
@if exist "$(BIN_DIR)" rmdir /s /q "$(BIN_DIR)"
@if exist "$(OBJ_DIR)" rmdir /s /q "$(OBJ_DIR)"
@if exist "$(ESP_DIR)" rmdir /s /q "$(ESP_DIR)"
@echo 清理完成
efi: $(BIN_DIR) $(BOOT_LOADER_EFI)
$(BOOT_LOADER_EFI): $(BOOT_LOADER_SRC)
@echo 正在编译BootLoader...
@$(GCC) $(GCC_FLAGS) $@ $<
@echo 编译完成
objects: $(FLAMECORE_OBJS)
# 编译源文件为对象文件,并生成依赖文件
$(OBJ_DIR)/%.o: %.c
@echo 正在编译$<...
@if not exist "$(@D)" mkdir "$(@D)"
@$(ELF_GCC) $(ELF_GCC_FLAGS) $@ $<
@echo $< 编译完成
# 包含依赖文件,确保在源文件更改时重新编译相关对象文件
-include $(FLAMECORE_DEPS)
link: $(FLAMECORE_ELF)
$(FLAMECORE_ELF): $(FLAMECORE_OBJS)
@echo 正在链接...
@$(LD) $(LD_FLAGS) $@ $^
@echo 链接完成
install: $(FLAMECORE_ELF) $(BOOT_LOADER_EFI)
@echo 正在复制BootLoader和内核文件...
@copy $(BOOT_LOADER_EFI) $(ESP_BOOTLOADER)
@copy $(FLAMECORE_ELF) $(ESP_FLAMECORE)
@echo 安装完成
run: all install
@echo 正在运行 MythOS 于 QEMU 中...
@$(QEMU) $(QEMU_FLAGS)
debug: BUILD_MODE = debug
debug: all
release: BUILD_MODE = release
release: all
help:
@echo 可用的目标:
@echo all - 构建整个项目(默认目标)
@echo clean - 清理构建产物
@echo efi - 仅编译 BootLoader 的 EFI 文件
@echo objects - 仅编译内核的对象文件
@echo link - 仅链接生成内核的 ELF 文件
@echo -jn - 使用 n 个线程进行并行编译(例如: make -j4)
@echo debug - 构建带有调试符号的版本
@echo release - 构建优化过的版本
@echo run - 构建并运行 MythOS 在 QEMU 中
@echo install - 安装到 ESP 目录但不运行
@echo help - 显示此帮助信息
.PHONY: all clean info efi objects link install run debug release help
# 检查是否找到源文件
ifeq ($(FLAMECORE_SRCS),)
$(warning 没有找到 $(SRC_DIR) 中的源文件)
endif