makefile (view raw)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
.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 LOG_DIR := $(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)
# 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
LOCAL_BUILD := $(GLOBAL_BUILD)/components
export CCFLAGS
export GLOBAL_BUILD
MODULES := boot kernel libcedos shell
OBJECTS := $(patsubst %,$(LOCAL_BUILD)/%.o,$(MODULES)) $(LOCAL_BUILD)/apps_raw.o
DIRS := $(LOCAL_BUILD) $(LOG_DIR)
$(MODULES): | $(DIRS)
$(DIRS):
> $(MKDIR) $@
.PHONY: build
build: $(GLOBAL_BUILD)/cedos.img
$(GLOBAL_BUILD)/fat.img: $(MODULES)
# > $(LD) $(OBJECTS) -r -T link.txt -Map=$(LOG_DIR)/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 ./mnt
> sudo mount $@ ./mnt
> sudo cp $(LOCAL_BUILD)/kernel.bin ./mnt
> sudo cp $(LOCAL_BUILD)/bin/* ./mnt
> sudo cp ./img-contents/* ./mnt || echo "No img-contents folder; Skipping."
> du -csh ./mnt/*
> sudo umount ./mnt
$(GLOBAL_BUILD)/cedos.img: $(GLOBAL_BUILD)/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=$(LOCAL_BUILD)/boot.bin of=$@ count=446 conv=notrunc
> dd if=$(LOCAL_BUILD)/boot.bin of=$@ skip=1 seek=1 count=7 conv=notrunc
> python3 binimg.py -w 256 -i $(GLOBAL_BUILD)/cedos.img -o $(GLOBAL_BUILD)/cedos.png
> parted $@ print list all
# > $(LD) $(OBJECTS) -T link.txt -Map=$(LOG_DIR)/bin_mapfile.txt --oformat binary --nostdlib -o $@
.PHONY: logs
logs: $(LOG_DIR)/base.sym $(LOG_DIR)/objdump.txt
.PHONY: boot
boot:
> $(MAKE) GLOBAL_BUILD=$(LOCAL_BUILD) -C src/boot $(LOCAL_BUILD)/boot.bin
.PHONY: kernel
kernel:
> $(MAKE) GLOBAL_BUILD=$(LOCAL_BUILD) -C src/kernel $(LOCAL_BUILD)/kernel.bin
.PHONY: libcedos
libcedos:
> $(MAKE) GLOBAL_BUILD=$(LOCAL_BUILD) -C src/libcedos build
.PHONY: shell
shell:
> $(MAKE) GLOBAL_BUILD=$(LOCAL_BUILD) -C src/shell build
.PHONY: clean
clean:
> $(RM) -r $(CURRENT_DIR)/build/* 2> /dev/null; true
.PHONY: run
run:
> ./run.sh $(GLOBAL_BUILD)/cedos.img
.PHONY: docs
docs:
> doxygen doxygen.cfg