Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
114 changes: 45 additions & 69 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,101 +1,77 @@


LIB_DIRS := $(wildcard src/libs/*.c)
OBJS := $(shell mkdir -p output; find output -name '*.o')

CC = i386-elf-gcc
CFLAGS = -w -ffreestanding -m32 -fno-pie -nostdlib

NS = nasm
NSFLAGS = -f elf32

LIBS_C := $(shell find src/libs -type f -name '*.c')
LIBS_S := $(shell find src/libs -type f -name '*.asm')
KERNEL_C := $(shell find src/kernel -name *.c)
KERNEL_S := $(shell find src/kernel -name *.asm)
API_C := $(shell find src/api -name *.c)
API_S := $(shell find src/api -name *.asm)


include common.mk

# ==============================================================================
# Sources
# ==============================================================================
LIBS_C := $(shell find src/libs -type f -name '*.c')
LIBS_S := $(shell find src/libs -type f -name '*.asm')
KERNEL_C := $(shell find src/kernel -type f -name '*.c')
KERNEL_S := $(shell find src/kernel -type f -name '*.asm')
API_C := $(shell find src/api -type f -name '*.c')
API_S := $(shell find src/api -type f -name '*.asm')

OBJS := $(shell mkdir -p output; find output -name '*.o')

# ==============================================================================
# Build rule helper
# ==============================================================================
define build-rule
for src in $(1); do \
obj=$$(echo $$src | sed 's|$(2)|$(3)|' | sed 's|$(4)$$|$(5)|'); \
echo "Building $$src -> $$obj"; \
mkdir -p $$(dirname $$obj); \
if echo $$src | grep -q "\.c$$"; then \
$(6) $(7) -c $$src -o $$obj; \
else \
$(6) $(7) $$src -o $$obj; \
fi; \
done
for src in $(1); do \
obj=$$(echo $$src | sed 's|$(2)|$(3)|' | sed 's|$(4)$$|$(5)|'); \
echo "Building $$src -> $$obj"; \
mkdir -p $$(dirname $$obj); \
if echo $$src | grep -q "\.c$$"; then \
$(CC) $(CFLAGS) -c $$src -o $$obj; \
else \
$(AS) $(ASFLAGS) $$src -o $$obj; \
fi; \
done
endef

# ==============================================================================
# Targets
# ==============================================================================
.PHONY: all build drivers libs kernel k_api link clean make_iso make_disk run

all:
$(MAKE) build
$(MAKE) make_iso
$(MAKE) make_disk
$(MAKE) run

all: build make_iso make_disk run

build: clean drivers libs kernel link

drivers:
$(MAKE) -C ./src/drivers/


libs:
mkdir -p output/libs
$(call build-rule,$(LIBS_C),src/libs,output/libs,.c,.o,$(CC),$(CFLAGS))
$(call build-rule,$(LIBS_S),src/libs,output/libs,.asm,.o,$(NS),$(NSFLAGS))
$(call build-rule,$(LIBS_C),src/libs,output/libs,.c,.o)
$(call build-rule,$(LIBS_S),src/libs,output/libs,.asm,.o)


kernel:
kernel: libs
mkdir -p output/kernel/
$(call build-rule,$(KERNEL_C),src/kernel,output/kernel,.c,.o,$(CC),$(CFLAGS))
$(call build-rule,$(KERNEL_S),src/kernel,output/kernel,.asm,.o,$(NS),$(NSFLAGS))

$(call build-rule,$(KERNEL_C),src/kernel,output/kernel,.c,.o)
$(call build-rule,$(KERNEL_S),src/kernel,output/kernel,.asm,.o)
$(MAKE) k_api


k_api:
mkdir -p output/api/
$(call build-rule,$(API_C),src/api,output/api,.c,.o,$(CC),$(CFLAGS))
$(call build-rule,$(API_S),src/api,output/api,.asm,.o,$(NS),$(NSFLAGS))

$(call build-rule,$(API_C),src/api,output/api,.c,.o)
$(call build-rule,$(API_S),src/api,output/api,.asm,.o)

link:
i386-elf-ld -m elf_i386 -T src/linker.ld --oformat elf32-i386 -o output/kernel.elf $(OBJS)

$(LD) $(LDFLAGS) -o output/kernel.elf $(OBJS)

clean:
rm -rf output/


build:
echo "\n --- --- clean --- --- \n"
$(MAKE) clean
echo "\n --- --- drivers --- --- \n"
$(MAKE) drivers
echo "\n --- --- libs --- --- \n"
$(MAKE) libs
echo "\n --- --- kernel --- --- \n"
$(MAKE) kernel
echo "\n --- --- link --- --- \n"
$(MAKE) link


make_iso:
# Make ISO
cp output/kernel.elf iso/boot/
grub-mkrescue -o output/os.iso ./iso/

make_disk:
# Make hard disk
dd if=/dev/zero of=output/disk.img bs=512 count=20480

run:
qemu-system-i386 -no-reboot -no-shutdown -monitor stdio \
-drive file=./disk.img,format=raw,if=ide,index=0,media=disk \
-drive file=output/os.iso,format=raw,if=ide,index=1,media=cdrom \
-d int,cpu_reset -D qemu.log \
-boot d
-drive file=./output/disk.img,format=raw,if=ide,index=0,media=disk \
-drive file=output/os.iso,format=raw,if=ide,index=1,media=cdrom \
-d int,cpu_reset -D qemu.log \
-boot d
24 changes: 24 additions & 0 deletions common.mk
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# Путь до корня проекта, независимо от того, откуда включают
ROOT_DIR := $(dir $(abspath $(lastword $(MAKEFILE_LIST))))

# ==============================================================================
# Toolchain
# ==============================================================================
CROSS ?= i386-elf
PREFIX := $(CROSS)-

CC := $(PREFIX)gcc
LD := $(PREFIX)ld
AR := $(PREFIX)ar
NM := $(PREFIX)nm
OBJCOPY := $(PREFIX)objcopy
OBJDUMP := $(PREFIX)objdump
STRIP := $(PREFIX)strip
AS := nasm

# ==============================================================================
# Flags
# ==============================================================================
CFLAGS := -w -ffreestanding -m32 -fno-pie -nostdlib
LDFLAGS := -m elf_i386 -T $(ROOT_DIR)src/linker.ld --oformat elf32-i386
ASFLAGS := -f elf32
26 changes: 7 additions & 19 deletions src/drivers/Makefile
Original file line number Diff line number Diff line change
@@ -1,35 +1,23 @@
# Собираем все драйверы верхнего уровня
DRIVERS_SRC := $(wildcard *.c) $(wildcard *.asm)
DRIVERS_OBJ := $(DRIVERS_SRC:.c=.o)
DRIVERS_OBJ := $(DRIVERS_OBJ:.asm=.o)
include ../../common.mk

# Находим директории драйверов
DRIVER_DIRS := $(filter-out .,$(wildcard */))
DRIVER_DIRS := $(filter-out .,$(wildcard */))
DRIVER_OUTPUT := ../../output/drivers/

# Путь куда
DRIVER_OUTPUT = ../../output/drivers/
all: drivers

CC = i386-elf-gcc
CFLAGS = -w -ffreestanding -m32 -fno-pie -nostdlib

NS = nasm
NSFLAGS = -f elf32

all: $(DRIVERS_OBJ) drivers

# Сборка файлов в текущей папке
# Файлы прямо в этой папке (если появятся)
%.o: %.c
mkdir -p $(DRIVER_OUTPUT)
$(CC) $(CFLAGS) -c $< -o $(DRIVER_OUTPUT)$@

%.o: %.asm
mkdir -p $(DRIVER_OUTPUT)
$(NS) $(NSFLAGS) $< -o $(DRIVER_OUTPUT)$@
$(AS) $(ASFLAGS) $< -o $(DRIVER_OUTPUT)$@

# Сборка драйверов в подпапках
drivers:
@for dir in $(DRIVER_DIRS); do \
if [ -f $$dir/Makefile ] || [ -f $$dir/makefile ]; then \
if [ -f $$dir/Makefile ]; then \
echo "==> Building driver in $$dir"; \
$(MAKE) -C $$dir; \
else \
Expand Down
12 changes: 4 additions & 8 deletions src/drivers/ata/Makefile
Original file line number Diff line number Diff line change
@@ -1,12 +1,8 @@
DRIVER_NAME = ata
OBJ_DIR = ../../../output/drivers/$(DRIVER_NAME)
include ../../../common.mk

CC = i386-elf-gcc
CFLAGS = -w -ffreestanding -m32 -fno-pie -nostdlib

NSM = nasm
NSMFLAGS = -f elf32
DRIVER_NAME := ata
OBJ_DIR := ../../../output/drivers/$(DRIVER_NAME)

all:
mkdir -p $(OBJ_DIR)
$(CC) $(CFLAGS) -c ata.c -o $(OBJ_DIR)/ata.o
$(CC) $(CFLAGS) -c $(DRIVER_NAME).c -o $(OBJ_DIR)/$(DRIVER_NAME).o
12 changes: 4 additions & 8 deletions src/drivers/ata_drive/Makefile
Original file line number Diff line number Diff line change
@@ -1,12 +1,8 @@
DRIVER_NAME = ata_drive
OBJ_DIR = ../../../output/drivers/$(DRIVER_NAME)
include ../../../common.mk

CC = i386-elf-gcc
CFLAGS = -w -ffreestanding -m32 -fno-pie -nostdlib

NSM = nasm
NSMFLAGS = -f elf32
DRIVER_NAME := ata_drive
OBJ_DIR := ../../../output/drivers/$(DRIVER_NAME)

all:
mkdir -p $(OBJ_DIR)
$(CC) $(CFLAGS) -c ata_drive.c -o $(OBJ_DIR)/ata_drive.o
$(CC) $(CFLAGS) -c $(DRIVER_NAME).c -o $(OBJ_DIR)/$(DRIVER_NAME).o
12 changes: 4 additions & 8 deletions src/drivers/display/Makefile
Original file line number Diff line number Diff line change
@@ -1,12 +1,8 @@
DRIVER_NAME = display
OBJ_DIR = ../../../output/drivers/$(DRIVER_NAME)
include ../../../common.mk

CC = i386-elf-gcc
CFLAGS = -w -ffreestanding -m32 -fno-pie -nostdlib

NSM = nasm
NSMFLAGS = -f elf32
DRIVER_NAME := display
OBJ_DIR := ../../../output/drivers/$(DRIVER_NAME)

all:
mkdir -p $(OBJ_DIR)
$(CC) $(CFLAGS) -c display.c -o $(OBJ_DIR)/display.o
$(CC) $(CFLAGS) -c $(DRIVER_NAME).c -o $(OBJ_DIR)/$(DRIVER_NAME).o
12 changes: 4 additions & 8 deletions src/drivers/fat/Makefile
Original file line number Diff line number Diff line change
@@ -1,12 +1,8 @@
DRIVER_NAME = fat
OBJ_DIR = ../../../output/drivers/$(DRIVER_NAME)
include ../../../common.mk

CC = i386-elf-gcc
CFLAGS = -w -ffreestanding -m32 -fno-pie -nostdlib

NSM = nasm
NSMFLAGS = -f elf32
DRIVER_NAME := fat
OBJ_DIR := ../../../output/drivers/$(DRIVER_NAME)

all:
mkdir -p $(OBJ_DIR)
$(CC) $(CFLAGS) -c fat.c -o $(OBJ_DIR)/fat.o
$(CC) $(CFLAGS) -c $(DRIVER_NAME).c -o $(OBJ_DIR)/$(DRIVER_NAME).o
14 changes: 5 additions & 9 deletions src/drivers/keyboard/Makefile
Original file line number Diff line number Diff line change
@@ -1,13 +1,9 @@
DRIVER_NAME = keyboard
OBJ_DIR = ../../../output/drivers/$(DRIVER_NAME)
include ../../../common.mk

CC = i386-elf-gcc
CFLAGS = -w -ffreestanding -m32 -fno-pie -nostdlib

NSM = nasm
NSMFLAGS = -f elf32
DRIVER_NAME := keyboard
OBJ_DIR := ../../../output/drivers/$(DRIVER_NAME)

all:
mkdir -p $(OBJ_DIR)
$(CC) $(CFLAGS) -c keyboard.c -o $(OBJ_DIR)/keyboard.o
$(NSM) $(NSMFLAGS) keyboard_handler.asm -o $(OBJ_DIR)/keyboard_handler.o
$(CC) $(CFLAGS) -c keyboard.c -o $(OBJ_DIR)/keyboard.o
$(AS) $(ASFLAGS) keyboard_handler.asm -o $(OBJ_DIR)/keyboard_handler.o
12 changes: 4 additions & 8 deletions src/drivers/mbr/Makefile
Original file line number Diff line number Diff line change
@@ -1,12 +1,8 @@
DRIVER_NAME = mbr
OBJ_DIR = ../../../output/drivers/$(DRIVER_NAME)
include ../../../common.mk

CC = i386-elf-gcc
CFLAGS = -w -ffreestanding -m32 -fno-pie -nostdlib

NSM = nasm
NSMFLAGS = -f elf32
DRIVER_NAME := mbr
OBJ_DIR := ../../../output/drivers/$(DRIVER_NAME)

all:
mkdir -p $(OBJ_DIR)
$(CC) $(CFLAGS) -c mbr.c -o $(OBJ_DIR)/mbr.o
$(CC) $(CFLAGS) -c $(DRIVER_NAME).c -o $(OBJ_DIR)/$(DRIVER_NAME).o
12 changes: 4 additions & 8 deletions src/drivers/pci/Makefile
Original file line number Diff line number Diff line change
@@ -1,12 +1,8 @@
DRIVER_NAME = pci
OBJ_DIR = ../../../output/drivers/$(DRIVER_NAME)
include ../../../common.mk

CC = i386-elf-gcc
CFLAGS = -w -ffreestanding -m32 -fno-pie -nostdlib

NSM = nasm
NSMFLAGS = -f elf32
DRIVER_NAME := pci
OBJ_DIR := ../../../output/drivers/$(DRIVER_NAME)

all:
mkdir -p $(OBJ_DIR)
$(CC) $(CFLAGS) -c pci.c -o $(OBJ_DIR)/pci.o
$(CC) $(CFLAGS) -c $(DRIVER_NAME).c -o $(OBJ_DIR)/$(DRIVER_NAME).o
14 changes: 5 additions & 9 deletions src/drivers/pit/Makefile
Original file line number Diff line number Diff line change
@@ -1,13 +1,9 @@
DRIVER_NAME = pit
OBJ_DIR = ../../../output/drivers/$(DRIVER_NAME)
include ../../../common.mk

CC = i386-elf-gcc
CFLAGS = -w -ffreestanding -m32 -fno-pie -nostdlib

NSM = nasm
NSMFLAGS = -f elf32
DRIVER_NAME := pit
OBJ_DIR := ../../../output/drivers/$(DRIVER_NAME)

all:
mkdir -p $(OBJ_DIR)
$(CC) $(CFLAGS) -c pit.c -o $(OBJ_DIR)/pit.o
$(NSM) $(NSMFLAGS) pit_handler.asm -o $(OBJ_DIR)/pit_handler.o
$(CC) $(CFLAGS) -c pit.c -o $(OBJ_DIR)/pit.o
$(AS) $(ASFLAGS) pit_handler.asm -o $(OBJ_DIR)/pit_handler.o