##################### # # # FoolOS Build Sys. # # # ##################### # main phony targets .PHONY: all new run newrun stick clean ############ some constants ############ #submodules SUBDIRS=boot1 boot2 font userspace FOOLOS=FoolOS.img FOOLOS_VDI=FoolOS.vdi #take care to set this properly! USB_STICK=/dev/sdf #here our kernel will be loaded by the bootloader. KERNEL_START=0x100000 #use our cross compiler CC=i686-elf-gcc ############ compiler flags ############ CFLAGS= CFLAGS+=-ffreestanding CFLAGS+=-nostdlib CFLAGS+=-std=gnu11 CFLAGS+= -I. #CFLAGS+=-lgcc CFLAGS+=-Werror-implicit-function-declaration #CFLAGS+= -O4 #CFLAGS+=-fdata-sections -ffunction-sections #CFLAGS+= -Werror ############ source and object files and their deps ############ #kernel sources (asm and c) SOURCES= SOURCES+=$(wildcard ./kernel/*.c) SOURCES+=$(wildcard ./video/*.c) SOURCES+=$(wildcard ./lib/*/*.c) SOURCES+=$(wildcard ./fs/*.c) #derive kernel object files OBJECTS=$(patsubst %.c, %.o, $(SOURCES)) #derive deps DEPS=$(patsubst %.c, %.d, $(SOURCES)) ####### ASM STUFF ##### ASM_SOURCES=$(wildcard ./asm/*.asm) ASM_OBJECTS=$(patsubst %.asm, %.o, $(ASM_SOURCES)) KERNEL_ENTRY=./asm/kernel_entry.o ############ Final Targets ############ all: FoolOS.vdi FoolOS.img new: clean all ########### INCLUDES ###################3 include Makefile.common -include $(DEPS) #### BINARIES AND SUBMODULES ######## BIN_KERNEL=kernel.bin BIN_MBR=./boot1/mbr.bin BIN_STAGE2=./boot2/stage2.bin BIN_MP=./boot2/mp.bin BIN_FOOLFONT=./font/binfont.bin IMG_FILLUP=fill.img IMG_USERSPACE=./userspace/ext2.img ######### RECURSIVE MAKES ######################## CLEANDIRS=$(SUBDIRS:%=clean-%) .PHONY: $(SUBDIRS) $(CLEANDIRS) $(SUBDIRS): $(MAKE) -C $@ $(CLEANDIRS): $(MAKE) -C $(@:clean-%=%) clean ############ linking kernel binary ############ # the kernel_entry.o needs to be FIRST!! $(BIN_KERNEL): $(KERNEL_ENTRY) $(ASM_OBJECTS) $(OBJECTS) $(CC) $(CFLAGS) -o $@ -Wl,-Ttext,$(KERNEL_START),--oformat,binary $^ ######## generate empty image ~25MB ############### $(IMG_FILLUP): dd if=/dev/zero of=$(IMG_FILLUP) bs=512 count=50000 ############ assembling of final image ############ # master boot record, kernel binary and fool-font $(FOOLOS): $(IMG_FILLUP) $(BIN_KERNEL) $(SUBDIRS) cp $(IMG_FILLUP) $@ dd if=$(BIN_MBR) of=$@ bs=512 seek=0 conv=notrunc dd if=$(BIN_STAGE2) of=$@ bs=512 seek=1 conv=notrunc dd if=kernel.bin of=$@ bs=512 seek=10 conv=notrunc #will end up at 0x100000 in ram (this is what the booloader starts loading secotr: 10) #data starts at 0x168000 dd if=$(BIN_MP) of=$@ bs=512 seek=842 conv=notrunc dd if=$(BIN_FOOLFONT) of=$@ bs=512 seek=843 conv=notrunc dd if=$(IMG_USERSPACE) of=$@ bs=512 seek=846 conv=notrunc #will end up at 0x80800 in ram ############ virtual machines stuff ############ # vdi image for VirtualBox $(FOOLOS_VDI): $(FOOLOS) -rm FoolOS.vdi VBoxManage convertfromraw $< $@ --uuid 2f11ca11-c35d-4240-b77e-79e37d32616c # run in our local bochs (we need cirrus support for our vesa mode) run: all ~/opt/bochs-2.6.6/bochs -q -f bochs/bochsrc -rc bochs/bochsdebug newrun: clean run ############ create bootable usb image ############ stick: $(FOOLOS) cat $< > $(USB_STICK) && sync xxd $(USB_STICK) | head -n 50 ############ cleanup ############ clean: $(CLEANDIRS) -rm *.bin $(FOOLOS) $(FOOLOS_VDI) $(KERNEL_ENTRY) $(ASM_OBJECTS) $(OBJECTS) $(IMG_FILLUP) $(BIN_MBR) $(BIN_MP) $(BIN_STAGE2) $(DEPS) bochs.out bochs.log ne2k-tx.log ne2k-txdump.txt