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)))
 |