#
# Copyright (c) 2001 University of Utah and the Flux Group.
# All rights reserved.
# 
# This file is part of the Flux OSKit.  The OSKit is free software, also known
# as "open source;" you can redistribute it and/or modify it under the terms
# of the GNU General Public License (GPL), version 2, as published by the Free
# Software Foundation (FSF).  To explore alternate licensing terms, contact
# the University of Utah at csl-dist@cs.utah.edu or +1-801-585-3271.
# 
# The OSKit is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE.  See the GPL for more details.  You should have
# received a copy of the GPL along with the OSKit; see the file COPYING.  If
# not, write to the FSF, 59 Temple Place #330, Boston, MA 02111-1307, USA.
#

ifndef _oskit_examples_x86_sproc_makerules_
_oskit_examples_x86_sproc_makerules__ = yes

USER_PROGS = usermain_testsproc usermain_hello usermain_malloc
BMODS = kernel swapfile $(USER_PROGS)
TARGETS = Image

all: $(TARGETS)

SRCDIRS +=	$(OSKIT_SRCDIR)/examples/x86/sproc

INCDIRS +=	$(OSKIT_SRCDIR)/oskit/c

CLEAN_FILES +=	$(TARGETS) $(BMODS) *.gdb
OSKIT_CFLAGS += -DOSKIT

#
# The C library is made up of several pieces. The core library, the
# POSIX interface that converts syscalls to COM, and the actual COM 
# interfaces. Note that the C library is built with the COM library.
#
CLIB   = -loskit_c
#CLIB_P = -loskit_c_p -loskit_gprof -loskit_c_p -loskit_kern_p

include $(OSKIT_SRCDIR)/GNUmakerules

DEPENDLIBS = $(filter %.a, $(foreach DIR,$(LIBDIRS),$(wildcard $(DIR)/*)))

THRDLIBS   = -loskit_threads -loskit_netbsd_uvm 
THRDLIBS_P   = -loskit_threads_p -loskit_netbsd_uvm_p
CLIB   = -loskit_freebsd_c_r -loskit_com -loskit_threads
CLIB_P = -loskit_freebsd_c_r_p -loskit_com_p -loskit_threads_p -loskit_gprof \
	-loskit_freebsd_c_r_p -loskit_kern_p

kernel: $(OBJDIR)/lib/multiboot.o kernel.o kern_syscall.o $(DEPENDLIBS)
	$(OSKIT_QUIET_MAKE_INFORM) "Linking example $@"
	$(LD) -Ttext 100000 $(LDFLAGS) $(OSKIT_LDFLAGS) \
		-o $@ $(filter-out %.a,$^)		\
		-loskit_startup -loskit_fsnamespace \
		-loskit_memfs -loskit_sproc \
		-loskit_netbsd_uvm -loskit_exec -loskit_memfs \
		$(THRDLIBS) -loskit_clientos \
		-loskit_dev -loskit_kern -loskit_lmm \
		$(CLIB) $(OBJDIR)/lib/crtn.o

kernel_p.gdb: $(OBJDIR)/lib/multiboot.o kernel.po kern_syscall.po $(DEPENDLIBS)
	$(OSKIT_QUIET_MAKE_INFORM) "Linking example $@"
	$(LD) -Ttext 100000 $(LDFLAGS) $(OSKIT_LDFLAGS) \
		-o $@ $(filter-out %.a,$^)		\
		-loskit_startup_p -loskit_fsnamespace_p \
		-loskit_memfs_p -loskit_sproc_p \
		-loskit_netbsd_uvm_p -loskit_exec_p -loskit_memfs_p \
		$(THRDLIBS_P) -loskit_clientos_p \
		-loskit_realtime_p -loskit_kern_p -loskit_lmm_p \
		$(CLIB_P) \
		$(OBJDIR)/lib/crtn.o

kernel_p: kernel_p.gdb
	cp kernel_p.gdb kernel_p
	strip kernel_p

#
# Build user mode programs
# 
USER_CRT  = user_crt.o
USER_OBJS = user_syscall.o user_mem.o user_morecore.o

usermain_testsproc: $(USER_CRT) usermain_testsproc.o $(USER_OBJS)
	$(CC) -nostdlib -static $(USER_CRT) usermain_testsproc.o $(USER_OBJS) \
		-o $@ -Xlinker -Ttext -Xlinker 40000000 \
		-L../../../lib -loskit_c -loskit_lmm

usermain_hello: $(USER_CRT) usermain_hello.o $(USER_OBJS)
	$(CC) -nostdlib -static $(USER_CRT) usermain_hello.o $(USER_OBJS) \
		-o $@ -Xlinker -Ttext -Xlinker 40000000 \
		-L../../../lib -loskit_c -loskit_lmm

usermain_malloc: $(USER_CRT) usermain_malloc.o $(USER_OBJS)
	$(CC) -nostdlib -static $(USER_CRT) usermain_malloc.o $(USER_OBJS) \
		-o $@ -Xlinker -Ttext -Xlinker 40000000 \
		-L../../../lib -loskit_c -loskit_lmm

#
# Small swapfile (1MB)
#
swapfile:
	dd if=/dev/zero of=$@ count=2048

#
# Bind all together!
#
Image: $(BMODS)
	echo "use 'mkmb2 $(BMODS)' to build the bmod"

Image_p: kernel_p kernel_p.gdb swapfile $(USER_PROGS)
	echo "use 'mkmb2 -o $@ kernel_p kernel_p.gdb:a.out swapfile $(USER_PROGS)' to build a bmod"

endif
