Ömer Özsipahi feature: C kernel
Makefile 1.2 KB
CC = x86_64-elf-gcc
LD = x86_64-elf-ld
OBJCOPY = x86_64-elf-objcopy
CFLAGS = -ffreestanding -fno-stack-protector -fno-pic -mno-red-zone -m64 -Wall -Wextra -I..
LDFLAGS = -T linker.ld
NAME = kernel.bin
ELF = kernel.elf
# 1. rwildcard silindi. Yerine doğrudan işletim sisteminin 'find' komutu kullanıldı.
# Bu, üst dizindeki tüm .c dosyalarını çok daha güvenli ve hızlı bulur.
SRC := $(shell find ../ -type f -name "*.c")
# 2. Dosya isimlerini ayıkla (Örn: vga.o)
OBJS := $(notdir $(SRC:.c=.o))
# 3. Make'e dosyaları nerede bulacağını söyle
VPATH := $(sort $(dir $(SRC)))
all: $(NAME)
$(NAME): $(ELF)
@$(OBJCOPY) -O binary $(ELF) $(NAME)
@size=$$(stat -f%z $(NAME) 2>/dev/null || stat -c%s $(NAME)); \
pad=$$(( (512 - size % 512) % 512 )); \
if [ $$pad -ne 0 ]; then \
dd if=/dev/zero bs=1 count=$$pad >> $(NAME) 2>/dev/null; \
fi
@echo "kernel.bin boyutu: $$(stat -f%z $(NAME) 2>/dev/null || stat -c%s $(NAME)) byte ($$(( ($$(stat -f%z $(NAME) 2>/dev/null || stat -c%s $(NAME))) / 512 )) sektör)"
$(ELF): $(OBJS)
@$(LD) $(LDFLAGS) -o $(ELF) $(OBJS)
%.o: %.c
@$(CC) $(CFLAGS) -c $< -o $@
clean:
@rm -f $(OBJS) $(ELF)
fclean: clean
@rm -f $(NAME)
re: fclean all
.PHONY: all clean fclean re