Setting up

14 Jun 2012

So it's time to start.

I have previously set up a cross compiler environment on my Mac mini, and am now developing on it connected via ssh.

First point today was making a directory structure and creating a git repository. The directory structure starts off as follows

os5/
|-- build/
|-- include/
`-- kernel/
    `-- include/

A difference from previous times is that the include directory is outside the kernel directory. That's because last time I realized I had a lot of include files that were used both in the kernel and many other parts. I'll probably move it into some library directory later. Know what? Let's move it into a library directory right now...

os5/
|-- build/
|-- kernel/
|   `-- include/
`-- library/
    `-- include/

The build/ directory contains some scripts needed for building and testing the os as well as a floppy image preinstalled with the GRUB bootloader.

Next, basic Makefiles were added to os5/ and kernel/. The standard procedure of the main makefile is to run the makefile in kernel/, copy the kernel image into the floppy and then run bochs-term.

BUILDDIR := $(PWD)

PATH := /usr/local/cross/bin:$(PATH)
DIRS := kernel
TARGET := i386-elf

AS := nasm
CC := i386-elf-gcc
LD := i386-elf-ld

ASFLAGS := -f elf
CCFLAGS := -nostdlib -nostdinc -fno-builtin -fno-exceptions -m32
CCFLAGS += -fomit-frame-pointer -fno-asynchronous-unwind-tables
CCFLAGS += -fno-unwind-tables -I$(BUILDDIR)/library/include
LDFLAGS := -T $(BUILDDIR)/library/include/Link.ld

export BUILDDIR AS CC LD ASFLAGS CCFLAGS LDFLAGS

.SILENT:

.PHONY: $(DIRS) floppy emul
.default: all floppy emul

l: all floppy emul

all: $(DIRS)

$(DIRS): force
    @echo "  MAKE    " $@
    @cd $@; $(MAKE) $(MFLAGS)

clean:
    @for DIR in $(DIRS); do echo "  CLEAN   " $$DIR; cd $(BUILDDIR)/$$DIR; make clean; done;

floppy: force
    @echo "  UPDATING IMAGE"
    @build/update_image.sh

emul: force
    @echo "  STARTING EMULATOR"
    @build/emul.sh

force:
    true

The makefile in the kernel/ directory is pretty much straight forward.

TARGET := kernel
SUBDIR := kernel

SOURCES := kinit.o boot.o
SOURCES += $(patsubst %.s,%.o,$(shell find . -name "*.s" | grep -v boot.s))
SOURCES += $(patsubst %.c,%.0,$(shell find . -name "*.c" | grep -v kinit.c))

CCFLAGS += -Iinclude
LDFLAGS := -T $(BUILDDIR)/$(SUBDIR)/include/Link.ld

.SUFFICES: .o .s .c

all: $(TARGET)

$(TARGET): $(SOURCES)
    @echo "   ln     " $(TARGET)
    @$(LD) $(LDFLAGS) -o $(TARGET) $(SOURCES)

.c.o:
    @echo "   gcc    " $<
    @$(CC) $(CFLAGS) -c $< -o $@

.s.o:
    @echo "   nasm   " $<
    @$(AS) $(ASFLAGS) $< -o $@

clean:
    -@rm $(SOURCES) 2>/dev/null
    -@rm $(TARGET) 2>/dev/null

Comments

comments powered by Disqus
© 2012 Thomas Lovén - @thomasloven - GitHub