92 lines
2.2 KiB
Makefile
92 lines
2.2 KiB
Makefile
#
|
|
# Makefile for mittos64 kernel
|
|
# (c) Thomas Lovén 2016-2017
|
|
# mittos64@thomasloven.com
|
|
#
|
|
|
|
ifeq ($(MITTOS64),)
|
|
$(error Build environment is not activated. Please source activate)
|
|
endif
|
|
|
|
|
|
# Find all source files and corresponding object files
|
|
KERNEL_SRC := $(wildcard **/*.[cS]*)
|
|
KERNEL_OBJS := $(addprefix obj/,$(patsubst %,%.o,$(basename $(basename $(KERNEL_SRC)))))
|
|
|
|
# Kernel object file
|
|
KERNEL := obj/boot/kernel
|
|
# Special file for keeping git information up to date
|
|
VERSION_OBJ := obj/boot/version.o
|
|
|
|
|
|
# Default compilation flags
|
|
CFLAGS ?= -Wall -Wextra
|
|
CFLAGS += -ffreestanding -mcmodel=large -mno-red-zone
|
|
CPPFLAGS += -Iinclude
|
|
# Optimize only if not debugging
|
|
ifdef NDEBUG
|
|
CFLAGS += -O2
|
|
CPPFLAGS += -DNDEBUG
|
|
else
|
|
CFLAGS += -ggdb -O0
|
|
ASFLAGS += -ggdb
|
|
endif
|
|
|
|
KERNEL_DEP := $(KERNEL_OBJS:.o=.d)
|
|
DEPFLAGS = -MT $@ -MMD -MP -MF obj/$*.d
|
|
|
|
all: $(KERNEL)
|
|
|
|
# Make sure the object directories exist
|
|
OBJ_DIRS := $(sort $(dir $(KERNEL_OBJS)))
|
|
$(KERNEL_OBJS): | $(OBJ_DIRS)
|
|
$(OBJ_DIRS):
|
|
mkdir -p $@
|
|
|
|
# Git status flags for the version file
|
|
GITHASH := $(shell git log -1 --pretty="tformat:%h")
|
|
GITDATE := $(shell git log -1 --pretty="tformat:%cd")
|
|
GITDIRTY := $(shell git status -s >/dev/null 2>/dev/null && echo 1 || echo 0)
|
|
GITMESSAGE := $(shell git log -1 --pretty="tformat:%s")
|
|
GITBRANCH := $(shell git log -1 --pretty="tformat:%d")
|
|
GITFLAGS := -DGITHASH='"$(GITHASH)"' \
|
|
-DGITDATE='"$(GITDATE)"' \
|
|
-DGITDIRTY='$(GITDIRTY)' \
|
|
-DGITMESSAGE='"$(GITMESSAGE)"' \
|
|
-DGITBRANCH='"$(GITBRANCH)"'
|
|
$(VERSION_OBJ): CFLAGS += $(GITFLAGS)
|
|
|
|
# The kernel needs some special flags
|
|
$(KERNEL): LDFLAGS += -n -nostdlib -T Link.ld
|
|
$(KERNEL): LDLIBS := -lgcc
|
|
$(KERNEL): $(KERNEL_OBJS)
|
|
rm -rf $(VERSION_OBJ)
|
|
$(MAKE) $(VERSION_OBJ)
|
|
$(LINK.c) $^ -o $@
|
|
|
|
# Use the default make compilation rules
|
|
obj/%.o: %.c obj/%.d
|
|
$(COMPILE.c) $(DEPFLAGS) $< -o $@
|
|
obj/%.o: %.S obj/%.d
|
|
$(COMPILE.S) $(DEPFLAGS) $< -o $@
|
|
%.S: %.S.py
|
|
python $^ > $@
|
|
obj/%.d: ;
|
|
|
|
# For installing stuff
|
|
${SYSROOT}/%: obj/%
|
|
mkdir -p $(dir $@)
|
|
cp $< $@
|
|
|
|
install-kernel: ${SYSROOT}/boot/kernel
|
|
|
|
install: install-kernel
|
|
|
|
clean:
|
|
rm -rf obj/
|
|
|
|
-include $(KERNEL_DEP)
|
|
|
|
.PHONY: all clean install install-kernel
|
|
.INTERMEDIATE: $(basename $(filter %.py, $(KERNEL_SRC)))
|