TOPDIR = $(shell pwd) ARCH = x86 NAME = metalsvm LWIPDIRS = lwip/src/api lwip/src/core lwip/src/core/ipv4 lwip/src/netif DRIVERDIRS = drivers/net drivers/char KERNDIRS = libkern kernel mm fs arch/$(ARCH)/kernel arch/$(ARCH)/mm arch/$(ARCH)/scc $(LWIPDIRS) $(DRIVERDIRS) SUBDIRS = $(KERNDIRS) CC_FOR_TARGET=i386-unknown-linux-gnu-gcc CXX_FOR_TARGET=i386-unknown-linux-gnu-g++ GCC_FOR_TARGET=i386-unknown-linux-gnu-gcc AR_FOR_TARGET=i386-unknown-linux-gnu-ar AS_FOR_TARGET=i386-unknown-linux-gnu-as LD_FOR_TARGET=i386-unknown-linux-gnu-ld NM_FOR_TARGET=i386-unknown-linux-gnu-nm OBJDUMP_FOR_TARGET=i386-unknown-linux-gnu-objdump OBJCOPY_FOR_TARGET=i386-unknown-linux-gnu-objcopy RANLIB_FOR_TARGET=i386-unknown-linux-gnu-ranlib STRIP_FOR_TARGET=i386-unknown-linux-gnu-strip READELF_FOR_TARGET=i386-unknown-linux-gnu-readelf NASM = nasm EMU=qemu GDB=gdb MAKE = make NASMFLAGS = -felf32 -g INCLUDE = -I$(TOPDIR)/include -I$(TOPDIR)/arch/$(ARCH)/include -I$(TOPDIR)/lwip/src/include -I$(TOPDIR)/lwip/src/include/ipv4 -I$(TOPDIR)/drivers # Compiler options for final code CFLAGS = -g -m32 -march=i586 -Wall -O2 -fno-zero-initialized-in-bss -fno-builtin -fstrength-reduce -fomit-frame-pointer -finline-functions -nostdinc $(INCLUDE) # Compiler options for debuuging #CFLAGS = -g -O -m32 -march=i586 -Wall -fno-zero-initialized-in-bss -fno-builtin -DWITH_FRAME_POINTER -nostdinc $(INCLUDE) ARFLAGS = rsv RM = rm -rf LDFLAGS = -T link.ld -z max-page-size=4096 --defsym __BUILD_DATE=$(shell date +'%Y%m%d') --defsym __BUILD_TIME=$(shell date +'%H%M%S') STRIP_DEBUG = --strip-debug KEEP_DEBUG = --only-keep-debug # Prettify output V = 0 ifeq ($V,0) Q = @ P = > /dev/null endif default: all all: newlib tools $(NAME).elf newlib: $(MAKE) ARCH=$(ARCH) LDFLAGS="-m32" CFLAGS="-m32 -O2 -march=i586 " NASMFLAGS="$(NASMFLAGS)" CC_FOR_TARGET=$(CC_FOR_TARGET) \ CXX_FOR_TARGET=$(CXX_FOR_TARGET) \ GCC_FOR_TARGET=$(GCC_FOR_TARGET) \ AR_FOR_TARGET=$(AR_FOR_TARGET) \ AS_FOR_TARGET=$(AS_FOR_TARGET) \ LD_FOR_TARGET=$(LD_FOR_TARGET) \ NM_FOR_TARGET=$(NM_FOR_TARGET) \ OBJDUMP_FOR_TARGET=$(OBJDUMP_FOR_TARGET) \ OBJCOPY_FOR_TARGET=$(OBJCOPY_FOR_TARGET) \ RANLIB_FOR_TARGET=$(RANLIB_FOR_TARGET) \ STRIP_FOR_TARGET=$(STRIP_FOR_TARGET) \ READELF_FOR_TARGET=$(READELF_FOR_TARGET) -C newlib tools: $(MAKE) -C tools $(NAME).elf: $Q$(LD_FOR_TARGET) $(LDFLAGS) -o $(NAME).elf $^ @echo [OBJCOPY] $(NAME).sym $Q$(OBJCOPY_FOR_TARGET) $(KEEP_DEBUG) $(NAME).elf $(NAME).sym @echo [OBJCOPY] $(NAME).elf $Q$(OBJCOPY_FOR_TARGET) $(STRIP_DEBUG) $(NAME).elf qemu: newlib tools $(NAME).elf qemu -smp 2 -net nic,model=rtl8139 -net user,hostfwd=tcp::12345-:7 -net dump -kernel metalsvm.elf -initrd tools/initrd.img qemudbg: newlib tools $(NAME).elf qemu -S -s -smp 2 -net nic,model=rtl8139 -net user,hostfwd=tcp::12345-:7 -net dump -kernel metalsvm.elf -initrd tools/initrd.img gdb: $(NAME).elf make qemudbg > /dev/null & $(GDB) -x script.gdb clean: $Q$(RM) $(NAME).elf $(NAME).sym *~ $Q$(MAKE) -C tools clean @echo Cleaned. veryclean: clean $Q$(MAKE) -C newlib veryclean @echo Very cleaned #depend: # for i in $(SUBDIRS); do $(MAKE) -k -C $$i depend; done %.o : %.c @echo [CC] $@ $Q$(CC_FOR_TARGET) -c -D__KERNEL__ $(CFLAGS) -o $@ $< @echo [DEP] $*.dep $Q$(CC_FOR_TARGET) -MF $*.dep -MT $*.o -MM $(CFLAGS) $< %.o : %.asm @echo [ASM] $@ $Q$(NASM) $(NASMFLAGS) -o $@ $< .PHONY: default all clean emu gdb newlib tools include $(addsuffix /Makefile,$(SUBDIRS))