DEFAULT_HOST=$(shell ../default-host.sh) HOST?=DEFAULT_HOST HOSTARCH=$(shell ../target-triplet-to-arch.sh $(HOST)) CFLAGS?=-O3 -g CPPFLAGS?= LDFLAGS?= LIBS?= DESTDIR?= PREFIX?=/usr/local EXEC_PREFIX?=$(PREFIX) BOOTDIR?=$(EXEC_PREFIX)/boot INCLUDEDIR?=$(PREFIX)/include CFLAGS:=$(CFLAGS) -ffreestanding -Wall -Wextra -fstack-protector-strong -mgeneral-regs-only -mno-red-zone CPPFLAGS:=$(CPPFLAGS) -D__is_kernel -Iinclude LDFLAGS:=$(LDFLAGS) LIBS:=$(LIBS) -nostdlib -lk -lgcc ARCHDIR=arch/$(HOSTARCH) include $(ARCHDIR)/make.config CFLAGS:=$(CFLAGS) $(KERNEL_ARCH_FLAGS) CPPFLAGS:=$(CPPFLAGS) $(KERNEL_ARCH_CPPFLAGS) LDFLAGS:=$(LDFLAGS) $(KERNEL_ARCH_LDFLAGS) LIBS:=$(LIBS) $(KERNEL_ARCH_LIBS) KERNEL_OBJS=\ $(KERNEL_ARCH_OBJS) \ rockos/kernel.o \ rockos/paging.o \ rockos/keyboard.o \ rockos/timer.o \ OBJS=\ $(ARCHDIR)/boot/crti.o \ $(ARCHDIR)/crtbegin.o \ $(KERNEL_OBJS) \ $(ARCHDIR)/crtend.o \ $(ARCHDIR)/boot/crtn.o \ LINK_LIST=\ $(LDFLAGS) \ $(ARCHDIR)/boot/crti.o \ $(ARCHDIR)/crtbegin.o \ $(KERNEL_OBJS) \ $(LIBS) \ $(ARCHDIR)/crtend.o \ $(ARCHDIR)/boot/crtn.o \ .PHONY: all clean install install-headers install-kernel .SUFFIXES: .o .c .S all: rockos.kernel rockos.kernel: $(OBJS) $(ARCHDIR)/linker.ld $(CC) -T $(ARCHDIR)/linker.ld -o $@ $(CFLAGS) $(LINK_LIST) $(GRUB_FILE) --is-x86-multiboot rockos.kernel $(ARCHDIR)/crtbegin.o $(ARCHDIR)/crtend.o: OBJ=`$(CC) $(CFLAGS) $(LDFLAGS) -print-file-name=$(@F)` && cp "$$OBJ" $@ .c.o: $(CC) -MD -c $< -o $@ -std=gnu11 $(CFLAGS) $(CPPFLAGS) .S.o: $(CC) -MD -c $< -o $@ $(CFLAGS) $(CPPFLAGS) clean: rm -f rockos.kernel rm -f $(OBJS) *.o */*.o */*/*.o rm -f $(OBJS:.o=.d) *.d */*.d */*/*.d install: install-headers install-kernel install-headers: mkdir -p $(DESTDIR)$(INCLUDEDIR) cp -Rp include/. $(DESTDIR)$(INCLUDEDIR)/. install-kernel: rockos.kernel mkdir -p $(DESTDIR)$(BOOTDIR) cp rockos.kernel $(DESTDIR)$(BOOTDIR) -include $(OBJS:.o=.d)