os/Makefile

144 lines
3.4 KiB
Makefile

BINUTILS_VERSION := 2.38
GCC_VERSION := 11.2.0
PREFIX := ${PWD}/cross
CROSS_BIN := ${PREFIX}/bin
BUILD_DIR := ./build
TARGET := x86_64-elf
FONTS := default8x16.o
BUILD_DIR_ABS := $(abspath $(BUILD_DIR))
FONT_OBJS := $(patsubst %.o,$(BUILD_DIR_ABS)/%.o, $(FONTS))
ISO_DIR := $(BUILD_DIR)/iso_dir
CROSS_AS := ${TARGET}-as
CROSS_CC := ${TARGET}-gcc
CROSS_LD := ${TARGET}-ld
CFLAGS := "-ggdb -std=gnu99 -ffreestanding -O2 -Wall -Wextra -I$$PWD/kernel -mno-red-zone"
LDFLAGS := "-ggdb -ffreestanding -O2 -nostdlib -lgcc"
export PATH := ${CROSS_BIN}:$(PATH)
.PHONY: all
all: $(BUILD_DIR)/kernel.bin $(BUILD_DIR)/$(FONTS)
.PHONY: run-qemu
run-qemu: $(BUILD_DIR)/kernel.iso
@qemu-system-x86_64 -cdrom $<
$(BUILD_DIR)/kernel.iso: $(ISO_DIR)/boot/kernel.bin
@grub-mkrescue -o $@ $(ISO_DIR)
$(ISO_DIR)/boot/kernel.bin: $(BUILD_DIR)/kernel.bin $(ISO_DIR)/boot/grub/grub.cfg
@cp $< $@
$(ISO_DIR)/boot/grub/grub.cfg: $(ISO_DIR)/boot
@cp -r grub $<
$(ISO_DIR)/boot: $(ISO_DIR)
@mkdir -p $@
$(ISO_DIR):
@mkdir -p $@
$(BUILD_DIR)/kernel.bin: $(BUILD_DIR) $(BUILD_DIR)/$(FONTS)
@$(MAKE) -C kernel \
BUILD_DIR=$(abspath $(BUILD_DIR)) \
CROSS_AS=${CROSS_AS} \
CROSS_CC=${CROSS_CC} \
CROSS_LD=${CROSS_LD} \
CFLAGS=${CFLAGS} \
EXTRA_OBJS=${FONT_OBJS} \
LDFLAGS=${LDFLAGS}
$(BUILD_DIR):
@mkdir -p $@
$(BUILD_DIR)/$(FONTS):
@$(MAKE) -C fonts BUILD_DIR=$(abspath $(BUILD_DIR)) OBJECTS=$(FONTS)
.PHONY: crossdev
crossdev: install-binutils install-gcc install-target-libgcc clean-cross
.PHONY: install-binutils
install-binutils: build-binutils ${CROSS_BIN}
@$(MAKE) -C binutils-${BINUTILS_VERSION}/build install
.PHONY: install-gcc
install-gcc: all-gcc ${CROSS_BIN}
@$(MAKE) -C gcc-${GCC_VERSION}/build $@
.PHONY: install-target-libgcc
install-target-libgcc: all-target-libgcc ${CROSS_BIN}
@$(MAKE) -C gcc-${GCC_VERSION}/build $@
${CROSS_BIN}:
@mkdir -p $@
.PHONY: build-binutils
build-binutils: binutils-${BINUTILS_VERSION}/build/Makefile
@dirname $< | \
xargs \
$(MAKE) -C
.PHONY: all-gcc
all-gcc: gcc-${GCC_VERSION}/build/Makefile install-binutils
@dirname $< | \
xargs -I {} \
$(MAKE) -C {} $@
.PHONY: all-target-libgcc
all-target-libgcc: gcc-${GCC_VERSION}/build/Makefile install-binutils
@dirname $< | \
xargs -I {} \
$(MAKE) -C {} $@
binutils-${BINUTILS_VERSION}/build/Makefile: binutils-${BINUTILS_VERSION}/build
@cd $< && \
../configure \
--target="${TARGET}" \
--prefix="${PREFIX}" \
--with-sysroot \
--disable-nls \
--disable-werror
gcc-${GCC_VERSION}/build/Makefile: gcc-${GCC_VERSION}/build install-binutils
@cd $< && \
../configure \
--target="${TARGET}" \
--prefix="${PREFIX}" \
--disable-nls \
--enable-languages=c,c++ \
--without-headers
binutils-${BINUTILS_VERSION}/build: binutils-${BINUTILS_VERSION}
@mkdir -p $@
gcc-${GCC_VERSION}/build: gcc-${GCC_VERSION}
@mkdir -p $@
binutils-${BINUTILS_VERSION}: binutils.tar.gz
@tar xf $<
gcc-${GCC_VERSION}: gcc.tar.gz
@tar xf $<
binutils.tar.gz:
@curl -o $@ https://ftp.gnu.org/gnu/binutils/binutils-${BINUTILS_VERSION}.tar.gz
gcc.tar.gz:
@curl -o $@ https://ftp.gnu.org/gnu/gcc/gcc-${GCC_VERSION}/gcc-${GCC_VERSION}.tar.gz
.PHONY: clean-cross
clean-cross:
@rm -f gcc.tar.gz
@rm -f binutils.tar.gz
@rm -rf gcc-$(GCC_VERSION)
@rm -rf binutils-$(BINUTILS_VERSION)
.PHONY: clean
clean:
@rm -rf $(BUILD_DIR)