# Kernel Makefile # try `make help` for more information echo=$(shell which echo) -e # Default target .DEFAULT_GOAL = all # Path to the files for the initial ramdisk (for Assignment 7) INITRD_DIR ?= initrd/ INITRD_TOOL ?= fs/tool/fstool INITRD_DEP = # 1MB free space INITRD_FREE ?= 1048576 # Kernel source files LINKER_SCRIPT = compiler/sections.ld CC_SOURCES = $(shell find * -name "*.cc" -a ! -name '.*' -a ! -path 'test*' -a ! -path 'fs/tool/*' -a ! -path 'assets/*' -a ! -path 'tools/*') ASM_SOURCES = $(shell find * -name "*.asm" -a ! -name '.*') # Target files KERNEL = $(BUILDDIR)/system KERNEL64 = $(KERNEL)64 ISOFILE = $(BUILDDIR)/stubs.iso KERNEL_LINK = $(ROOTBUILDDIR)/system.img # Include global variables and standard recipes include tools/common.mk # Initial Ramdisk ifneq ($(wildcard $(INITRD_DIR)*),) INITRD = $(BUILDDIR)/initrd.img INITRD_DEP += $(shell find $(INITRD_DIR) -type f ) # Additional dependency for kernel $(KERNEL): $(INITRD) endif all: $(KERNEL) # Linking the system image # We use the C++ compiler (which calls the actual linker) $(KERNEL64): $(ASM_OBJECTS) $(CC_OBJECTS) $(LINKER_SCRIPT) $(MAKEFILE_LIST) @echo "LD $@" @mkdir -p $(@D) $(VERBOSE) $(CXX) $(CXXFLAGS) -Wl,-T $(LINKER_SCRIPT) -o $@ $(LDFLAGS) $(ASM_OBJECTS) $(CC_OBJECTS) @echo "LN $(KERNEL_LINK)" $(VERBOSE) ln -sf $(@:$(ROOTBUILDDIR)/%=%) "$(KERNEL_LINK)" # The kernel must be a 32bit elf for multiboot compliance $(KERNEL): $(KERNEL64) $(VERBOSE) $(OBJCOPY) -I elf64-x86-64 -O elf32-i386 $< $@ # Tool for editing a Minix v3 file system image (Assignment 7) $(INITRD_TOOL): $(shell test -d $(dir $(INITRD_TOOL)) && find $(dir $(INITRD_TOOL)) -name "*.cc" -or -name '*.h') @echo "Make $@" @make -C $(dir $(INITRD_TOOL)) # Initial Ramdisk with Minix v3 file system $(INITRD): $(INITRD_TOOL) $(INITRD_DEP) @echo "INITRD $@" @dd if=/dev/zero of=$@ bs=$(shell du -s $(INITRD_DIR) | cut -f1 | xargs expr $(INITRD_FREE) + ) count=1 @mkfs.minix -3 $@ # optional --inodes @./$(INITRD_TOOL) put "$(INITRD_DIR)" $@