-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMakefile
More file actions
163 lines (140 loc) · 5.58 KB
/
Makefile
File metadata and controls
163 lines (140 loc) · 5.58 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
## SecOS Kernel - Build Makefile
## Copyright (c) 2025 iDev srl
## Author: Luigi De Astis <l.deastis@idev-srl.com>
## SPDX-License-Identifier: MIT
## Build system with subdirectories
AS = nasm
CC = gcc
LD = ld
BOOT_DIR = boot
ARCH_DIR = arch/x86
KERNEL_DIR = kernel
DRIVERS_DIR = drivers
MM_DIR = mm
LIB_DIR = lib
FS_DIR = fs
INCLUDES = -I. -I$(BOOT_DIR) -I$(ARCH_DIR) -I$(KERNEL_DIR) -I$(DRIVERS_DIR) -I$(MM_DIR) -I$(LIB_DIR) -I$(FS_DIR)
ASFLAGS = -f elf64
BUILD_TS := $(shell date -u +%Y%m%d%H%M%S)
GIT_HASH := $(shell git rev-parse --short HEAD 2>/dev/null || echo NOHASH)
# Nota: CONFIG_MULTIBOOT e CONFIG_UEFI sono ora definiti in config.h (dual-boot support)
CFLAGS = -ffreestanding -O2 -nostdlib -lgcc -m64 -mno-red-zone -mno-sse -mno-sse2 $(INCLUDES) \
-DBUILD_TS="\"$(BUILD_TS)\"" -DGIT_HASH="\"$(GIT_HASH)\""
LDFLAGS = -n -T linker.ld
SRC_ASM = $(BOOT_DIR)/boot.asm $(ARCH_DIR)/idt_asm.asm $(ARCH_DIR)/syscall_asm.asm
SRC_C = \
$(KERNEL_DIR)/kernel.c \
$(ARCH_DIR)/idt.c $(ARCH_DIR)/tss.c \
$(DRIVERS_DIR)/keyboard.c $(DRIVERS_DIR)/timer.c $(DRIVERS_DIR)/rtc.c \
$(DRIVERS_DIR)/fb.c $(DRIVERS_DIR)/fb_console.c \
$(MM_DIR)/pmm.c $(MM_DIR)/heap.c $(MM_DIR)/vmm.c \
$(MM_DIR)/elf.c \
$(MM_DIR)/elf_unload.c \
$(MM_DIR)/elf_manifest.c \
$(KERNEL_DIR)/process.c \
$(KERNEL_DIR)/panic.c $(KERNEL_DIR)/shell.c $(KERNEL_DIR)/sched.c \
$(KERNEL_DIR)/syscall.c \
$(KERNEL_DIR)/driver_if.c \
user/testdriver.c \
$(LIB_DIR)/terminal.c \
$(FS_DIR)/ramfs.c \
$(FS_DIR)/vfs.c \
$(FS_DIR)/ramfs_vfs.c \
$(FS_DIR)/block.c \
$(FS_DIR)/fat32.c \
$(FS_DIR)/ext2.c \
$(FS_DIR)/ext2ramdev.c
OBJS_ASM = $(SRC_ASM:%.asm=%.o)
OBJS_C = $(SRC_C:%.c=%.o)
OBJS = $(OBJS_ASM) $(OBJS_C)
KERNEL = kernel.bin
ISO = myos.iso
ISODIR = isodir
# UEFI output directories
DIST_DIR = dist
EFI_BOOT_DIR = $(DIST_DIR)/EFI/BOOT
UEFI_LOADER_ELF = uefi_loader.elf
UEFI_APP = $(EFI_BOOT_DIR)/BOOTX64.EFI
.PHONY: uefi uefi-clean
.PHONY: all clean run iso
all: $(KERNEL)
# Guard: warn if a stray kernel.c exists in root (unused by build)
ifneq (,$(wildcard kernel.c))
$(warning WARNING: Found unused kernel.c in root; remove to avoid confusion.)
endif
$(BOOT_DIR)/%.o: $(BOOT_DIR)/%.asm
$(AS) $(ASFLAGS) $< -o $@
$(ARCH_DIR)/%.o: $(ARCH_DIR)/%.asm
$(AS) $(ASFLAGS) $< -o $@
$(KERNEL_DIR)/%.o: $(KERNEL_DIR)/%.c
$(CC) $(CFLAGS) -c $< -o $@
$(ARCH_DIR)/%.o: $(ARCH_DIR)/%.c
$(CC) $(CFLAGS) -c $< -o $@
$(DRIVERS_DIR)/%.o: $(DRIVERS_DIR)/%.c
$(CC) $(CFLAGS) -c $< -o $@
$(MM_DIR)/%.o: $(MM_DIR)/%.c
$(CC) $(CFLAGS) -c $< -o $@
$(LIB_DIR)/%.o: $(LIB_DIR)/%.c
$(CC) $(CFLAGS) -c $< -o $@
$(FS_DIR)/%.o: $(FS_DIR)/%.c
$(CC) $(CFLAGS) -c $< -o $@
$(KERNEL): $(OBJS)
$(LD) $(LDFLAGS) -o $@ $(OBJS)
# Create bootable ISO image
iso: $(KERNEL)
mkdir -p $(ISODIR)/boot/grub
cp $(KERNEL) $(ISODIR)/boot/kernel.bin
echo 'set timeout=3' > $(ISODIR)/boot/grub/grub.cfg
echo 'set default=0' >> $(ISODIR)/boot/grub/grub.cfg
echo 'insmod all_video' >> $(ISODIR)/boot/grub/grub.cfg
echo 'insmod gfxterm' >> $(ISODIR)/boot/grub/grub.cfg
echo 'set gfxmode=1024x768x32,1024x768,800x600x32,800x600,640x480x32,640x480,auto' >> $(ISODIR)/boot/grub/grub.cfg
echo 'set gfxpayload=keep' >> $(ISODIR)/boot/grub/grub.cfg
echo 'terminal_output gfxterm' >> $(ISODIR)/boot/grub/grub.cfg
echo '' >> $(ISODIR)/boot/grub/grub.cfg
echo 'menuentry "SecOS x64" {' >> $(ISODIR)/boot/grub/grub.cfg
echo ' multiboot2 /boot/kernel.bin' >> $(ISODIR)/boot/grub/grub.cfg
echo '}' >> $(ISODIR)/boot/grub/grub.cfg
grub-mkrescue --output=$(ISO) $(ISODIR) 2>&1 | tee grub-mkrescue.log
@echo "ISO creata: $(ISO)"
@echo "Verifica contenuto ISO..."
@ls -lh $(ISO)
# Run with QEMU
run: iso
qemu-system-x86_64 -cdrom $(ISO) -debugcon stdio -global isa-debugcon.iobase=0xe9
# Clean generated files
clean:
rm -f $(OBJS) $(KERNEL)
rm -rf $(ISODIR) $(ISO) grub-mkrescue.log
rm -rf $(DIST_DIR) $(UEFI_LOADER_ELF)
tree:
@echo "ASM: $(SRC_ASM)"
@echo "C : $(SRC_C)"
# --- UEFI build (Strategy B: external bootloader) ---
UEFI_SRC = uefi/boot.c uefi/elf_load.c
UEFI_HELLO_SRC = uefi/hello.c
UEFI_OBJS = $(UEFI_SRC:%.c=%.o)
UEFI_HELLO_OBJS = $(UEFI_HELLO_SRC:%.c=%.o)
UEFI_HELLO_APP = $(EFI_BOOT_DIR)/HELLO.EFI
UEFI_CFLAGS = -ffreestanding -fshort-wchar -O2 -mno-red-zone -m64 -fno-stack-protector -fPIE -fno-omit-frame-pointer -fno-asynchronous-unwind-tables -fno-unwind-tables -fcf-protection=none -mno-sse -mno-mmx $(INCLUDES) -DCONFIG_UEFI
uefi/%.o: uefi/%.c
$(CC) $(UEFI_CFLAGS) -c $< -o $@
uefi: $(UEFI_OBJS)
mkdir -p $(EFI_BOOT_DIR)
$(LD) -nostdlib -znocombreloc -shared -Bsymbolic -T /usr/lib/elf_x86_64_efi.lds \
-L /usr/lib /usr/lib/crt0-efi-x86_64.o $(UEFI_OBJS) --subsystem efi-app -o $(UEFI_LOADER_ELF) 2>&1 | head -5 || true
objcopy -j .hash -j .gnu.hash -j .dynsym -j .dynstr -j .text -j .sdata -j .data -j .rodata -j .eh_frame -j .dynamic -j .rel -j .rela -j .reloc --target=efi-app-x86_64 $(UEFI_LOADER_ELF) $(UEFI_APP)
@echo "✅ UEFI loader: $(UEFI_APP) ($(shell ls -lh $(UEFI_APP) | awk '{print $$5}'))"
@cp $(KERNEL) $(DIST_DIR)/kernel.elf || true
uefi-clean:
rm -rf $(DIST_DIR) $(UEFI_LOADER_ELF) $(UEFI_OBJS)
uefi_hello: $(UEFI_HELLO_OBJS)
mkdir -p $(EFI_BOOT_DIR)
$(LD) -nostdlib -znocombreloc -T $(GNU_EFI_LDS) -shared -Bsymbolic -L$(GNU_EFI_LIB) $(GNU_EFI_CRT) $(UEFI_HELLO_OBJS) -o uefi_hello.elf -lgnuefi -lefi
objcopy -j .text -j .sdata -j .data -j .dynamic -j .dynsym -j .rel -j .rela -j .reloc --target=efi-app-x86_64 uefi_hello.elf $(UEFI_HELLO_APP)
@echo "Minimal UEFI hello built: $(UEFI_HELLO_APP)"
# Avvio rapido UEFI (richiede script run_uefi.sh)
.PHONY: run-uefi
run-uefi: uefi
@chmod +x run_uefi.sh 2>/dev/null || true
./run_uefi.sh