SubDir OBOS_TOP src kernel ;

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

	# file systems
	boot_bfs.a
	boot_amiga_ffs.a

	# libroot functions needed by the stage2 boot loader
	<$(SOURCE_GRIST)!libroot!os!arch!$(OBOS_ARCH)>byteorder.o
	<$(SOURCE_GRIST)!libroot>ctype.o
	<$(SOURCE_GRIST)!libroot>kernel_vsprintf.o
	<$(SOURCE_GRIST)!libroot!posix!string>memset.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>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>strcasecmp.o
	<$(SOURCE_GRIST)!libroot!posix!string>strncmp.o
	<$(SOURCE_GRIST)!libroot!posix!string>strcat.o
	<$(SOURCE_GRIST)!libroot!posix!string>strcpy.o
	<$(SOURCE_GRIST)!libroot!posix!string>strlcat.o
	<$(SOURCE_GRIST)!libroot!posix!string>strlcpy.o
	<$(SOURCE_GRIST)!libroot!posix!string>strchr.o
	<$(SOURCE_GRIST)!libroot!posix!string>strrchr.o
	<$(SOURCE_GRIST)!libroot!posix!stdlib>strtol.o
	<$(SOURCE_GRIST)!libroot>qsort.o
	: $(SUBDIR)/ldscripts/$(OBOS_ARCH)/boot_loader.ld 
	: -Bstatic
	;

KernelLd stage2 :
	boot_arch_stage2.o

	# posix functions needed by the stage2 boot loader
	<$(SOURCE_GRIST)!libroot>ctype.o
	<$(SOURCE_GRIST)!libroot>kernel_vsprintf.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
	kernel_vm.o
	kernel_cache.o
	kernel_device_manager.o
	kernel_disk_device_manager.o
	kernel_util.o
	kernel_messaging.o
	kernel_debug.o

	lib$(OBOS_ARCH).a

	linkhack.so

	# kernel libroot parts
	kernel_os_main.o
	kernel_os_arch_$(OBOS_ARCH).o
	kernel_posix.o

	: $(SUBDIR)/ldscripts/$(OBOS_ARCH)/kernel.ld 
	: -Bdynamic -export-dynamic -dynamic-linker /foo/bar
	:
	: kernel
	;
LINKLIBS on kernel += $(KERNEL_C++_SUPPORT_LIBS) ;

KernelLd kernel.so :
	kernel_core.o
	kernel_fs.o
	kernel_vm.o
	kernel_cache.o
	kernel_device_manager.o
	kernel_disk_device_manager.o
	kernel_util.o
	kernel_messaging.o
	kernel_debug.o

	lib$(OBOS_ARCH).a

	linkhack.so

	# kernel libroot parts
	kernel_os_main.o
	kernel_os_arch_$(OBOS_ARCH).o
	kernel_posix.o

	: $(SUBDIR)/ldscripts/$(OBOS_ARCH)/kernel.ld 
	: -Bdynamic -shared -export-dynamic -dynamic-linker /foo/bar
	;
LINKLIBS on kernel.so += $(KERNEL_C++_SUPPORT_LIBS) ;

# ToDo: this is outdated; instead, the standard Be mechanism should be used
KernelLd libglue.o :	# libglue.o is used for dynamic libraries
	<$(SOURCE_GRIST)!glue!arch!$(OBOS_ARCH)>crti.o
	$(LIBGCC_DIR)/crtbegin.o

	$(LIBGCC_DIR)/crtend.o
	<$(SOURCE_GRIST)!glue!arch!$(OBOS_ARCH)>crtn.o

	<$(SOURCE_GRIST)!glue>init_term_dyn.o
	:
	: -r
	: no_gcc
	;

UnarchiveObjects $(LIBGCC_OBJECTS) : $(LIBGCC_DIR)/libgcc.a ;
	# we need to link against libgcc.a objects and make
	# it available to other applications as in BeOS

# ToDo: Rewrite as SharedLibrary
KernelLd libroot.so :
	<$(SOURCE_GRIST)!glue!arch!$(OBOS_ARCH)>crti.o
	$(LIBGCC_DIR)/crtbegin.o

	<$(SOURCE_GRIST)!glue>init_term_dyn.o

	$(LIBGCC_OBJECTS)
	<$(SOURCE_GRIST)!libroot>libroot_init.o

	os_main.o
	os_arch_$(OBOS_ARCH).o

	posix_arch_$(OBOS_ARCH).o
	posix_locale.o
	posix_main.o
	posix_malloc.o
	posix_math.o
	posix_math_arch_$(OBOS_ARCH).o
	posix_pthread.o
	posix_signal.o
	posix_stdio.o
	posix_gnu_arch_$(OBOS_ARCH).o
	posix_gnu_ctype.o
	posix_gnu_ext.o
	posix_gnu_libio.o
	posix_gnu_locale.o
	posix_gnu_regex.o
	posix_gnu_stdio.o
	posix_gnu_stdlib.o
	posix_gnu_wcsmbs.o
	posix_stdlib.o
	posix_string.o
	posix_sys.o
	posix_time.o
	posix_unistd.o

	$(LIBGCC_DIR)/crtend.o
	<$(SOURCE_GRIST)!glue!arch!$(OBOS_ARCH)>crtn.o

	: $(SUBDIR)/ldscripts/$(OBOS_ARCH)/library.ld
	: -shared -soname libroot.so -Bdynamic -export-dynamic
	: no_gcc
	: beos/system/lib/libroot.so
	;

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


WriteKernelConfig $(OBOS_KERNEL_CONFIG) ;
BuildKernel $(OBOS_KERNEL) : $(OBOS_KERNEL_CONFIG) ;

Depends kernel.so : kernel ;
	# kernel.so will be rebuilt with the kernel

SubInclude OBOS_TOP src kernel boot ;
SubInclude OBOS_TOP src kernel core ;
SubInclude OBOS_TOP src kernel glue ;
SubInclude OBOS_TOP src kernel libroot ;
SubInclude OBOS_TOP src kernel runtime_loader ;
