SubDir OBOS_TOP src kernel ;

KernelLd boot_loader :
	boot_platform_$(OBOS_BOOT_PLATFORM).o
	boot_partitions.a
	boot_loader.a

	# file systems
	boot_bfs.a

	# libroot functions needed by the stage2 boot loader
	<$(SOURCE_GRIST)!libroot!os!arch!$(OBOS_ARCH)>byteorder.o
	<$(SOURCE_GRIST)!libroot!posix!locale>ctype.o
	<$(SOURCE_GRIST)!libroot!posix!stdio>kvsprintf.o
	<$(SOURCE_GRIST)!libroot!posix!string>memset.o
	<$(SOURCE_GRIST)!libroot!posix!string>memcpy.o
	<$(SOURCE_GRIST)!libroot!posix!string>memmove.o
	<$(SOURCE_GRIST)!libroot!posix!string>strdup.o
	<$(SOURCE_GRIST)!libroot!posix!string>strlen.o
	<$(SOURCE_GRIST)!libroot!posix!string>strnlen.o
	<$(SOURCE_GRIST)!libroot!posix!string>strcmp.o
	<$(SOURCE_GRIST)!libroot!posix!string>strncmp.o
	<$(SOURCE_GRIST)!libroot!posix!string>strcpy.o
	<$(SOURCE_GRIST)!libroot!posix!stdlib>qsort.o
	:
	$(SUBDIR)/ldscripts/$(OBOS_ARCH)/stage2.ld 
	:
	-Bstatic
	:
	;

KernelLd stage2 :
	boot_arch_stage2.o

	# posix functions needed by the stage2 boot loader
	<$(SOURCE_GRIST)!libroot!posix!locale>ctype.o
	<$(SOURCE_GRIST)!libroot!posix!stdio>kvsprintf.o
	<$(SOURCE_GRIST)!libroot!posix!string>memset.o
	<$(SOURCE_GRIST)!libroot!posix!string>memcpy.o
	<$(SOURCE_GRIST)!libroot!posix!string>strnlen.o
	:
	$(SUBDIR)/ldscripts/$(OBOS_ARCH)/stage2.ld 
	:
	-dN
	:
	:
	bootstrap
	;

KernelLd kernel :
	kernel_core.o
	kernel_fs.o

	libbus.a
	libvm.a
	lib$(OBOS_ARCH).a
	libdrivers.a
	libkernel_util.a

	linkhack.so

	kernel_os_arch_$(OBOS_ARCH).o

	kernel_posix_locale.o
	kernel_posix_main.o
	kernel_posix_stdio.o
	kernel_posix_stdlib.o
	kernel_posix_sys.o
	kernel_posix_time.o
	kernel_posix_unistd.o
	posix_string.o
	:
	$(SUBDIR)/ldscripts/$(OBOS_ARCH)/kernel.ld 
	:
	-Bdynamic -export-dynamic -dynamic-linker /foo/bar
	:
	:
	kernel
	;

KernelLd kernel.so :
	# ToDo: remove kernel.so completely and make the drivers/modules
	#	linkable against the kernel itself
	kernel_core.o
	kernel_fs.o

	libbus.a
	libvm.a
	lib$(OBOS_ARCH).a
	libdrivers.a
	libkernel_util.a

	linkhack.so

	kernel_os_main.o
	kernel_os_arch_$(OBOS_ARCH).o

	kernel_posix_locale.o
	kernel_posix_main.o
	kernel_posix_stdio.o
	kernel_posix_stdlib.o
	kernel_posix_sys.o
	kernel_posix_time.o
	kernel_posix_unistd.o
	posix_string.o
	:
	$(SUBDIR)/ldscripts/$(OBOS_ARCH)/kernel.ld 
	:
	-Bdynamic -shared -export-dynamic -dynamic-linker /foo/bar
	;

KernelLd libglue.o :	# libglue.o is used for dynamic libraries
	<$(SOURCE_GRIST)!glue>crt0.o
	<$(SOURCE_GRIST)!glue>init_term_dyn.o
	:
	:
	-r
	:
	no_gcc
	;

KernelLd libroot.so :
	libglue.o

	<$(SOURCE_GRIST)!libroot>libroot_init.o

	os_main.o
	os_arch_$(OBOS_ARCH).o

	posix_locale.o
	posix_main.o
	posix_malloc.o
	posix_math.o
	posix_math_arch_$(OBOS_ARCH).o
	posix_signal.o
	posix_stdio.o
#	posix_gnu_libio.o
	posix_stdlib.o
	posix_string.o
	posix_sys.o
	posix_termios.o
	posix_time.o
	posix_unistd.o
	:
	$(SUBDIR)/ldscripts/$(OBOS_ARCH)/library.ld
	:
	-shared -soname libroot.so -Bdynamic -export-dynamic
	:
	# no_gcc
	# for now link against libgcc.a to allow more BeOS executables to be run.
	# Needs a definitive decision - most probably we will have to link it statically
	# against libroot.so, too, like BeOS does it
	:
	lib/libroot.so
	;

KernelLd libglue2.o :	# libglue2.o is used for executables
	<$(SOURCE_GRIST)!glue>crt0.o
	<$(SOURCE_GRIST)!glue>init_term_dyn.o
	<$(SOURCE_GRIST)!glue>start_dyn.o
	:
	:
	-r
	:
	no_gcc
	;

KernelLd init :
	libglue2.o
	<$(SOURCE_GRIST)!apps>init.o
	libroot.so
	:
	$(SUBDIR)/ldscripts/$(OBOS_ARCH)/app.ld
	:
	:
	:
	bin/init
	;

KernelStaticLibraryObjects librld.a :
	# needed for rld.so only
	<$(SOURCE_GRIST)!libroot!os>syscalls.o
	<$(SOURCE_GRIST)!libroot!os>sem.o
	<$(SOURCE_GRIST)!libroot!os!arch!$(OBOS_ARCH)>atomic.o

	<$(SOURCE_GRIST)!libroot!posix>errno.o

 	<$(SOURCE_GRIST)!libroot!posix!locale>ctype.o
  	<$(SOURCE_GRIST)!libroot!posix!stdio>kvsprintf.o
  	<$(SOURCE_GRIST)!libroot!posix!unistd>open.o

	<$(SOURCE_GRIST)!libroot!posix!string>memchr.o
	<$(SOURCE_GRIST)!libroot!posix!string>memcmp.o
	<$(SOURCE_GRIST)!libroot!posix!string>memcpy.o
	<$(SOURCE_GRIST)!libroot!posix!string>memmove.o
	<$(SOURCE_GRIST)!libroot!posix!string>memset.o
	<$(SOURCE_GRIST)!libroot!posix!string>strcasecmp.o
	<$(SOURCE_GRIST)!libroot!posix!string>strcasestr.o
	<$(SOURCE_GRIST)!libroot!posix!string>strcat.o
	<$(SOURCE_GRIST)!libroot!posix!string>strchr.o
	<$(SOURCE_GRIST)!libroot!posix!string>strcmp.o
	<$(SOURCE_GRIST)!libroot!posix!string>strcpy.o
	<$(SOURCE_GRIST)!libroot!posix!string>strcspn.o
	<$(SOURCE_GRIST)!libroot!posix!string>strdup.o
	<$(SOURCE_GRIST)!libroot!posix!string>strerror.o
	<$(SOURCE_GRIST)!libroot!posix!string>strlcat.o
	<$(SOURCE_GRIST)!libroot!posix!string>strlcpy.o
	<$(SOURCE_GRIST)!libroot!posix!string>strlen.o
	<$(SOURCE_GRIST)!libroot!posix!string>strncat.o
	<$(SOURCE_GRIST)!libroot!posix!string>strncmp.o
	<$(SOURCE_GRIST)!libroot!posix!string>strncpy.o
	<$(SOURCE_GRIST)!libroot!posix!string>strnicmp.o
	<$(SOURCE_GRIST)!libroot!posix!string>strnlen.o
	<$(SOURCE_GRIST)!libroot!posix!string>strpbrk.o
	<$(SOURCE_GRIST)!libroot!posix!string>strrchr.o
	<$(SOURCE_GRIST)!libroot!posix!string>strspn.o
	<$(SOURCE_GRIST)!libroot!posix!string>strstr.o
	<$(SOURCE_GRIST)!libroot!posix!string>strtok.o
	;

KernelLd rld.so :
	<$(SOURCE_GRIST)!apps!rld>rld0.o
	<$(SOURCE_GRIST)!apps!rld>rld.o
	<$(SOURCE_GRIST)!apps!rld>rldelf.o
	<$(SOURCE_GRIST)!apps!rld>rldexport.o
	<$(SOURCE_GRIST)!apps!rld>rldheap.o
	<$(SOURCE_GRIST)!apps!rld>rldaux.o
	librld.a
	:
	$(SUBDIR)/apps/rld/arch/$(OBOS_ARCH)/rld.ld
	:
	:
	:
	libexec/rld.so
	;

KernelLd false :
	libglue2.o
	<$(SOURCE_GRIST)!apps>false_main.o
	libroot.so
	:
	$(SUBDIR)/ldscripts/$(OBOS_ARCH)/app.ld
	:
	:
	:
	bin/false
	;

KernelLd true :
	libglue2.o
	<$(SOURCE_GRIST)!apps>true_main.o
	libroot.so
	:
	$(SUBDIR)/ldscripts/$(OBOS_ARCH)/app.ld
	:
	:
	:
	bin/true
	;

KernelLd fibo :
	libglue2.o
	<$(SOURCE_GRIST)!apps>fibo_main.o
	libroot.so
	:
	$(SUBDIR)/ldscripts/$(OBOS_ARCH)/app.ld
	:
	:
	:
	bin/fibo
	;

KernelLd sig_test :
	libglue2.o
	<$(SOURCE_GRIST)!apps>sig_test.o
	libroot.so
	:
	$(SUBDIR)/ldscripts/$(OBOS_ARCH)/app.ld
	:
	:
	:
	bin/sig_test
	;

KernelLd monitor_test :
	libglue2.o
	<$(SOURCE_GRIST)!apps>monitor_test.o
	libroot.so
	:
	$(SUBDIR)/ldscripts/$(OBOS_ARCH)/app.ld
	:
	:
	:
	bin/monitor_test
	;

KernelLd fortune :
	libglue2.o
	<$(SOURCE_GRIST)!apps!fortune>main.o
	libroot.so
	:
	$(SUBDIR)/ldscripts/$(OBOS_ARCH)/app.ld
	:
	:
	:
	bin/fortune
	;

KernelConfigSection etc/fortunes : data : $(SUBDIR)/apps/fortune/fortunes ;

KernelLd ls :
	libglue2.o
	<$(SOURCE_GRIST)!apps!ls>main.o
	libroot.so
	:
	$(SUBDIR)/ldscripts/$(OBOS_ARCH)/app.ld
	:
	:
	:
	bin/ls
	;

KernelLd symlink :
	libglue2.o
	<$(SOURCE_GRIST)!apps!symlink>main.o
	libroot.so
	:
	$(SUBDIR)/ldscripts/$(OBOS_ARCH)/app.ld
	:
	:
	:
	bin/symlink
	;

# Note: shell is a built in target, thus we need the grist.
KernelLd obos_shell :
	libglue2.o
	<$(SOURCE_GRIST)!apps!shell>main.o
	<$(SOURCE_GRIST)!apps!shell>args.o
	<$(SOURCE_GRIST)!apps!shell>commands.o
	<$(SOURCE_GRIST)!apps!shell>file_utils.o
	<$(SOURCE_GRIST)!apps!shell>parse.o
	<$(SOURCE_GRIST)!apps!shell>script.o
	<$(SOURCE_GRIST)!apps!shell>shell_vars.o
	<$(SOURCE_GRIST)!apps!shell>statements.o
	<$(SOURCE_GRIST)!apps!shell>shell_history.o
	libroot.so
	:
	$(SUBDIR)/ldscripts/$(OBOS_ARCH)/app.ld
	:
	:
	:
	bin/shell
	;

KernelLd testapp :
	libglue2.o
	<$(SOURCE_GRIST)!apps!testapp>main.o
	libroot.so
	:
	$(SUBDIR)/ldscripts/$(OBOS_ARCH)/app.ld
	:
	:
	:
	bin/testapp
	;

KernelLd tls_test :
	libglue2.o
	<$(SOURCE_GRIST)!apps>tls_test.o
	libroot.so
	:
	$(SUBDIR)/ldscripts/$(OBOS_ARCH)/app.ld
	:
	:
	:
	bin/tls_test
	;

KernelLd pipe_test :
	libglue2.o
	<$(SOURCE_GRIST)!apps>pipe_test.o
	libroot.so
	:
	$(SUBDIR)/ldscripts/$(OBOS_ARCH)/app.ld
	:
	:
	:
	bin/pipe_test
	;

KernelLd envtest :
	libglue2.o
	<$(SOURCE_GRIST)!apps!envtest>main.o
	libroot.so
	:
	$(SUBDIR)/ldscripts/$(OBOS_ARCH)/app.ld
	:
	:
	:
	bin/envtest
	;

#if $(OS) = "BEOS" 
#{
#	KernelConfigSection addons/drivers/dev/misc/pcspeaker 
#		: 
#		elf32 
#		:
#		/boot/home/config/add-ons/kernel/drivers/bin/pcspeaker 
#		;

#	KernelConfigSection addons/drivers/dev/net/tulip 
#		: 
#		elf32 
#		: 
#		/boot/beos/system/add-ons/kernel/drivers/bin/tulip 
#		;
#}

KernelLd ps :
	libglue2.o
	<$(SOURCE_GRIST)!apps!ps>main.o
	libroot.so
	:
	$(SUBDIR)/ldscripts/$(OBOS_ARCH)/app.ld
	:
	:
	:
	bin/ps
	; 

KernelLd echo :
	libglue2.o
	<$(SOURCE_GRIST)!apps!echo>main.o
	libroot.so
	:
	$(SUBDIR)/ldscripts/$(OBOS_ARCH)/app.ld
	:
	:
	:
	bin/echo
	; 

KernelLd uname :
	libglue2.o
	<$(SOURCE_GRIST)!apps!uname>main.o
	libroot.so
	:
	$(SUBDIR)/ldscripts/$(OBOS_ARCH)/app.ld
	:
	:
	:
	bin/uname
	;

WriteKernelConfig $(OBOS_KERNEL_CONFIG) ;

BuildKernel $(OBOS_KERNEL) : $(OBOS_KERNEL_CONFIG) ;

KernelFloppyImage $(OBOS_FLOPPY) : $(OBOS_KERNEL) : $(SUBDIR)/boot/arch/$(OBOS_ARCH)/bootblock.bin ;

Depends floppy : $(OBOS_FLOPPY) ;
NotFile floppy ;

SubInclude OBOS_TOP src kernel apps ;
SubInclude OBOS_TOP src kernel boot ;
SubInclude OBOS_TOP src kernel core ;
SubInclude OBOS_TOP src kernel drivers ;
SubInclude OBOS_TOP src kernel glue ;
SubInclude OBOS_TOP src kernel libroot ;
