ALL = main

BASEDIR = ../../..
OSKITDIR = $(BASEDIR)/oskit
L4DIR = $(BASEDIR)/l4

CPPFLAGS = -I../include -I$(OSKITDIR) \
  -I$(OSKITDIR)/flux/c -I$(L4DIR)/lib/libl4sys/include

include $(L4DIR)/Makeconf

VPATH += lib

# only pass the -fno-exceptions argument to gcc if it understands it
CXX := g++ -m486 -fno-rtti \
  $(shell g++ -xc++ -fno-exceptions -c /dev/null -o /dev/null >/dev/null 2>&1 \
    && echo -fno-exceptions)

# kernel sources/objects
CXXSRC_KERNEL = startup.cc globals.cc main.cc kmem_init.cc kmem.cc kdb.cc \
  config_init.cc config.cc space.cc thread.cc syscall.cc ipc.cc \
  ipc_map.cc irq_init.cc irq.cc time.cc c++_support.cc oskit_s_c++.cc \
  mapping.cc
OBJ_KERNEL = $(CXXSRC_KERNEL:.cc=.o) entry.o

# boot sources
CSRC_BOOT = oskit_support.c
CXXSRC_BOOT = bootstrap.cc

# Kernel library: stuff which is linked in optionally.  This includes
# everything in the lib subdirectory, but may also include optional 
# kernel subsystems which may be optimized away
LIBK = libk.a
CXXSRC_LIBK = profile.cc gmon.cc uuencode.cc
OBJ_LIBK = $(CXXSRC_LIBK:.cc=.o)

CRT0 = crt0.o
CRTN = $(OSKITDIR)/lib/crtn.o

LIBGCC = $(shell $(CXX) --print-libgcc-file-name)

SHARED_FLAGS += -nostdinc -Wall -O -fno-defer-pop -g
ifdef PROFILE
SHARED_FLAGS += -DPROFILE
PROF_FLAGS = -pg
else
PROF_FLAGS =
endif
CFLAGS += $(SHARED_FLAGS) $(EXTRA_FLAGS)
CXXFLAGS += $(SHARED_FLAGS) $(EXTRA_FLAGS)

LIBS = -L $(OSKITDIR)/lib -lkern -lmc -llmm $(LIBGCC)

SIZE = $(TARGET)size

###

all: $(ALL)

$(ALL): boot.o bootstrap.o kernel.o oskit_support.o
	$(LD) -Ttext 0x300000 -o $@ $^ $(LIBS)

kernel.image: kernel.ld $(CRT0) $(OBJ_KERNEL) $(CRTN) $(LIBK)
	$(LD) -N -T kernel.ld -o $@ \
	  $(CRT0) $(OBJ_KERNEL) $(LIBK) $(LIBS) $(CRTN)

kernel.o: kernel.image kernel-r.ld
	cp $< $<.s
	strip $<.s
	$(LD) -r -T kernel-r.ld -o $@ \
	  -defsym crt0_start=0x`nm $< | grep crt0_start | cut -f1 -d' '` \
	  $<.s

$(LIBK): $(OBJ_LIBK)
	$(AR) rv $@ $^
	$(RANLIB) $@

# special: build kernel sources with profiling flags if applicable
$(CXXSRC_KERNEL:.cc=.o) : %.o: %.cc
	$(CXX) $(CXXFLAGS) $(PROF_FLAGS) $(CPPFLAGS) -c $< -o $@

###

clean:
	rm -f *.o kernel.o kernel.image kernel.image.s $(LIBK) $(ALL)

realclean: clean
	rm -f *.d *~

include $(foreach subsys,KERNEL BOOT LIBK,$(CXXSRC_$(subsys):.cc=.d) $(CSRC_$(subsys):.c=.d))
