##################### # # # FoolOS Build Sys. # # # ##################### ############ some constants ############ #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) ######### RECURSIVE MAKES ######################## # master boot record MBR=./boot1/mbr.bin $(MBR): make -C boot1 mbr.bin # stage 2 bootloader STAGE2=./boot2/stage2.bin $(STAGE2): make -C boot2 stage2.bin # multiprocessor binary entry MP_BIN=./boot2/mp.bin $(MP_BIN): make -C boot2 mp.bin # fonts FOOLFONT=./font/binfont.bin $(FOOLFONT): make -C font binfont.bin # userspace USERSPACE=./userspace/ext2.img $(USERSPACE): make -C userspace ext2.img ############ linking kernel binary ############ # the kernel_entry.o needs to be FIRST!! kernel.bin: $(KERNEL_ENTRY) $(ASM_OBJECTS) $(OBJECTS) $(CC) $(CFLAGS) -o $@ -Wl,-Ttext,$(KERNEL_START),--oformat,binary $^ ######## generate empty image ~25MB ############### FILLUP=fill.img $(FILLUP): dd if=/dev/zero of=$(FILLUP) bs=512 count=50000 ############ assembling of final image ############ # master boot record, kernel binary and fool-font FoolOS.img: $(MBR) $(STAGE2) kernel.bin $(FILLUP) $(FOOLFONT) $(MP_BIN) $(USERSPACE) cp $(FILLUP) $@ dd if=$(MBR) of=$@ bs=512 seek=0 conv=notrunc dd if=$(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=$(MP_BIN) of=$@ bs=512 seek=842 conv=notrunc dd if=$(FOOLFONT) of=$@ bs=512 seek=843 conv=notrunc dd if=$(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.img -rm FoolOS.vdi VBoxManage convertfromraw FoolOS.img FoolOS.vdi --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.img cat FoolOS.img > $(USB_STICK) && sync xxd $(USB_STICK) | head -n 50 ############ cleanup ############ clean: -rm *.bin FoolData.img bochs.log $(KERNEL_ENTRY) $(ASMOBJECTS) $(OBJECTS) $(FILLUP) $(MBR) $(MP_BIN) bochs.out ne2k-tx.log ne2k-txdump.txt $(STAGE2) $(DEPS) $(ASM_OBJECTS) -rm FoolOS.img FoolOS.vdi make -C boot1 clean make -C boot2 clean make -C userspace clean make -C font clean