-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathMakefile
More file actions
431 lines (380 loc) · 18.1 KB
/
Copy pathMakefile
File metadata and controls
431 lines (380 loc) · 18.1 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
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
ASSEMBLER ?= nasm
SOURCE_DIR ?= SOURCE
SOURCE_KERNEL_DIR ?= $(SOURCE_DIR)/KERNEL
SOURCE_BOOTLOADER_DIR ?= $(SOURCE_DIR)/BOOTLOADER
OUTPUT_DIR ?= OUTPUT
OUTPUT_KERNEL_DIR ?= $(OUTPUT_DIR)/KERNEL
OUTPUT_BOOTLOADER_DIR ?= $(OUTPUT_DIR)/BOOTLOADER
OUTPUT_ISO_DIR ?= $(OUTPUT_DIR)/ISO
OUTPUT_USER_PROGRAMS_DIR ?= $(OUTPUT_DIR)/PROGRAMS
INPUT_ISO_DIR ?= ISO_DIR
ISO_NAME ?= atOS.iso
SOURCE_ROOT_USER_PROGRAMS_DIR := $(SOURCE_DIR)/PROGRAMS
PROGRAM_LIST_FILE := $(SOURCE_ROOT_USER_PROGRAMS_DIR)/USER_PROGRAMS.txt
KRNL_INCLUDES ?= \
-I$(SOURCE_DIR)/ \
-I$(SOURCE_KERNEL_DIR)/32RTOSKRNL/DRIVERS/VIDEO/ \
-I$(SOURCE_KERNEL_DIR)/32RTOSKRNL/DRIVERS/DISK/ \
-I$(SOURCE_KERNEL_DIR)/32RTOSKRNL/CPU/ \
-I$(SOURCE_KERNEL_DIR)/32RTOSKRNL/CPU/GDT/ \
-I$(SOURCE_KERNEL_DIR)/32RTOSKRNL/CPU/IDT/ \
-I$(SOURCE_KERNEL_DIR)/32RTOSKRNL/CPU/ISR/ \
-I$(SOURCE_KERNEL_DIR)/32RTOSKRNL/CPU/IRQ/ \
-I$(SOURCE_KERNEL_DIR)/32RTOSKRNL/MEMORY/ \
-I$(SOURCE_KERNEL_DIR)/32RTOSKRNL/CPU/PIT/ \
RTOSKRNL_INCLUDES ?= \
-I$(SOURCE_DIR)/ \
-I$(SOURCE_KERNEL_DIR)/32RTOSKRNL/DRIVERS/ \
-I$(SOURCE_KERNEL_DIR)/32RTOSKRNL/ \
-I$(SOURCE_KERNEL_DIR)/32RTOSKRNL/DRIVERS/ \
-I$(SOURCE_KERNEL_DIR)/32RTOSKRNL/CPU/ \
-I$(SOURCE_KERNEL_DIR)/32RTOSKRNL/MEMORY/ \
-I$(SOURCE_KERNEL_DIR)/32RTOSKRNL/DRIVERS/ \
-I$(SOURCE_KERNEL_DIR)/32RTOSKRNL/FS/ \
-I$(SOURCE_KERNEL_DIR)/32RTOSKRNL/RTOSKRNL/
CComp ?= gcc
CompArgs ?= -Wno-comment -Wno-unused-variable -Wno-pointer-sign -Wno-comments -m32 -ffreestanding -fno-pic -fno-pie -nostdlib -O0 -Wall -Wextra -fno-stack-protector -fno-builtin -fno-inline
KRNLCompArgs ?= $(CompArgs) $(KRNL_INCLUDES) -DKERNEL_ENTRY
RTOSKRNLCompArgs ?= $(CompArgs) $(RTOSKRNL_INCLUDES) -DRTOS_KERNEL -D__32RTOS__ -D__RTOS__ -D__KERNEL__
INPUT_ISO_DIR_SYSTEM ?= $(INPUT_ISO_DIR)/ATOS
INPUT_ISO_DIR_HOME ?= $(INPUT_ISO_DIR)/HOME
INPUT_ISO_DIR_PROGRAMS ?= $(INPUT_ISO_DIR)/PROGRAMS
.PHONY: all kernel reset_hdd bootloader iso clean run hdd help programs diskvbr clean_tap runn setup_tap test
.PHONY: run_user
.PHONY: run_user_gui
# Default target
all: iso
# Bootloader build (16-bit raw binary)
# Bootloader build (16-bit raw binary)
$(OUTPUT_BOOTLOADER_DIR)/BOOTLOADER.BIN: $(SOURCE_BOOTLOADER_DIR)/BOOTLOADER.asm
@echo "Compiling bootloader (16-bit real mode)..."
mkdir -p $(OUTPUT_BOOTLOADER_DIR)
$(ASSEMBLER) -f bin -D__REAL_MODE__ -o $@ $<
@echo "Bootloader compiled successfully."
bootloader: $(OUTPUT_BOOTLOADER_DIR)/BOOTLOADER.BIN
kernel:
@echo "Compiling KERNEL.BIN (16-bit real mode second stage)..."
mkdir -p $(OUTPUT_KERNEL_DIR)
rm -rf $(OUTPUT_KERNEL_DIR)
mkdir -p $(OUTPUT_KERNEL_DIR)
$(ASSEMBLER) -f bin -D__REAL_PROTECTED_MODE__ \
$(SOURCE_KERNEL_DIR)/KERNEL_ENTRY.asm \
-o $(OUTPUT_KERNEL_DIR)/KERNEL.BIN
@echo "KERNEL.BIN compiled successfully."
@size=$$(stat -c%s "$(OUTPUT_KERNEL_DIR)/KERNEL.BIN"); \
if [ $$size -gt 4095 ]; then \
echo "\033[1;33mWARNING: KERNEL.BIN size is $$size bytes, which exceeds 4095 bytes!\033[0m"; \
exit 1; \
fi
@echo "Compiling KRNL.BIN (32-bit protected mode C kernel)..."
mkdir -p $(OUTPUT_KERNEL_DIR)
$(CComp) $(KRNLCompArgs) -c $(SOURCE_KERNEL_DIR)/KERNEL.c -o $(OUTPUT_KERNEL_DIR)/KERNEL.o -m32
$(CComp) $(KRNLCompArgs) -c $(SOURCE_KERNEL_DIR)/32RTOSKRNL/DRIVERS/VESA/VESA.c -o $(OUTPUT_KERNEL_DIR)/VESA.o
$(CComp) $(KRNLCompArgs) -c $(SOURCE_KERNEL_DIR)/32RTOSKRNL/DRIVERS/VESA/VBE.c -o $(OUTPUT_KERNEL_DIR)/VBE.o
$(CComp) $(KRNLCompArgs) -c $(SOURCE_KERNEL_DIR)/32RTOSKRNL/CPU/GDT/GDT.c -o $(OUTPUT_KERNEL_DIR)/GDT.o
$(CComp) $(KRNLCompArgs) -c $(SOURCE_KERNEL_DIR)/32RTOSKRNL/CPU/IDT/IDT.c -o $(OUTPUT_KERNEL_DIR)/IDT.o
$(CComp) $(KRNLCompArgs) -c $(SOURCE_KERNEL_DIR)/32RTOSKRNL/CPU/ISR/ISR.c -o $(OUTPUT_KERNEL_DIR)/ISR.o
$(CComp) $(KRNLCompArgs) -c $(SOURCE_KERNEL_DIR)/32RTOSKRNL/CPU/IRQ/IRQ.c -o $(OUTPUT_KERNEL_DIR)/IRQ.o
$(CComp) $(KRNLCompArgs) -c $(SOURCE_KERNEL_DIR)/32RTOSKRNL/CPU/INTERRUPTS/INTERRUPTS.c -o $(OUTPUT_KERNEL_DIR)/INTERRUPTS.o
$(CComp) $(KRNLCompArgs) -c $(SOURCE_KERNEL_DIR)/32RTOSKRNL/DRIVERS/ATAPI/ATAPI.c -o $(OUTPUT_KERNEL_DIR)/ATA_ATAPI.o
$(CComp) $(KRNLCompArgs) -c $(SOURCE_KERNEL_DIR)/32RTOSKRNL/CPU/PIC/PIC.c -o $(OUTPUT_KERNEL_DIR)/PIC.o
# Link all object files into KRNL.BIN
$(CComp) -m32 -nostdlib -ffreestanding \
-Wl,-T,$(SOURCE_KERNEL_DIR)/kernel.ld,-e,_start,--oformat=binary \
-o $(OUTPUT_KERNEL_DIR)/KRNL.BIN \
$(OUTPUT_KERNEL_DIR)/KERNEL.o \
$(OUTPUT_KERNEL_DIR)/VESA.o \
$(OUTPUT_KERNEL_DIR)/VBE.o \
$(OUTPUT_KERNEL_DIR)/GDT.o \
$(OUTPUT_KERNEL_DIR)/IDT.o \
$(OUTPUT_KERNEL_DIR)/ISR.o \
$(OUTPUT_KERNEL_DIR)/IRQ.o \
$(OUTPUT_KERNEL_DIR)/INTERRUPTS.o \
$(OUTPUT_KERNEL_DIR)/ATA_ATAPI.o \
$(OUTPUT_KERNEL_DIR)/PIC.o \
@echo "KRNL.BIN compiled successfully."
@size=$$(stat -c%s "$(OUTPUT_KERNEL_DIR)/KRNL.BIN"); \
if [ $$size -gt 16384 ]; then \
echo "\033[1;33mWARNING: KRNL.BIN size is $$size bytes, which exceeds 16384 bytes!\033[0m"; \
exit 1; \
fi
# Remove kernel entry object files
rm -f $(OUTPUT_KERNEL_DIR)/*.o
@echo "Compiling 32RTOSKRNL.BIN (32-bit asm kernel)..."
$(CComp) $(RTOSKRNLCompArgs) -c $(SOURCE_KERNEL_DIR)/RTOSKRNL.c -o $(OUTPUT_KERNEL_DIR)/RTOSKRNL.o -m32
$(CComp) $(RTOSKRNLCompArgs) -c $(SOURCE_KERNEL_DIR)/32RTOSKRNL/DRIVERS/VESA/VESA.c -o $(OUTPUT_KERNEL_DIR)/VESA.o
$(CComp) $(RTOSKRNLCompArgs) -c $(SOURCE_KERNEL_DIR)/32RTOSKRNL/DRIVERS/VESA/VBE.c -o $(OUTPUT_KERNEL_DIR)/VBE.o
$(CComp) $(RTOSKRNLCompArgs) -c $(SOURCE_KERNEL_DIR)/32RTOSKRNL/DRIVERS/PS2/KEYBOARD_MOUSE.c -o $(OUTPUT_KERNEL_DIR)/PS2_KEYBOARD_MOUSE.o
$(CComp) $(RTOSKRNLCompArgs) -c $(SOURCE_KERNEL_DIR)/32RTOSKRNL/DRIVERS/ATAPI/ATAPI.c -o $(OUTPUT_KERNEL_DIR)/ATA_ATAPI.o
$(CComp) $(RTOSKRNLCompArgs) -c $(SOURCE_KERNEL_DIR)/32RTOSKRNL/DRIVERS/ATA_PIIX3/ATA_PIIX3.c -o $(OUTPUT_KERNEL_DIR)/ATA_PIIX3.o
$(CComp) $(RTOSKRNLCompArgs) -c $(SOURCE_KERNEL_DIR)/32RTOSKRNL/DRIVERS/ATA_PIO/ATA_PIO.c -o $(OUTPUT_KERNEL_DIR)/ATA_PIO.o
$(CComp) $(RTOSKRNLCompArgs) -c $(SOURCE_KERNEL_DIR)/32RTOSKRNL/DRIVERS/CMOS/CMOS.c -o $(OUTPUT_KERNEL_DIR)/CMOS.o
$(CComp) $(RTOSKRNLCompArgs) -c $(SOURCE_KERNEL_DIR)/32RTOSKRNL/DRIVERS/RTL8139/RTL8139.c -o $(OUTPUT_KERNEL_DIR)/RTL8139.o
$(CComp) $(RTOSKRNLCompArgs) -c $(SOURCE_KERNEL_DIR)/32RTOSKRNL/DRIVERS/AC97/AC97.c -o $(OUTPUT_KERNEL_DIR)/AC97.o
$(CComp) $(RTOSKRNLCompArgs) -c $(SOURCE_KERNEL_DIR)/32RTOSKRNL/DRIVERS/BEEPER/BEEPER.c -o $(OUTPUT_KERNEL_DIR)/BEEPER.o
$(CComp) $(RTOSKRNLCompArgs) -c $(SOURCE_KERNEL_DIR)/32RTOSKRNL/DRIVERS/PCI/PCI.c -o $(OUTPUT_KERNEL_DIR)/PCI.o
$(CComp) $(RTOSKRNLCompArgs) -c $(SOURCE_KERNEL_DIR)/32RTOSKRNL/DRIVERS/SERIAL/SERIAL.c -o $(OUTPUT_KERNEL_DIR)/SERIAL.o
$(CComp) $(RTOSKRNLCompArgs) -c $(SOURCE_KERNEL_DIR)/32RTOSKRNL/DEBUG/KDEBUG.c -o $(OUTPUT_KERNEL_DIR)/KDEBUG.o
$(CComp) $(RTOSKRNLCompArgs) -c $(SOURCE_KERNEL_DIR)/32RTOSKRNL/CPU/PIT/PIT.c -o $(OUTPUT_KERNEL_DIR)/PIT.o
$(CComp) $(RTOSKRNLCompArgs) -c $(SOURCE_KERNEL_DIR)/32RTOSKRNL/CPU/GDT/GDT.c -o $(OUTPUT_KERNEL_DIR)/GDT.o
$(CComp) $(RTOSKRNLCompArgs) -c $(SOURCE_KERNEL_DIR)/32RTOSKRNL/CPU/IDT/IDT.c -o $(OUTPUT_KERNEL_DIR)/IDT.o
$(CComp) $(RTOSKRNLCompArgs) -c $(SOURCE_KERNEL_DIR)/32RTOSKRNL/CPU/ISR/ISR.c -o $(OUTPUT_KERNEL_DIR)/ISR.o
$(CComp) $(RTOSKRNLCompArgs) -c $(SOURCE_KERNEL_DIR)/32RTOSKRNL/CPU/IRQ/IRQ.c -o $(OUTPUT_KERNEL_DIR)/IRQ.o
$(CComp) $(RTOSKRNLCompArgs) -c $(SOURCE_KERNEL_DIR)/32RTOSKRNL/CPU/PIC/PIC.c -o $(OUTPUT_KERNEL_DIR)/PIC.o
$(CComp) $(RTOSKRNLCompArgs) -c $(SOURCE_KERNEL_DIR)/32RTOSKRNL/CPU/FPU/FPU.c -o $(OUTPUT_KERNEL_DIR)/FPU.o
$(CComp) $(RTOSKRNLCompArgs) -c $(SOURCE_KERNEL_DIR)/32RTOSKRNL/CPU/YIELD/YIELD.c -o $(OUTPUT_KERNEL_DIR)/YIELD.o
$(CComp) $(RTOSKRNLCompArgs) -c $(SOURCE_KERNEL_DIR)/32RTOSKRNL/CPU/SYSCALL/SYSCALL.c -o $(OUTPUT_KERNEL_DIR)/SYSCALL.o
$(CComp) $(RTOSKRNLCompArgs) -c $(SOURCE_KERNEL_DIR)/32RTOSKRNL/CPU/INTERRUPTS/INTERRUPTS.c -o $(OUTPUT_KERNEL_DIR)/INTERRUPTS.o
$(CComp) $(RTOSKRNLCompArgs) -c $(SOURCE_KERNEL_DIR)/32RTOSKRNL/MEMORY/E820/E820.c -o $(OUTPUT_KERNEL_DIR)/E820.o
$(CComp) $(RTOSKRNLCompArgs) -c $(SOURCE_KERNEL_DIR)/32RTOSKRNL/MEMORY/PAGING/PAGING.c -o $(OUTPUT_KERNEL_DIR)/PAGING.o
$(CComp) $(RTOSKRNLCompArgs) -c $(SOURCE_KERNEL_DIR)/32RTOSKRNL/MEMORY/PAGEFRAME/PAGEFRAME.c -o $(OUTPUT_KERNEL_DIR)/PAGEFRAME.o
$(CComp) $(RTOSKRNLCompArgs) -c $(SOURCE_KERNEL_DIR)/32RTOSKRNL/MEMORY/HEAP/KHEAP.c -o $(OUTPUT_KERNEL_DIR)/KHEAP.o
$(CComp) $(RTOSKRNLCompArgs) -c $(SOURCE_KERNEL_DIR)/32RTOSKRNL/MEMORY/BYTEMAP/BYTEMAP.c -o $(OUTPUT_KERNEL_DIR)/BYTEMAP.o
$(CComp) $(RTOSKRNLCompArgs) -c $(SOURCE_KERNEL_DIR)/32RTOSKRNL/FS/ISO9660/ISO9660.c -o $(OUTPUT_KERNEL_DIR)/ISO9660.o
$(CComp) $(RTOSKRNLCompArgs) -c $(SOURCE_KERNEL_DIR)/32RTOSKRNL/FS/FAT/FAT.c -o $(OUTPUT_KERNEL_DIR)/FAT32.o
$(CComp) $(RTOSKRNLCompArgs) -c $(SOURCE_DIR)/STD/MEM.c -o $(OUTPUT_KERNEL_DIR)/MEM.o
$(CComp) $(RTOSKRNLCompArgs) -c $(SOURCE_DIR)/STD/STRING.c -o $(OUTPUT_KERNEL_DIR)/STRING.o
$(CComp) $(RTOSKRNLCompArgs) -c $(SOURCE_DIR)/STD/DEBUG.c -o $(OUTPUT_KERNEL_DIR)/DEBUG.o
$(CComp) $(RTOSKRNLCompArgs) -c $(SOURCE_DIR)/STD/MATH.c -o $(OUTPUT_KERNEL_DIR)/MATH.o
$(CComp) $(RTOSKRNLCompArgs) -c $(SOURCE_KERNEL_DIR)/32RTOSKRNL/RTOSKRNL/ACPI/ACPI.c -o $(OUTPUT_KERNEL_DIR)/ACPI.o
$(CComp) $(RTOSKRNLCompArgs) -c $(SOURCE_KERNEL_DIR)/32RTOSKRNL/RTOSKRNL/ERROR/ERROR.c -o $(OUTPUT_KERNEL_DIR)/ERROR.o
$(CComp) $(RTOSKRNLCompArgs) -c $(SOURCE_KERNEL_DIR)/32RTOSKRNL/RTOSKRNL/RTOSKRNL_INTERNAL.c -o $(OUTPUT_KERNEL_DIR)/RTOSKRNL_INTERNAL.o
$(CComp) $(RTOSKRNLCompArgs) -c $(SOURCE_KERNEL_DIR)/32RTOSKRNL/RTOSKRNL/PROC/PROC.c -o $(OUTPUT_KERNEL_DIR)/PROC.o
$(CComp) -m32 -nostdlib -ffreestanding \
-Wl,-T,$(SOURCE_KERNEL_DIR)/rtoskernel.ld,-e,_start,--oformat=binary \
-o $(OUTPUT_KERNEL_DIR)/32RTOSKRNL.BIN \
$(OUTPUT_KERNEL_DIR)/RTOSKRNL.o \
$(OUTPUT_KERNEL_DIR)/VESA.o \
$(OUTPUT_KERNEL_DIR)/VBE.o \
$(OUTPUT_KERNEL_DIR)/PIC.o \
$(OUTPUT_KERNEL_DIR)/STRING.o \
$(OUTPUT_KERNEL_DIR)/PIT.o \
$(OUTPUT_KERNEL_DIR)/PS2_KEYBOARD_MOUSE.o \
$(OUTPUT_KERNEL_DIR)/CMOS.o \
$(OUTPUT_KERNEL_DIR)/GDT.o \
$(OUTPUT_KERNEL_DIR)/IDT.o \
$(OUTPUT_KERNEL_DIR)/ISR.o \
$(OUTPUT_KERNEL_DIR)/IRQ.o \
$(OUTPUT_KERNEL_DIR)/INTERRUPTS.o \
$(OUTPUT_KERNEL_DIR)/E820.o \
$(OUTPUT_KERNEL_DIR)/PAGING.o \
$(OUTPUT_KERNEL_DIR)/PAGEFRAME.o \
$(OUTPUT_KERNEL_DIR)/MEM.o \
$(OUTPUT_KERNEL_DIR)/BYTEMAP.o \
$(OUTPUT_KERNEL_DIR)/RTOSKRNL_INTERNAL.o \
$(OUTPUT_KERNEL_DIR)/SERIAL.o \
$(OUTPUT_KERNEL_DIR)/ATA_ATAPI.o \
$(OUTPUT_KERNEL_DIR)/ACPI.o \
$(OUTPUT_KERNEL_DIR)/MATH.o \
$(OUTPUT_KERNEL_DIR)/SYSCALL.o \
$(OUTPUT_KERNEL_DIR)/ISO9660.o \
$(OUTPUT_KERNEL_DIR)/FAT32.o \
$(OUTPUT_KERNEL_DIR)/YIELD.o \
$(OUTPUT_KERNEL_DIR)/ERROR.o \
$(OUTPUT_KERNEL_DIR)/KHEAP.o \
$(OUTPUT_KERNEL_DIR)/BEEPER.o \
$(OUTPUT_KERNEL_DIR)/PROC.o \
$(OUTPUT_KERNEL_DIR)/FPU.o \
$(OUTPUT_KERNEL_DIR)/RTL8139.o \
$(OUTPUT_KERNEL_DIR)/AC97.o \
$(OUTPUT_KERNEL_DIR)/KDEBUG.o \
$(OUTPUT_KERNEL_DIR)/DEBUG.o \
$(OUTPUT_KERNEL_DIR)/ATA_PIIX3.o \
$(OUTPUT_KERNEL_DIR)/ATA_PIO.o \
$(OUTPUT_KERNEL_DIR)/PCI.o \
@echo "32RTOSKRNL.BIN compiled successfully."
@echo "All kernel components compiled successfully."
programs:
@echo "Building user programs..."
@mkdir -p $(INPUT_ISO_DIR_PROGRAMS)
@( \
cat $(PROGRAM_LIST_FILE) | while read prog_dir prog_name; do \
echo "Building $$prog_name from $$prog_dir..."; \
cmake -S $$prog_dir -B $$prog_dir/build -G "Unix Makefiles" || exit 1; \
cmake --build $$prog_dir/build || exit 1; \
done \
)
cmake -S $(SOURCE_ROOT_USER_PROGRAMS_DIR)/SYS_PROGS -B $(SOURCE_ROOT_USER_PROGRAMS_DIR)/SYS_PROGS/build -G "Unix Makefiles"
cmake --build $(SOURCE_ROOT_USER_PROGRAMS_DIR)/SYS_PROGS/build
@echo "All user programs built successfully."
# ISO build
iso: bootloader kernel programs diskvbr
@echo "Creating ISO directory structure..."
mkdir -p $(INPUT_ISO_DIR_SYSTEM)/SYS_SRC
mkdir -p $(INPUT_ISO_DIR_SYSTEM)
mkdir -p $(INPUT_ISO_DIR_HOME)
mkdir -p $(INPUT_ISO_DIR_HOME)/DOCS/
mkdir -p $(INPUT_ISO_DIR_PROGRAMS)
cp -f $(OUTPUT_BOOTLOADER_DIR)/BOOTLOADER.BIN $(INPUT_ISO_DIR)/BOOTLOADER.BIN
if [ -f $(OUTPUT_BOOTLOADER_DIR)/DISK_VBR.BIN ]; then \
echo "Copying DISK_VBR.BIN to ISO directory..."; \
cp -f $(OUTPUT_BOOTLOADER_DIR)/DISK_VBR.BIN $(INPUT_ISO_DIR_SYSTEM)/DISK_VBR.BIN; \
else \
echo "Warning: DISK_VBR.BIN not found, skipping copy."; \
fi
cp -f $(SOURCE_DIR)/../HOME/SRC/KRNL/VKR.BIN $(INPUT_ISO_DIR)/
cp -rf $(SOURCE_DIR)/../HOME/* $(INPUT_ISO_DIR_HOME)/
cp -rf $(SOURCE_DIR)/SYS_SRC/* $(INPUT_ISO_DIR_SYSTEM)/SYS_SRC
cp -f $(OUTPUT_KERNEL_DIR)/KERNEL.BIN $(INPUT_ISO_DIR)/KERNEL.BIN
cp -f $(OUTPUT_KERNEL_DIR)/32RTOSKRNL.BIN $(INPUT_ISO_DIR_SYSTEM)/32RTOSKRNL.BIN
cp -f $(SOURCE_DIR)/ATOSHELL.SH $(INPUT_ISO_DIR_SYSTEM)/ATOSHELL.SH
cp -f $(SOURCE_DIR)/TSHELL.SH $(INPUT_ISO_DIR_SYSTEM)/TSHELL.SH
cp -f $(OUTPUT_KERNEL_DIR)/KRNL.BIN $(INPUT_ISO_DIR)/KRNL.BIN
cp -r $(OUTPUT_USER_PROGRAMS_DIR)/ $(INPUT_ISO_DIR)/
@echo "Building ISO..."
mkdir -p $(OUTPUT_ISO_DIR)
genisoimage -o $(OUTPUT_ISO_DIR)/$(ISO_NAME) -r -J -b BOOTLOADER.BIN -no-emul-boot $(INPUT_ISO_DIR)
@echo "ISO created at $(OUTPUT_ISO_DIR)/$(ISO_NAME)"
reset_hdd:
@echo "Resetting hdd.img to minimum size..."
if [ -f hdd.img ]; then \
rm -f hdd.img; \
fi
qemu-img create -f raw hdd.img 64M
@echo "hdd.img reset successfully."
run:
@echo "Running ISO in QEMU..."
# Make sure disk exists
if [ ! -f hdd.img ]; then \
echo "Creating hdd.img with 64MB size..."; \
qemu-img create -f raw hdd.img 64M; \
fi
mkdir -p OUTPUT/DEBUG
mkdir -p OUTPUT/SERIAL
# Remove old FIFOs if they exist
rm -f OUTPUT/SERIAL/SERIAL2.in
rm -f OUTPUT/SERIAL/SERIAL2.out
rm -f OUTPUT/SERIAL/SERIAL3.in
rm -f OUTPUT/SERIAL/SERIAL3.out
rm -f OUTPUT/SERIAL/SERIAL4.in
rm -f OUTPUT/SERIAL/SERIAL4.out
# Create FIFOs for COM2-COM4
mkfifo OUTPUT/SERIAL/SERIAL2.in OUTPUT/SERIAL/SERIAL2.out
mkfifo OUTPUT/SERIAL/SERIAL3.in OUTPUT/SERIAL/SERIAL3.out
mkfifo OUTPUT/SERIAL/SERIAL4.in OUTPUT/SERIAL/SERIAL4.out
# Run QEMU
qemu-system-i386 \
-vga std \
-m 1024 \
-boot order=d \
-cdrom $(OUTPUT_ISO_DIR)/$(ISO_NAME) \
-drive id=cdrom,file=$(OUTPUT_ISO_DIR)/$(ISO_NAME),format=raw,if=none \
-drive id=hd0,file=hdd.img,format=raw,if=none \
-device piix3-ide,id=ide \
-device ide-hd,drive=hd0,bus=ide.0 \
-device ide-cd,drive=cdrom,bus=ide.1 \
-device ac97,audiodev=snd0 \
-debugcon file:OUTPUT/DEBUG/DEBUG.log \
-global isa-debugcon.iobase=0xe9 \
-audiodev sdl,id=snd0 \
-nic user,model=rtl8139,mac=52:54:00:12:34:56 \
-serial stdio \
-serial pipe:OUTPUT/SERIAL/SERIAL2 \
-serial pipe:OUTPUT/SERIAL/SERIAL3 \
-serial pipe:OUTPUT/SERIAL/SERIAL4
hdd:
@echo "Running QEMU booting from hdd.img..."
# [ -f hdd.img ] || qemu-img create -f raw hdd.img 256M
mkdir -p OUTPUT/DEBUG
mkdir -p OUTPUT/SERIAL
rm -f OUTPUT/SERIAL/SERIAL2.in
rm -f OUTPUT/SERIAL/SERIAL2.out
rm -f OUTPUT/SERIAL/SERIAL3.in
rm -f OUTPUT/SERIAL/SERIAL3.out
rm -f OUTPUT/SERIAL/SERIAL4.in
rm -f OUTPUT/SERIAL/SERIAL4.out
mkfifo OUTPUT/SERIAL/SERIAL2.in OUTPUT/SERIAL/SERIAL2.out
mkfifo OUTPUT/SERIAL/SERIAL3.in OUTPUT/SERIAL/SERIAL3.out
mkfifo OUTPUT/SERIAL/SERIAL4.in OUTPUT/SERIAL/SERIAL4.out
qemu-system-i386 \
-vga std \
-m 1024 \
-boot order=c \
-cdrom $(OUTPUT_ISO_DIR)/$(ISO_NAME) \
-drive id=cdrom,file=$(OUTPUT_ISO_DIR)/$(ISO_NAME),format=raw,if=none \
-drive id=hd0,file=hdd.img,format=raw,if=none \
-device piix3-ide,id=ide \
-device ide-hd,drive=hd0,bus=ide.0 \
-device ide-cd,drive=cdrom,bus=ide.1 \
-device ac97,audiodev=snd0 \
-debugcon file:OUTPUT/DEBUG/DEBUG.log \
-global isa-debugcon.iobase=0xe9 \
-audiodev sdl,id=snd0 \
-nic user,model=rtl8139,mac=52:54:00:12:34:56 \
-serial stdio \
-serial pipe:OUTPUT/SERIAL/SERIAL2 \
-serial pipe:OUTPUT/SERIAL/SERIAL3 \
-serial pipe:OUTPUT/SERIAL/SERIAL4
# remove tap device
clean_tap:
@if ip link show tap0 >/dev/null 2>&1; then \
echo "Removing tap0..."; \
sudo ip link set tap0 down; \
sudo ip tuntap del dev tap0 mode tap; \
else \
echo "tap0 does not exist"; \
fi
runn: clean_tap setup_tap run
setup_tap:
$(MAKE) clean_tap
# Create TAP device if it doesn't exist
@if ! ip link show tap0 >/dev/null 2>&1; then \
echo "Creating TAP device tap0 owned by $(shell id -un)..."; \
sudo ip tuntap add dev tap0 mode tap user $(shell id -un); \
else \
echo "TAP device tap0 already exists"; \
fi
# Bring TAP device up
@if ! ip link show tap0 up | grep -q "UP"; then \
echo "Bringing tap0 up..."; \
sudo ip link set tap0 up; \
else \
echo "tap0 is already up"; \
fi
@echo "TAP device ready. No IP assigned, communicate using MAC addresses only."
qemu-system-i386 -vga std \
-m 1024 \
-boot order=d \
-cdrom $(OUTPUT_ISO_DIR)/$(ISO_NAME) \
-drive id=cdrom,file=$(OUTPUT_ISO_DIR)/$(ISO_NAME),format=raw,if=none \
-drive id=hd0,file=hdd.img,format=raw,if=none \
-device piix3-ide,id=ide \
-device ide-hd,drive=hd0,bus=ide.0 \
-device ide-cd,drive=cdrom,bus=ide.1 \
-device ac97,audiodev=snd0 \
-netdev tap,id=tap0,ifname=tap0,script=no,downscript=no \
-device rtl8139,netdev=tap0,mac=52:54:00:12:34:56 \
-audiodev sdl,id=snd0
runlh:
@echo "Running ISO in QEMU..."
qemu-img create -f raw hdd.img 256M
qemu-system-i386 -vga std -boot d -cdrom \
$(OUTPUT_ISO_DIR)/$(ISO_NAME) -m 512 \
-drive file=hdd.img,format=raw,if=ide,index=0,media=disk \
-monitor tcp:localhost:4444,server,nowait
# Clean
clean:
@echo "Cleaning output directories..."
rm -rf $(OUTPUT_DIR)
@echo "Output directories cleaned."
SCRIPTS/CLEAN.sh from_make
@echo "Clean complete."
# Help
help:
@echo "Makefile usage:"
@echo " make kernel - Compile kernel raw binaries"
@echo " make bootloader - Compile bootloader"
@echo " make iso - Build bootable ISO (default)"
@echo " make run - Run ISO in QEMU"
@echo " make hdd - Run QEMU booting from hdd.img"
@echo " sudo make runn - Run ISO in QEMU with ethernet driver"
@echo " make run_user - Run headless QEMU (no sudo, user-net)"
@echo " make run_user_gui - Run QEMU with GUI+audio (no sudo, user-net)"
@echo " Logs: OUTPUT/DEBUG/debug.log (from I/O port 0xE9)"
@echo " sudo make setup_tap - Setup tap ethernet config"
@echo " sudo make clean_tap - Clean tap ethernet config"
@echo " make reset_hdd - Reset hdd.img to 256MB"
@echo " make clean - Clean build artifacts"
@echo " make test - Run host unit tests"
test:
$(MAKE) -C TESTS all