##################### # # # FoolOS Build Sys. # # # ##################### # main phony targets .PHONY: all new run newrun stick clean ############ some constants ############ FOOLOS=FoolOS.img FOOLOS_VDI=FoolOS.vdi #submodules SUBDIRS=boot1 boot2 font userspace #take care to set this properly! USB_STICK=/dev/sdf #use our cross compiler CC=i686-elf-gcc ############ compiler flags ############ CFLAGS= ## CFLAGS+=-fstack-protector-all ## CFLAGS+=-Werror-implicit-function-declaration ## CFLAGS+=-w CFLAGS+=-ffreestanding CFLATS+=-Wall CFLAGS+=-Wextra #CFLAGS+=-O3 #CFLAGS+=-O0 #CFLAGS+=-nostdlib CFLAGS+=-std=gnu11 CFLAGS+=-I. CFLAGS+=-I/home/miguel/temp/fool-os-stuff/newlib-2.1.0/newlib/libc/include CFLAGS+=-gstabs #CFLAGS+=-lgcc #CFLAGS+=-fno-zero-initialized-in-bss #CFLAGS+= -O4 #CFLAGS+=-fdata-sections -ffunction-sections #CFLAGS+= -Werror LDFLAGS= LDFLAGS+=-nostdlib LDFLAGS+=-lgcc #verbosity #V = 0 #CC = @echo "Compiling $<..."; i686-foolos-gcc #CC_1 = $(CCC) #CC = $(CC_$(V)) ############ 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)) ASM_MULTIBOOT=$(wildcard ./asm/*.s) ASM_MULTIBOOT_OBJ=$(patsubst %.s, %.o, $(ASM_MULTIBOOT)) ############ Final Targets ############ all: $(FOOLOS) #$(FOOLOS_VDI) new: clean all run: run-qemu newrun: clean run ########### INCLUDES ################### include Makefile.common -include $(DEPS) #### BINARIES AND SUBMODULES ######## KERNEL_IMG=foolos.img 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 ############ $(KERNEL_IMG): $(ASM_MULTIBOOT_OBJ) $(ASM_OBJECTS) $(OBJECTS) $(CC) $(CFLAGS) $(LDFLAGS) -T linker.ld -o $@ $^ ############ assembling of final image ############ # master boot record, kernel binary and fool-font $(FOOLOS): $(KERNEL_IMG) # $(SUBDIRS) sudo cp $(KERNEL_IMG) /mnt/vdi/boot sync # dd if=$(BIN_MBR) of=$@ bs=512 seek=0 conv=notrunc # dd if=$(BIN_STAGE2) of=$@ bs=512 seek=1 conv=notrunc # # kernel will start at 0x100000 in ram (this is what the booloader starts loading secotr: 10) # dd if=$(BIN_KERNEL) of=$@ bs=512 seek=10 conv=notrunc # kernel can be about 128KB (incl bss) # # the data will starts at 0x120000 in ram # dd if=$(IMG_USERSPACE) of=$@ bs=512 seek=266 conv=notrunc ############ 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-bochs: all ~/opt/bochs-2.6.6/bochs -q -f bochs/bochsrc -rc bochs/bochsdebug # run in qemu run-qemu: all qemu-system-i386 $(FOOLOS) run-qemu-debug: all qemu-system-i386 -s -S ~/temp/FoolOs/disk.img ############ 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_MULTIBOOT_OBJ) $(KERNEL_IMG) $(ASM_OBJECTS) $(OBJECTS) $(IMG_FILLUP) $(BIN_MBR) $(BIN_MP) $(BIN_STAGE2) $(DEPS) bochs.out bochs.log ne2k-tx.log ne2k-txdump.txt