Files
operating-system/Makefile

60 lines
1.6 KiB
Makefile

.SUFFIXES:
.PHONY: all clean
SOURCE_DIR := src
BUILD_DIR := build
CONTAINER_CMD := podman run -v "$(shell pwd)":"/scratch" \
--workdir="/scratch" \
-e TERM \
-t \
cc-i686:latest
CC := $(CONTAINER_CMD) i686-elf-gcc
LD := $(CONTAINER_CMD) i686-elf-ld
AS := $(CONTAINER_CMD) i686-elf-as
AR := $(CONTAINER_CMD) i686-elf-ar
C_SOURCES := $(shell find $(SOURCE_DIR) -name '*.c')
ASM_SOURCES := $(shell find $(SOURCE_DIR) -name '*.S')
OBJECTS := $(patsubst $(SOURCE_DIR)/%, $(BUILD_DIR)/%, $(C_SOURCES:.c=.o) $(ASM_SOURCES:.S=.o))
DEPENDS := $(patsubst $(SOURCE_DIR)/%, $(BUILD_DIR)/%, $(C_SOURCES:.c=.d))
CFLAGS := -MMD -ffreestanding -O0 -Wall -Wextra -Werror -std=c2x -I$(SOURCE_DIR)/include -no-pie -fstack-protector-strong
ASFLAGS :=
$(info C_SOURCES is $(C_SOURCES))
$(info ASM_SOURCES is $(ASM_SOURCES))
$(info OBJECTS is $(OBJECTS))
$(info DEPENDS is $(DEPENDS))
all: myos.iso
run: myos.iso
qemu-system-i386 -cdrom myos.iso
cross-compiler: cross-compiler-image/Dockerfile
podman build cross-compiler-image -t cc-i686
myos.iso: $(BUILD_DIR)/myos.bin
@mkdir -p $(BUILD_DIR)/image/boot/grub
cp -v $< $(BUILD_DIR)/image/boot/
cp -v grub.cfg $(BUILD_DIR)/image/boot/grub/grub.cfg
grub-mkrescue -o $@ $(BUILD_DIR)/image
$(BUILD_DIR)/myos.bin: $(OBJECTS)
mkdir -p $(BUILD_DIR)
$(CC) -T linker.ld -o $@ $(CFLAGS) -nostdlib $^ -lgcc
-include $(DEPENDS)
$(BUILD_DIR)/%.o: $(SOURCE_DIR)/%.c Makefile
@mkdir -p $(@D)
$(CC) -c $(CFLAGS) $< -o $@
$(BUILD_DIR)/%.o: $(SOURCE_DIR)/%.S Makefile
@mkdir -p $(@D)
$(AS) $(ASFLAGS) $< -o $@