|
1 | | -# ============================================== |
2 | | -# Makefile for KintsugiOS |
3 | | -# ============================================== |
| 1 | +ASM = nasm |
| 2 | +CC = i386-elf-gcc |
| 3 | +LD = i386-elf-ld |
| 4 | +GRUB = grub2-mkrescue |
4 | 5 |
|
5 | | -ASM = nasm |
6 | | -CC = i386-elf-gcc |
7 | | -LD = i386-elf-ld |
8 | 6 | SRC_DIR = src |
9 | 7 | BIN_DIR = bin |
10 | | -DISKIMG_DIR = diskimgs |
11 | | -DISKIMG_NAME = kintsugi_floppy_i386.img |
12 | | -HDDIMG_NAME = kintsugi_hdd_i386.img |
13 | | -FAT12_HDD_NAME = kintsugi_fat12_hdd.img |
14 | | -ISO_NAME = KintsugiOS.iso |
| 8 | +ISO_DIR = isodir |
15 | 9 |
|
16 | | -FAT12_TEST_FILES = test_files/README.TXT |
17 | | -TEST_FILES_DIR = test_files |
| 10 | +CFLAGS = -m32 -nostdlib -nostdinc -fno-builtin -fno-stack-protector \ |
| 11 | + -nostartfiles -nodefaultlibs -Wall -Wextra -ffreestanding \ |
| 12 | + -g -I$(SRC_DIR)/kernel/include |
18 | 13 |
|
19 | | -MKISOFS = genisoimage |
20 | | -XORRISO = xorriso |
| 14 | +ASMFLAGS_ELF = -f elf32 |
21 | 15 |
|
22 | | -KERNEL_OFFSET = 0x007e00 |
| 16 | +C_SOURCES = $(shell find $(SRC_DIR) -name '*.c') |
| 17 | +ASM_SOURCES = $(SRC_DIR)/bootloader/kernel_entry.asm \ |
| 18 | + $(SRC_DIR)/kernel/multiboot.asm \ |
| 19 | + $(SRC_DIR)/kernel/cpu/interrupt.asm |
23 | 20 |
|
24 | | -CFLAGS = -g -m32 -nostdlib -nostdinc -fno-builtin -fno-stack-protector -nostartfiles -nodefaultlibs -Wall -Wextra -ffreestanding -I$(SRC_DIR)/kernel/include |
25 | | -ASMFLAGS_BIN = -f bin |
26 | | -ASMFLAGS_ELF = -f elf |
27 | | -LDFLAGS = -Ttext $(KERNEL_OFFSET) --oformat binary |
| 21 | +C_OBJS = $(C_SOURCES:$(SRC_DIR)/%.c=$(BIN_DIR)/%.o) |
| 22 | +ASM_OBJS = $(ASM_SOURCES:$(SRC_DIR)/%.asm=$(BIN_DIR)/%.o) |
28 | 23 |
|
29 | | -KERNEL_ENTRY = $(BIN_DIR)/bootloader/kernel_entry.o |
30 | | -INTERRUPT_OBJ = $(BIN_DIR)/kernel/cpu/interrupt.o |
| 24 | +OBJS = $(ASM_OBJS) $(C_OBJS) |
31 | 25 |
|
32 | | -C_SOURCES = $(shell find $(SRC_DIR) -name '*.c') |
33 | | -C_OBJS = $(C_SOURCES:$(SRC_DIR)/%.c=$(BIN_DIR)/%.o) |
| 26 | +KERNEL_ELF = $(BIN_DIR)/kernel.elf |
| 27 | +ISO_NAME = diskimgs/KintsugiOS.iso |
34 | 28 |
|
35 | | -OBJS = $(KERNEL_ENTRY) $(INTERRUPT_OBJ) $(C_OBJS) |
| 29 | +all: $(ISO_NAME) |
36 | 30 |
|
37 | | -RED=\033[0;31m |
38 | | -GREEN=\033[0;32m |
39 | | -YELLOW=\033[0;33m |
40 | | -BLUE=\033[0;34m |
41 | | -CYAN=\033[0;36m |
42 | | -RESET=\033[0m |
43 | | - |
44 | | -all: $(BIN_DIR)/kintsugios.bin |
45 | | - |
46 | | -$(BIN_DIR)/kintsugios.bin: $(BIN_DIR)/bootsector.bin $(BIN_DIR)/kernel.bin |
47 | | - @python getversion.py __update_version 2>/dev/null || true |
48 | | - @printf "$(BLUE)[CAT] Cat %s %-42s -> %s$(RESET)\n" "bootsector" "kernel" "$(BIN_DIR)/kintsugios.bin" |
49 | | - @cat $^ > $@ |
50 | | - |
51 | | -$(BIN_DIR)/bootsector.bin: $(SRC_DIR)/bootloader/bootsector.asm |
52 | | - @printf "$(CYAN)[ASM] Compiling %-50s -> %s$(RESET)\n" "bootsector.asm" "bootsector.bin" |
53 | | - @mkdir -p $(BIN_DIR) |
54 | | - @$(ASM) $(ASMFLAGS_BIN) $< -o $@ |
55 | | - |
56 | | -$(BIN_DIR)/kernel.bin: $(OBJS) |
57 | | - @printf "$(BLUE)[LD] Linking %-50s -> %s$(RESET)\n" "$^" "$@" |
58 | | - @$(LD) $(LDFLAGS) $^ -o $@ |
59 | | - |
60 | | -$(BIN_DIR)/%.o: $(SRC_DIR)/%.asm |
61 | | - @printf "$(CYAN)[ASM] Compiling %-50s -> %s$(RESET)\n" "$<" "$@" |
62 | | - @mkdir -p $(dir $@) |
63 | | - @$(ASM) $(ASMFLAGS_ELF) $< -o $@ |
| 31 | +$(KERNEL_ELF): $(OBJS) $(SRC_DIR)/kernel/linker.ld |
| 32 | + $(LD) -m elf_i386 -T $(SRC_DIR)/kernel/linker.ld -o $@ $(OBJS) |
64 | 33 |
|
65 | 34 | $(BIN_DIR)/%.o: $(SRC_DIR)/%.c |
66 | | - @printf "$(CYAN)[CC] Compiling %-50s -> %s$(RESET)\n" "$<" "$@" |
67 | 35 | @mkdir -p $(dir $@) |
68 | | - @$(CC) $(CFLAGS) -c $< -o $@ |
69 | | - |
70 | | -# ============================================== |
71 | | -# DISK IMAGES |
72 | | -# ============================================== |
73 | | - |
74 | | -$(DISKIMG_DIR)/$(DISKIMG_NAME): $(BIN_DIR)/kintsugios.bin |
75 | | - @printf "$(BLUE)[IMG] Make Floppy IMG %-50s -> %s$(RESET)\n" "$(BIN_DIR)/kintsugios.bin" "$@" |
76 | | - @mkdir -p $(DISKIMG_DIR) |
77 | | - @dd if=/dev/zero of=$@.tmp bs=1024 count=1440 2>/dev/null |
78 | | - @dd if=$< of=$@.tmp conv=notrunc 2>/dev/null |
79 | | - @mv $@.tmp $@ |
80 | | - |
81 | | -$(DISKIMG_DIR)/$(HDDIMG_NAME): |
82 | | - @printf "$(BLUE)[IMG] Make Empty HDD IMG %-50s -> %s$(RESET)\n" "empty disk" "$@" |
83 | | - @mkdir -p $(DISKIMG_DIR) |
84 | | - @dd if=/dev/zero of=$@ bs=512 count=32768 2>/dev/null # 16MB disk |
85 | | - |
86 | | -$(DISKIMG_DIR)/$(FAT12_HDD_NAME): $(BIN_DIR)/kintsugios.bin $(FAT12_TEST_FILES) |
87 | | - @printf "$(BLUE)[FAT12] Creating FAT12 HDD image (ATA compatible)$(RESET)\n" |
88 | | - @mkdir -p $(DISKIMG_DIR) $(TEST_FILES_DIR) |
89 | | - |
90 | | - @dd if=/dev/zero of=$@.tmp bs=512 count=16384 2>/dev/null |
91 | | - |
92 | | - @printf "$(YELLOW)[FAT12] Formatting as FAT12...$(RESET)\n" |
93 | | - @if command -v mkfs.fat >/dev/null 2>&1; then \ |
94 | | - mkfs.fat -F12 $@.tmp 2>/dev/null; \ |
95 | | - elif command -v mkdosfs >/dev/null 2>&1; then \ |
96 | | - mkdosfs -F12 $@.tmp 2>/dev/null; \ |
97 | | - else \ |
98 | | - printf "$(RED)[ERROR] Need mkfs.fat or mkdosfs! Install dosfstools.$(RESET)\n"; \ |
99 | | - exit 1; \ |
100 | | - fi |
101 | | - |
102 | | - @printf "$(YELLOW)[FAT12] Copying test files...$(RESET)\n" |
103 | | - @if command -v mcopy >/dev/null 2>&1; then \ |
104 | | - for file in $(FAT12_TEST_FILES); do \ |
105 | | - mcopy -i $@.tmp $$file ::/ 2>/dev/null && \ |
106 | | - printf "$(GREEN)[OK] Copied $$file$(RESET)\n" || \ |
107 | | - printf "$(YELLOW)[WARN] Failed to copy $$file$(RESET)\n"; \ |
108 | | - done; \ |
109 | | - else \ |
110 | | - printf "$(YELLOW)[WARN] mcopy not found, creating empty FAT12$(RESET)\n"; \ |
111 | | - printf "$(YELLOW)[WARN] Install mtools for file copying$(RESET)\n"; \ |
112 | | - fi |
113 | | - |
114 | | - @mv $@.tmp $@ |
115 | | - @printf "$(GREEN)[FAT12] Created HDD with FAT12: $@ $(RESET)\n" |
116 | | - @printf "$(YELLOW)[NOTE] This is an HDD image, not floppy! Use with -hda$(RESET)\n" |
117 | | - |
118 | | -# ============================================== |
119 | | -# TEST FILES CREATION |
120 | | -# ============================================== |
121 | | - |
122 | | -$(TEST_FILES_DIR)/TEST.TXT: |
123 | | - @mkdir -p $(TEST_FILES_DIR) |
124 | | - @echo "Hello from KintsugiOS FAT12 Filesystem!" > $@ |
125 | | - @echo "This file was read from the HDD using ATA PIO driver." >> $@ |
126 | | - @echo "If you see this, your FAT12 implementation works!" >> $@ |
127 | | - @printf "$(GREEN)[FILE] Created $@$(RESET)\n" |
128 | | - |
129 | | -$(TEST_FILES_DIR)/README.TXT: |
130 | | - @mkdir -p $(TEST_FILES_DIR) |
131 | | - @echo "KintsugiOS" > $@ |
132 | | - @echo "====================" >> $@ |
133 | | - @echo "" >> $@ |
134 | | - @echo "This is a test file on the FAT12 HDD." >> $@ |
135 | | - @echo "The HDD is accessed via ATA PIO driver." >> $@ |
136 | | - @echo "The floppy contains the OS kernel." >> $@ |
137 | | - @echo "The HDD contains the filesystem." >> $@ |
138 | | - @printf "$(GREEN)[FILE] Created $@$(RESET)\n" |
139 | | - |
140 | | -$(TEST_FILES_DIR)/HELLO.TXT: |
141 | | - @mkdir -p $(TEST_FILES_DIR) |
142 | | - @echo "Hello World from FAT12!" > $@ |
143 | | - @printf "$(GREEN)[FILE] Created $@$(RESET)\n" |
144 | | - |
145 | | -# ============================================== |
146 | | -# ISO CREATION |
147 | | -# ============================================== |
148 | | - |
149 | | -check-iso-tools: |
150 | | - @if ! command -v $(MKISOFS) >/dev/null 2>&1 && ! command -v $(XORRISO) >/dev/null 2>&1; then \ |
151 | | - echo "Error: Neither genisoimage nor xorriso found. Install one of them to create ISO."; \ |
152 | | - exit 1; \ |
153 | | - fi |
| 36 | + $(CC) $(CFLAGS) -c $< -o $@ |
154 | 37 |
|
155 | | -$(DISKIMG_DIR)/$(ISO_NAME): $(DISKIMG_DIR)/$(DISKIMG_NAME) check-iso-tools |
156 | | - @printf "$(BLUE)[ISO] Creating ISO image %-50s -> %s$(RESET)\n" "$(DISKIMG_DIR)/$(DISKIMG_NAME)" "$@" |
157 | | - @if command -v $(MKISOFS) >/dev/null 2>&1; then \ |
158 | | - $(MKISOFS) -quiet -V 'KINTSUGI_OS' -input-charset iso8859-1 -o $@ -b $(DISKIMG_NAME) -hide boot.catalog -boot-load-size 4 -no-emul-boot $(DISKIMG_DIR); \ |
159 | | - elif command -v $(XORRISO) >/dev/null 2>&1; then \ |
160 | | - $(XORRISO) -as mkisofs -b $(DISKIMG_NAME) -o $@ $(DISKIMG_DIR); \ |
161 | | - fi |
162 | | - |
163 | | -# ============================================== |
164 | | -# PHONY TARGETS |
165 | | -# ============================================== |
166 | | - |
167 | | -diskimg: $(DISKIMG_DIR)/$(DISKIMG_NAME) |
168 | | - |
169 | | -hddimg: $(DISKIMG_DIR)/$(HDDIMG_NAME) |
| 38 | +$(BIN_DIR)/%.o: $(SRC_DIR)/%.asm |
| 39 | + @mkdir -p $(dir $@) |
| 40 | + $(ASM) $(ASMFLAGS_ELF) $< -o $@ |
170 | 41 |
|
171 | | -fat12hdd: $(DISKIMG_DIR)/$(FAT12_HDD_NAME) |
| 42 | +$(ISO_NAME): $(KERNEL_ELF) |
| 43 | + @mkdir -p $(ISO_DIR)/boot/grub |
| 44 | + @mkdir -p diskimgs |
| 45 | + cp $(KERNEL_ELF) $(ISO_DIR)/boot/kernel.elf |
| 46 | + cp src/grub.cfg $(ISO_DIR)/boot/grub/grub.cfg |
| 47 | + $(GRUB) -o $@ $(ISO_DIR) |
172 | 48 |
|
173 | | -iso: $(DISKIMG_DIR)/$(ISO_NAME) |
| 49 | +run: $(ISO_NAME) |
| 50 | + qemu-system-i386 -cdrom $< -m 64 |
174 | 51 |
|
175 | | -testfiles: $(FAT12_TEST_FILES) |
| 52 | +debug: $(KERNEL_ELF) |
| 53 | + qemu-system-i386 -cdrom $(ISO_NAME) -m 64 -s -S |
176 | 54 |
|
177 | 55 | clean: |
178 | | - @printf "$(RED)[CLEAN] Cleaning $(BIN_DIR) and $(DISKIMG_DIR)$(RESET)\n" |
179 | | - @rm -rf $(BIN_DIR)/* $(DISKIMG_DIR)/* |
180 | | - |
181 | | -clean_all: clean |
182 | | - @printf "$(RED)[CLEAN] Cleaning test files$(RESET)\n" |
183 | | - @rm -rf $(TEST_FILES_DIR) |
184 | | - |
185 | | -# ============================================== |
186 | | -# RUN TARGETS (QEMU) |
187 | | -# ============================================== |
188 | | - |
189 | | -run_bin: $(BIN_DIR)/kintsugios.bin |
190 | | - @printf "$(GREEN)[QEMU] Run from binary %-50s$(RESET)\n" "$(BIN_DIR)/kintsugios.bin" |
191 | | - @qemu-system-i386 -fda $(BIN_DIR)/kintsugios.bin -m 16 |
192 | | - |
193 | | -run_fda: $(DISKIMG_DIR)/$(DISKIMG_NAME) |
194 | | - @printf "$(GREEN)[QEMU] Run from floppy %-50s$(RESET)\n" "$<" |
195 | | - @qemu-system-i386 -fda $< -boot a -m 16 |
196 | | - |
197 | | -run_hdd: $(DISKIMG_DIR)/$(DISKIMG_NAME) $(DISKIMG_DIR)/$(HDDIMG_NAME) |
198 | | - @printf "$(GREEN)[QEMU] Run with HDD %-50s$(RESET)\n" "$<" |
199 | | - @qemu-system-i386 -fda $< -hda $(DISKIMG_DIR)/$(HDDIMG_NAME) -boot a -m 16 |
200 | | - |
201 | | -run_fat12: $(DISKIMG_DIR)/$(DISKIMG_NAME) $(DISKIMG_DIR)/$(FAT12_HDD_NAME) |
202 | | - @printf "$(GREEN)[QEMU] Running with FAT12 HDD (MAIN TEST)$(RESET)\n" |
203 | | - @printf "$(YELLOW)[CONFIG] Floppy: boot OS, HDD: FAT12 filesystem$(RESET)\n" |
204 | | - @qemu-system-i386 \ |
205 | | - -fda $(DISKIMG_DIR)/$(DISKIMG_NAME) \ |
206 | | - -hda $(DISKIMG_DIR)/$(FAT12_HDD_NAME) \ |
207 | | - -boot a \ |
208 | | - -m 16 \ |
209 | | - -display sdl \ |
210 | | - -name "KintsugiOS" |
211 | | - |
212 | | -run_iso: $(DISKIMG_DIR)/$(ISO_NAME) $(DISKIMG_DIR)/$(HDDIMG_NAME) |
213 | | - @printf "$(GREEN)[QEMU] Run ISO %-50s$(RESET)\n" "$<" |
214 | | - @qemu-system-i386 -hda ${DISKIMG_DIR}/$(HDDIMG_NAME) -cdrom $< -boot d -m 16 |
215 | | - |
216 | | -# ============================================== |
217 | | -# DEBUG TARGETS |
218 | | -# ============================================== |
219 | | - |
220 | | -debug_fda: $(DISKIMG_DIR)/$(DISKIMG_NAME) |
221 | | - @printf "$(GREEN)[QEMU] Debug floppy %-50s$(RESET)\n" "$<" |
222 | | - @qemu-system-i386 -fda $< -boot a -s -S -m 16 |
223 | | - |
224 | | -debug_hdd: $(DISKIMG_DIR)/$(DISKIMG_NAME) $(DISKIMG_DIR)/$(HDDIMG_NAME) |
225 | | - @printf "$(GREEN)[QEMU] Debug with HDD %-50s$(RESET)\n" "$<" |
226 | | - @qemu-system-i386 -fda $< -hda $(DISKIMG_DIR)/$(HDDIMG_NAME) -boot a -s -S -m 16 |
227 | | - |
228 | | -# DEBUG with FAT12 HDD |
229 | | -debug_fat12: $(DISKIMG_DIR)/$(DISKIMG_NAME) $(DISKIMG_DIR)/$(FAT12_HDD_NAME) |
230 | | - @printf "$(GREEN)[QEMU] Debug with FAT12 HDD %-50s$(RESET)\n" |
231 | | - @printf "$(YELLOW)[DEBUG] Start QEMU, then connect with: gdb -ex 'target remote localhost:1234'$(RESET)\n" |
232 | | - @qemu-system-i386 \ |
233 | | - -fda $(DISKIMG_DIR)/$(DISKIMG_NAME) \ |
234 | | - -hda $(DISKIMG_DIR)/$(FAT12_HDD_NAME) \ |
235 | | - -boot a \ |
236 | | - -s -S \ |
237 | | - -m 16 |
238 | | - |
239 | | -debug_iso: $(DISKIMG_DIR)/$(ISO_NAME) |
240 | | - @printf "$(GREEN)[QEMU] Debug ISO %-50s$(RESET)\n" "$<" |
241 | | - @qemu-system-i386 -cdrom $< -boot d -s -S -m 16 |
242 | | - |
243 | | -# ============================================== |
244 | | -# QUICK COMMANDS |
245 | | -# ============================================== |
246 | | - |
247 | | -quick: clean all testfiles fat12hdd run_fat12 |
248 | | - |
249 | | -re: clean all run_fat12 |
250 | | - |
251 | | -info: |
252 | | - @echo "=== KintsugiOS Disk Images ===" |
253 | | - @echo "Floppy (boot): $(DISKIMG_DIR)/$(DISKIMG_NAME)" |
254 | | - @echo "Empty HDD: $(DISKIMG_DIR)/$(HDDIMG_NAME)" |
255 | | - @echo "FAT12 HDD: $(DISKIMG_DIR)/$(FAT12_HDD_NAME)" |
256 | | - @echo "ISO: $(DISKIMG_DIR)/$(ISO_NAME)" |
257 | | - @echo "" |
258 | | - @echo "=== Useful Commands ===" |
259 | | - @echo "make run_fat12 - Run with FAT12 HDD (main test)" |
260 | | - @echo "make quick - Clean, build, create FAT12, run" |
261 | | - @echo "make debug_fat12 - Debug with FAT12 HDD" |
262 | | - @echo "make testfiles - Create test files only" |
263 | | - @echo "make fat12hdd - Create FAT12 HDD only" |
| 56 | + rm -rf $(BIN_DIR) $(ISO_DIR) diskimgs/ |
264 | 57 |
|
265 | | -.PHONY: all diskimg hddimg fat12hdd iso testfiles \ |
266 | | - clean clean_all \ |
267 | | - run_bin run_fda run_hdd run_fat12 run_iso \ |
268 | | - debug_fda debug_hdd debug_fat12 debug_iso \ |
269 | | - check-iso-tools quick re info |
| 58 | +.PHONY: all run debug clean |
0 commit comments