#!/bin/sh

# path of the checked out Haiku sources
sourceDir=/boot/home/develop/openbeos/current
# disk image path, size in MB
imagePath=/media/haiku.image
imageSize=40
# ufs_mount path
ufsMount=/boot/home/develop/other/userlandfs/generated/distro/ufs_mount/ufs_mount

# build everything needed
cd $sourceDir
RUN_WITHOUT_APP_SERVER=1
jam -q kernel boot_loader config_manager pci isa ide scsi \
	ide_isa bfs blkman fast_log ide_adapter locked_pool \
	scsi_periph intel keyboard scsi_dsk scsi_cd libbe.so \
	rld.so libroot.so init kernel_false consoled \
	kernel_fortune kernel_true ls df mount unmount \
	kernel_uname df libnet.so null zero random tty sh ps || exit 1


# create the image and the directory structure

dd if=/dev/zero of=$imagePath bs=1M count=$imageSize
mkbfs $imagePath Haiku
mkdir -p /haiku
sync
$ufsMount obfs $imagePath /haiku || exit 1

cd /haiku
mkdir -p beos/system/add-ons/kernel/bus_managers
mkdir -p beos/system/add-ons/kernel/generic
mkdir -p beos/system/add-ons/kernel/file_systems
mkdir -p beos/system/add-ons/kernel/partitioning_systems
mkdir -p beos/system/add-ons/kernel/busses/ide
mkdir -p beos/system/add-ons/kernel/boot
mkdir -p beos/system/add-ons/kernel/drivers/bin
mkdir -p beos/system/add-ons/kernel/drivers/dev/disk/scsi
mkdir -p beos/bin
mkdir -p beos/system/lib
mkdir -p beos/system/boot
mkdir -p beos/etc
mkdir -p home


# modules

cd $sourceDir/distro/x86.R1/beos/system/add-ons/kernel

for f in bus_managers/isa bus_managers/ide bus_managers/scsi busses/ide/ide_isa \
		file_systems/bfs generic/blkman generic/fast_log generic/ide_adapter \
		generic/locked_pool generic/scsi_periph partitioning_systems/intel; do
	cp $f /haiku/beos/system/add-ons/kernel/$f
done

for f in drivers/dev/disk/scsi/scsi_dsk drivers/dev/disk/scsi/scsi_cd; do
	name=drivers/bin/$(basename $f)
	cp $name /haiku/beos/system/add-ons/kernel/$name
done

cd $sourceDir/objects/x86.R1/add-ons/kernel

for f in bus_managers/config_manager bus_managers/pci; do
	name=$(basename $f)
	cp $f/$name /haiku/beos/system/add-ons/kernel/$f
done

# drivers
for f in drivers/arch/x86/keyboard/keyboard; do
	cp $f /haiku/beos/system/add-ons/kernel/drivers/bin
done

cd $sourceDir/distro/x86.R1/beos/system/add-ons/kernel/drivers/dev
for f in tty random null zero; do
	cp $f /haiku/beos/system/add-ons/kernel/drivers/bin
done


# kernel
cp $sourceDir/objects/x86.R1/kernel/kernel /haiku/beos/system/kernel_x86


# libs
cd $sourceDir/distro/x86.R1/beos/system/lib
cp libbe.so /haiku/beos/system/lib/
cd $sourceDir/objects/x86.R1/kernel/
cp rld.so libroot.so /haiku/beos/system/lib/
cp /system/lib/libstdc++.r4.so /haiku/beos/system/lib/


# apps
cd $sourceDir/objects/x86.R1/kernel
for f in false fortune ls ps true uname; do
	cp kernel_$f /haiku/beos/bin/$f
done
cp $sourceDir/src/kernel/apps/fortune/fortunes /haiku/beos/etc/
cp $sourceDir/distro/x86.R1/beos/bin/df /haiku/beos/bin/
cd /haiku/beos/bin/


# boot loader
cd /haiku/beos/system
objcopy -O binary $sourceDir/objects/x86.R1/kernel/boot_loader zbeos


# boot module links
cd /haiku/beos/system/add-ons/kernel/boot
for f in bus_managers/config_manager bus_managers/pci bus_managers/isa bus_managers/ide bus_managers/scsi busses/ide/ide_isa file_systems/bfs generic/blkman generic/fast_log generic/ide_adapter generic/locked_pool generic/scsi_periph partitioning_systems/intel; do
	ln -fs /boot/beos/system/add-ons/kernel/$f $(basename $f)
done
for f in drivers/dev/disk/scsi/scsi_dsk drivers/dev/disk/scsi/scsi_cd; do
	ln -fs /boot/beos/system/add-ons/kernel/drivers/bin/$(basename $f) .
done


# driver links
cd /haiku/beos/system/add-ons/kernel
for f in drivers/dev/keyboard drivers/dev/null drivers/dev/tty drivers/dev/zero \
		drivers/dev/disk/scsi/scsi_dsk drivers/dev/disk/scsi/scsi_cd; do
	relName=$(echo $f | sed -e s@drivers/dev/@@)
	linkName=bin/$(basename $f)
	while [ $relName != . ]; do
		relName=$(dirname $relName)
		linkName=../$linkName
	done
	(cd $(dirname $f); ln -fs $linkName .)
done


cd /
sync
unmount /haiku
