diff --git a/Makefile b/Makefile index 5694dab..21c1647 100644 --- a/Makefile +++ b/Makefile @@ -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 diff --git a/common.mk b/common.mk new file mode 100644 index 0000000..c4fdfa6 --- /dev/null +++ b/common.mk @@ -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 diff --git a/src/drivers/Makefile b/src/drivers/Makefile index 3a2b4b6..ee995e1 100644 --- a/src/drivers/Makefile +++ b/src/drivers/Makefile @@ -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 \ diff --git a/src/drivers/ata/Makefile b/src/drivers/ata/Makefile index 23baa2c..7bb84d1 100644 --- a/src/drivers/ata/Makefile +++ b/src/drivers/ata/Makefile @@ -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 diff --git a/src/drivers/ata_drive/Makefile b/src/drivers/ata_drive/Makefile index f45b2ec..f9eab3a 100644 --- a/src/drivers/ata_drive/Makefile +++ b/src/drivers/ata_drive/Makefile @@ -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 diff --git a/src/drivers/display/Makefile b/src/drivers/display/Makefile index c63cbcb..787ca9f 100644 --- a/src/drivers/display/Makefile +++ b/src/drivers/display/Makefile @@ -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 diff --git a/src/drivers/fat/Makefile b/src/drivers/fat/Makefile index 4331d9b..fc80856 100644 --- a/src/drivers/fat/Makefile +++ b/src/drivers/fat/Makefile @@ -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 diff --git a/src/drivers/keyboard/Makefile b/src/drivers/keyboard/Makefile index 42cce64..4848577 100644 --- a/src/drivers/keyboard/Makefile +++ b/src/drivers/keyboard/Makefile @@ -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 diff --git a/src/drivers/mbr/Makefile b/src/drivers/mbr/Makefile index 16273c2..6cb3656 100644 --- a/src/drivers/mbr/Makefile +++ b/src/drivers/mbr/Makefile @@ -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 diff --git a/src/drivers/pci/Makefile b/src/drivers/pci/Makefile index f8d03f6..ed5700f 100644 --- a/src/drivers/pci/Makefile +++ b/src/drivers/pci/Makefile @@ -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 diff --git a/src/drivers/pit/Makefile b/src/drivers/pit/Makefile index 21d1a3f..ac32f90 100644 --- a/src/drivers/pit/Makefile +++ b/src/drivers/pit/Makefile @@ -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