diff --git a/Makefile b/Makefile index b7c5f31..c134dc9 100644 --- a/Makefile +++ b/Makefile @@ -1,33 +1,67 @@ -OBJECTS = loader.o kmain.o +# loader and kmain must be the only object files placed in the root directory. + +OBJECTS = loader.o kmain.o + +# Flags for linker and compiler. Those options tell the compiler to stay chill +# and let me handle libraries, linking and other stuff. CC = gcc CCFLAGS = -m32 -nostdlib -nostdinc -fno-builtin -fno-stack-protector \ -nostartfiles -nodefaultlibs -Wall -Wextra -Werror -c -LDFLAGS = -T link.ld -melf_i386 +LDFLAGS = -T link.ld -m elf_i386 AS = nasm ASFLAGS = -f elf32 -all: kernel.elf +# Each module directory starts with the character 'm'. MDIRS will search for such +# directories and MOBJECTS will collect the module objects to be linked with the +# root objects (loader and kmain). + +MDIRS = $(wildcard m*) +MOBJECTS = $(wildcard $(MDIRS)/*.o) + +.PHONY: all clean mall + +# all - Default rule that build the entire project. + +all: kernel.elf mall + +# mall - Recursively build all modules. + +mall: + for dir in $(MDIRS); do \ + $(MAKE) -C $$dir; \ + done + +# kernel.elf - Link all root objects and module objects to create the +# kernel.elf executable kernel.elf: $(OBJECTS) - ld $(LDFLAGS) $(OBJECTS) -o kernel.elf + ld $(LDFLAGS) $(OBJECTS) $(MOBJECTS) -o kernel.elf + +# os.iso - Create the OS image and place the kernel fiel in GRUB directory. os.iso: kernel.elf cp kernel.elf iso/boot/kernel.elf - genisoimage -R \ - -b boot/grub/stage2_eltorito \ - -no-emul-boot \ - -boot-load-size 4 \ - -A os \ - -input-charset utf8 \ - -quiet \ - -boot-info-table \ - -o os.iso \ - iso + genisoimage -R \ + -b boot/grub/stage2_eltorito \ + -no-emul-boot \ + -boot-load-size 4 \ + -A os \ + -input-charset utf8 \ + -quiet \ + -boot-info-table \ + -o os.iso \ + iso + +# run - Run the emulator using the config file. + +BOCHS_CONFIG := bochsrc.txt run: os.iso - bochs -f bochsrc.txt -q + bochs -f $(BOCHS_CONFIG) -q + +# Compile and assemble c and s files. %.o: %.c $(CC) $(CCFLAGS) $< -o $@ @@ -35,5 +69,13 @@ run: os.iso %.o: %.s $(AS) $(ASFLAGS) $< -o $@ -clean: - rm -rf *.o kernel.elf os.iso bochslog.txt iso/boot/kernel.elf +# clean, mclean - Clean unuseful files from root directory and from module +# directories + +clean: mclean + @$(RM) *.o kernel.elf os.iso bochslog.txt iso/boot/kernel.elf + +mclean: + for dir in $(MDIRS); do \ + $(MAKE) -C $$dir distclean; \ + done diff --git a/mterminal/Makefile b/mterminal/Makefile new file mode 100644 index 0000000..d6e552d --- /dev/null +++ b/mterminal/Makefile @@ -0,0 +1,58 @@ +# SRC_DIR - Directory containing source +# OBJ_DIR - Directory where temporary objects will be created +# INC_DIR - Directory where header files are declared + +SRC_DIR := src +OBJ_DIR := obj +INC_DIR := include + +# MOBJECT - Module Object + +MOBJECT := terminal.o + +SOURCES := $(wildcard $(SRC_DIR)/*.c) +OBJECTS := $(SOURCES:$(SRC_DIR)/%.c=$(OBJ_DIR)/%.o) + +# CCFLAGS, LDFLAGS, INCFLAGS - Flags for linker and compiler. +# HFLAGS - MMD generates makefile dependencies so that whenever a header file +# is modified the project will be rebuilt if needed. + +CC = gcc +CCFLAGS = -m32 -nostdlib -lgcc -nostdinc -fno-builtin -fno-stack-protector \ + -nostartfiles -nodefaultlibs -Wall -Wextra -Werror -c +HFLAGS = -MMD +LDFLAGS = -relocatable -m elf_i386 +INCFLAGS = -I$(INC_DIR) + +.PHONY: all clean + +# all - Default rule for building the module object. + +all: $(MOBJECT) + +# MOBJECT - Links all object into one global module object. + +$(MOBJECT): $(OBJECTS) + ld $(LDFLAGS) $^ -o $@ + +# Rule that converts source files into object files. + +$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c | $(OBJ_DIR) + $(CC) $(CCFLAGS) $(HFLAGS) $(INCFLAGS) $< -o $@ + +# OBJ_DIR - Creates a temporary folder containing object files. + +$(OBJ_DIR): + mkdir -p $@ + +# clean, mclean - deletes object files and the module object if necessary + +clean: + @$(RM) -rv $(OBJ_DIR) + +distclean: clean + @$(RM) $(MOBJECT) + +# Create d files used for makefile dependencies using o files. + +-include $(OBJECTS:.o=.d)