.RECIPEPREFIX = > # directory definitions export CURRENT_DIR := $(shell pwd) export ROOT_DIR := $(CURRENT_DIR) export SOURCE_DIR := $(CURRENT_DIR)/src export INCLUDE_DIR := $(CURRENT_DIR)/include export BUILD_LOGS := $(CURRENT_DIR)/log # path to cross compiler export CROSS_COMP := $(HOME)/opt/cross/bin/i686-elf- export CC := $(CROSS_COMP)gcc export LD := $(CROSS_COMP)ld export AS := $(CROSS_COMP)as export AR := $(CROSS_COMP)ar export OBJCOPY := $(CROSS_COMP)objcopy export OBJDUMP := $(CROSS_COMP)objdump #export MAKE := make -R export MKDIR := mkdir -p export RM := rm GLOBAL_BUILD := $(CURRENT_DIR)/build # common flags CCFLAGS := $(CCFLAGS) -Wno-write-strings CCFLAGS := $(CCFLAGS) -Qn CCFLAGS := $(CCFLAGS) -pedantic -Wold-style-definition CCFLAGS := $(CCFLAGS) -Wall -Wextra -fno-exceptions CCFLAGS := $(CCFLAGS) -Werror-implicit-function-declaration CCFLAGS := $(CCFLAGS) -nostdlib -nostartfiles -ffreestanding CCFLAGS := $(CCFLAGS) -mgeneral-regs-only -mno-red-zone CCFLAGS := $(CCFLAGS) --prefix=$(CROSS_COMP) GIT_VERSION := "$(shell git describe --abbrev=4 --dirty --always --tags)" CCFLAGS := $(CCFLAGS) -DVERSION=\"$(GIT_VERSION)\" # debug target .PHONY: debug debug: DEBUG := 1 # release target ifdef DEBUG CCFLAGS := $(CCFLAGS) -D DEBUG -g -O0 GLOBAL_BUILD := $(GLOBAL_BUILD)/debug else CCFLAGS := $(CCFLAGS) -O1 GLOBAL_BUILD := $(GLOBAL_BUILD)/release endif BUILD_OBJECTS := $(GLOBAL_BUILD)/obj BUILD_ARTIFACTS := $(GLOBAL_BUILD)/artifacts BUILD_LOGS := $(GLOBAL_BUILD)/logs BUILD_MOUNT := $(GLOBAL_BUILD)/mnt export CCFLAGS export GLOBAL_BUILD SRC_ALL := $(shell find common/ boot/ kernel/ libcedos/ shell/ -name '*.c') ASM_ALL := $(shell find common/ boot/ kernel/ libcedos/ shell/ -name '*.s') OBJECTS := $(patsubst %,$(BUILD_OBJECTS)/%.o,$(SRC_ALL) $(ASM_ALL)) DIRS := $(dir $(OBJECTS)) $(BUILD_ARTIFACTS) $(BUILD_LOGS) DIRS := $(sort $(DIRS)) $(DIRS): > $(MKDIR) $@ .PHONY: build build: $(BUILD_ARTIFACTS)/cedos.img $(OBJECTS): $(DIRS) $(BUILD_OBJECTS)/%.s.o: %.s > $(AS) -o $@ $< # common OBJ_COMMON := $(filter $(BUILD_OBJECTS)/common/%,$(OBJECTS)) $(BUILD_OBJECTS)/common/%.c.o: common/%.c > $(CC) -c -Icommon $(CCFLAGS) -o $@ $< # boot OBJ_BOOT := $(filter $(BUILD_OBJECTS)/boot/%,$(OBJECTS)) OUT_BOOT := $(BUILD_ARTIFACTS)/boot.elf $(BUILD_ARTIFACTS)/boot.bin $(BUILD_OBJECTS)/boot/%.c.o: boot/%.c > $(CC) -c -Iboot -Icommon $(CCFLAGS) -o $@ $< $(BUILD_ARTIFACTS)/boot.elf: $(OBJ_BOOT) $(OBJ_COMMON) > $(LD) $^ -T boot/link.txt -Map=$(BUILD_LOGS)/boot_mapfile.txt --oformat elf32-i386 -o $@ $(BUILD_ARTIFACTS)/boot.bin: $(OBJ_BOOT) $(OBJ_COMMON) > $(LD) $^ -T boot/link.txt -Map=$(BUILD_LOGS)/boot_mapfile.txt --oformat binary -o $@ .PHONY: boot boot: $(OUT_BOOT) # kernel OBJ_KERNEL := $(filter $(BUILD_OBJECTS)/kernel/%,$(OBJECTS)) OUT_KERNEL := $(BUILD_ARTIFACTS)/kernel.elf $(BUILD_ARTIFACTS)/kernel.bin $(BUILD_OBJECTS)/kernel/%.c.o: kernel/%.c > $(CC) -c -Ikernel -Icommon $(CCFLAGS) -o $@ $< $(BUILD_ARTIFACTS)/kernel.elf: $(OBJ_KERNEL) $(OBJ_COMMON) > $(LD) $^ -T kernel/link.txt -Map=$(BUILD_LOGS)/kernel_mapfile.txt --oformat elf32-i386 -o $@ $(BUILD_ARTIFACTS)/kernel.bin: $(OBJ_KERNEL) $(OBJ_COMMON) > $(LD) $^ -T kernel/link.txt -Map=$(BUILD_LOGS)/kernel_mapfile.txt --oformat binary -o $@ .PHONY: kernel kernel: $(OUT_KERNEL) # libcedos OBJ_LIBCEDOS := $(filter $(BUILD_OBJECTS)/libcedos/%,$(OBJECTS)) OUT_LIBCEDOS := $(BUILD_ARTIFACTS)/libcedos.a $(BUILD_OBJECTS)/libcedos/%.c.o: libcedos/%.c > $(CC) -c -Ilibcedos -Icommon $(CCFLAGS) -o $@ $< $(BUILD_ARTIFACTS)/libcedos.a: $(OBJ_LIBCEDOS) $(OBJ_COMMON) > $(AR) rcs $@ $^ .PHONY: libcedos libcedos: $(OUT_LIBCEDOS) # shell OBJ_SHELL := $(filter $(BUILD_OBJECTS)/shell/%,$(OBJECTS)) OUT_SHELL := $(patsubst $(BUILD_OBJECTS)/shell/%.c.o,$(BUILD_ARTIFACTS)/%,$(OBJ_SHELL)) SHELL_CCFLAGS += -I../libcedos/include SHELL_LDFLAGS += -L$(BUILD_ARTIFACTS) SHELL_LDFLAGS += -lcedos SHELL_LDFLAGS += -T shell/link.txt SHELL_LDFLAGS += -Map=$(BUILD_LOGS)/$(notdir $@)_mapfile.txt SHELL_LDFLAGS += -N $(BUILD_OBJECTS)/shell/%.c.o: shell/%.c > $(CC) -c -Ishell -Ilibcedos -Icommon $(CCFLAGS) $(SHELL_CCFLAGS) -o $@ $< $(BUILD_ARTIFACTS)/%: $(BUILD_OBJECTS)/shell/%.c.o | $(BUILD_ARTIFACTS)/libcedos.a > $(LD) $^ $(LDFLAGS) $(SHELL_LDFLAGS) -o $@ .PHONY: shell shell: $(OUT_SHELL) # disk image $(BUILD_ARTIFACTS)/fat.img: $(filter %.bin,$(OUT_KERNEL)) $(OUT_SHELL) | $(BUILD_ARTIFACTS)/boot.bin # > $(LD) $(OBJECTS) -r -T link.txt -Map=$(BUILD_LOGS)/elf_mapfile.txt --oformat elf32-i386 -o $@ > dd if=/dev/zero of=$@ count=896 > mkfs.fat -n "cedos" -S 512 -s 8 -r 32 $@ > mkdir -p $(BUILD_MOUNT) > sudo mount $@ $(BUILD_MOUNT) > sudo cp $^ $(BUILD_MOUNT) > sudo cp ./img-contents/* $(BUILD_MOUNT) || echo "No img-contents folder; Skipping." > du -csh $(BUILD_MOUNT)/* > sudo umount $(BUILD_MOUNT) > rm -r $(BUILD_MOUNT) $(BUILD_ARTIFACTS)/cedos.img: $(BUILD_ARTIFACTS)/fat.img | $(MODULES) > dd if=/dev/zero of=$@ count=904 > parted $@ mklabel msdos > parted $@ mkpart primary FAT32 8s 896s -s > parted $@ set 1 boot on > dd if=$< of=$@ seek=8 conv=notrunc > dd bs=1 if=$(BUILD_ARTIFACTS)/boot.bin of=$@ count=446 conv=notrunc > dd if=$(BUILD_ARTIFACTS)/boot.bin of=$@ skip=1 seek=1 count=7 conv=notrunc > python3 binimg.py -w 256 -i $(BUILD_ARTIFACTS)/cedos.img -o $(BUILD_ARTIFACTS)/cedos.png > parted $@ print list all # > $(LD) $(OBJECTS) -T link.txt -Map=$(BUILD_LOGS)/bin_mapfile.txt --oformat binary --nostdlib -o $@ .PHONY: logs logs: $(BUILD_LOGS)/base.sym $(BUILD_LOGS)/objdump.txt .PHONY: clean clean: > $(RM) -r $(CURRENT_DIR)/build/* 2> /dev/null; true .PHONY: run run: > ./run.sh $(BUILD_ARTIFACTS)/cedos.img .PHONY: docs docs: > doxygen doxygen.cfg