haiku/makehdimage
Axel Dörfler c4b3327af7 Added the vesa driver - note, if you're using it, you have to switch to the
resolution you compiled app_server with in the boot menu (or via the "vesa"
kernel settings file).
Added libtracker.so to the image.
Also added "People", "ShowImage", "Clock", and "ScrollBar", neither of
them seem to work yet, though (but we can still hope, right?).


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@12806 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-05-25 01:55:16 +00:00

534 lines
18 KiB
Bash
Executable File

#!/bin/sh
# Usage: makehdimage [-i includeFile] [image path/target dir]
#
# This script will compile all files needed to create a bootable Haiku image,
# create such an image, and copy the files to the correct location.
#
# If you don't specify the image, $sourceDir/haiku.image will be used. In
# the current default configuration, you have to start this script in the
# "current" directory of the Haiku tree. A 60 MB image will be created there.
#
# If you specify a target directory, no image is going to be created at
# all.
#
# If you pass `-i includeFile', the file is sourced before unmounting the
# image.
#
# The image is populated using the bfs_shell which is created from the sources.
# The bfs_shell emulates a mini-kernel evironment with a mounted BFS. The
# program fs_shell_command is used to deliver commands to it. Due to this
# setup a few things need to be kept in mind, if you intend to modify the
# script and want it to still work.
#
# All commands that modify the target (directory or image) are to be called
# through variables (defined after the jam invocation block). This ensures
# that both applications (creating and image and just installing the stuff in
# a target directory) do still work. Additionally there's a variable `sPrefix'
# defined, which has to be prepended to every source path, when passing the
# path to such a command.
#
# A further particularity to consider is changing the current working
# directory. When the shell command `cd' is invoked here, it affects only
# the shell which executes this script; the bfs_shell will know nothing of
# it. Hence, if you want the bfs_shell to know of a changed directory, you
# must tell it. There are two commands bound to variables: `$cd' should be
# used, when you want to change into a target directory, `$scd' when the
# source directory shall be changed. In the latter case you usually invoke
# first a normal shell `cd' and then the `$scd', so that both, the shell and
# the bfs_shell know about the new dir (depending on what you intend to do
# one may be enough, though).
# path of the checked out Haiku sources
sourceDir=.
alreadyMounted=
targetDir=/haiku
includeFile=
# check whether there's a file to be included
if [ $# \> 0 ]; then
if [ "$1" = "-i" ]; then
shift
if [ $# \> 0 ]; then
includeFile="$1"
shift
else
echo "Error: Option \`-i' requires a parameter!"
exit 1
fi
fi
fi
# disk image path, size in MB
if [ -d "$1" ]; then
alreadyMounted=true
targetDir=$1
elif [ "$1" == "" ]; then
imagePath=$sourceDir/haiku.image
else
imagePath=$1
fi
imageSize=60
# Bochs parameters:
# 40 MB: cylinders=82, heads=16, spt=63
# 60 MB: cylinders=122, heads=16, spt=63
# 100 MB: cylinders=204, heads=16, spt=63
# the architecture; ToDo: set correctly (using uname?)
arch=x86
# build everything needed
previousDir=`pwd`
cd $sourceDir
sourceDir=`pwd`
# we accept relative source directories as well
if [ $alreadyMounted ]; then
echo "Building binaries and copying them to $targetDir"
else
echo "Building $imageSize MB image at $imagePath..."
fi
# paths of helper commands
rc=$sourceDir/distro/${arch}.R1/beos/bin/rc
resattr=$sourceDir/objects/${arch}.R1/tools/resattr/resattr
fsShellCommand=$sourceDir/objects/${arch}.R1/tests/add-ons/kernel/file_systems/fs_shell/fs_shell_command
bfsShell=$sourceDir/objects/${arch}.R1/tests/add-ons/kernel/file_systems/bfs/bfs_shell/bfs_shell
export TARGET_PLATFORM=haiku
BEOS_BIN="touch sync ln listarea listattr listsem listport \
true false ls df mount unmount cp mv ps sh mkdir sleep \
grep cat less clockconfig du rm date find locate xargs \
isvolume shutdown safemode sysinfo kill diff cmp more \
renice rmattr addattr listdev pwd chmod chown chgrp dd \
tee md5sum catattr query lsindex mkindex roster listimage \
quit open translate setvolume waitfor uname iroster keymap \
strace rmdir error ifconfig ping traceroute arp pppconfig \
ppp_up gdb tail zip unzip mountvolume"
BEOS_APPS="MiniTerminal People ShowImage Clock"
BEOS_PREFERENCES="DataTranslations Mouse Keyboard Keymap Menu ScrollBar Sounds Media FileTypes"
BEOS_SYSTEM_LIB="libbe.so libstdc++.r4.so libnet.so libmedia.so libtracker.so \
libtranslation.so libbind.so libnetapi.so libsocket.so libdebug.so \
libtextencoding.so libz.so libfreetype.so libpng.so libappserver.so"
BEOS_SYSTEM_SERVERS="registrar debug_server syslog_daemon media_server \
media_addon_server input_server app_server fake_app_server"
BEOS_NETWORK_CORE="core"
BEOS_NETWORK_INTERFACES="ethernet loopback ppp"
BEOS_NETWORK_PPP="ipcp modem pap pppoe"
BEOS_NETWORK_PROTOCOLS="icmp ipv4 raw route tcp udp"
BEOS_ADD_ONS_ACCELERANTS="radeon.accelerant nv.accelerant mga.accelerant \
nm.accelerant vesa.accelerant"
BEOS_ADD_ONS_TRANSLATORS="STXTTranslator RTF-Translator PNGTranslator"
BEOS_ADD_ONS_MEDIA="mixer.media_addon legacy.media_addon multi_audio.media_addon"
BEOS_ADD_ONS_INPUT_DEVICES="<input>keyboard <input>mouse"
BEOS_ADD_ONS_DRIVERS_MISC="keyboard scsi_dsk scsi_cd dprintf null zero random ps2_hid \
<driver>tty console <driver>config"
BEOS_ADD_ONS_DRIVERS_GRAPHICS="radeon.driver nv.driver nm.driver mga.driver vesa"
BEOS_ADD_ONS_DRIVERS_NET="ipro1000 rtl8139 rtl8169 sis900 \
via-rhine wb840 net_stack_driver" # bcm440x bcm570x (only available with GPLd add-ons)
BEOS_ADD_ONS_BUS_MANAGERS="pci isa ide scsi config_manager"
BEOS_ADD_ONS_KERNEL_MISC="ide_isa generic_ide_pci block_io fast_log ide_adapter locked_pool \
scsi_periph intel keyboard vga_text"
BEOS_ADD_ONS_FILESYSTEMS="bfs"
BEOS_DATA_FILES="timezone_files keymap_files"
echo "Building executables and libraries..."
jam -j$(sysinfo -cpu | head -c 2) -q rc resattr kernel boot_loader \
rld.so kernel_fortune consoled \<bin\>route \
$BEOS_BIN \
$BEOS_APPS \
$BEOS_PREFERENCES \
$BEOS_SYSTEM_LIB \
$BEOS_SYSTEM_SERVERS \
$BEOS_NETWORK_CORE \
$BEOS_NETWORK_INTERFACES \
$BEOS_NETWORK_PPP \
$BEOS_NETWORK_PROTOCOLS \
$BEOS_ADD_ONS_DRIVERS_MISC \
$BEOS_ADD_ONS_DRIVERS_GRAPHICS \
$BEOS_ADD_ONS_DRIVERS_NET \
$BEOS_ADD_ONS_BUS_MANAGERS \
$BEOS_ADD_ONS_KERNEL_MISC \
$BEOS_ADD_ONS_FILESYSTEMS \
$BEOS_ADD_ONS_ACCELERANTS \
$BEOS_ADD_ONS_TRANSLATORS \
$BEOS_ADD_ONS_MEDIA \
$BEOS_ADD_ONS_INPUT_DEVICES \
$BEOS_DATA_FILES \
bfs_shell fs_shell_command \
|| { echo "*** Build failed!" 1>&2 ; exit 1; }
# map the shell commands
if [ $alreadyMounted ]; then
sPrefix=
cd=cd
scd=:
cp="copyattr -d"
ln=ln
mkdir=mkdir
rm=rm
mkindex=mkindex
else
sPrefix=:
cd="$fsShellCommand cd"
scd="$fsShellCommand cd"
cp="$fsShellCommand cp"
ln="$fsShellCommand ln"
mkdir="$fsShellCommand mkdir"
rm="$fsShellCommand rm"
mkindex="$fsShellCommand mkindex"
fi
# create the image and the directory structure
if [ ! $alreadyMounted ]; then
echo
echo "Creating image..."
dd if=/dev/zero of=$imagePath bs=1M count=$imageSize
mkbfs $imagePath Haiku >/dev/null
targetDir=/myfs
$bfsShell -n $imagePath > /dev/null &
sleep 1
fi
$cd $targetDir
echo
echo "Creating directory structure..."
$mkindex BEOS:APP_SIG
# needed to launch apps via signature
$mkdir -p beos/apps
$mkdir -p beos/bin
$mkdir -p beos/etc
$mkdir -p beos/preferences
$mkdir -p beos/system/add-ons/kernel/boot
$mkdir -p beos/system/add-ons/kernel/bus_managers
$mkdir -p beos/system/add-ons/kernel/busses/ide
$mkdir -p beos/system/add-ons/kernel/drivers/bin
$mkdir -p beos/system/add-ons/kernel/drivers/dev/disk/scsi
$mkdir -p beos/system/add-ons/kernel/drivers/dev/graphics
$mkdir -p beos/system/add-ons/kernel/drivers/dev/input
$mkdir -p beos/system/add-ons/kernel/drivers/dev/misc
$mkdir -p beos/system/add-ons/kernel/drivers/dev/net
$mkdir -p beos/system/add-ons/kernel/file_systems
$mkdir -p beos/system/add-ons/kernel/console
$mkdir -p beos/system/add-ons/kernel/generic
$mkdir -p beos/system/add-ons/kernel/network
$mkdir -p beos/system/add-ons/kernel/network/interfaces
$mkdir -p beos/system/add-ons/kernel/network/ppp
$mkdir -p beos/system/add-ons/kernel/network/protocols
$mkdir -p beos/system/add-ons/kernel/partitioning_systems
$mkdir -p beos/system/add-ons/Translators
$mkdir -p beos/system/add-ons/accelerants
$mkdir -p beos/system/add-ons/media
$mkdir -p beos/system/add-ons/input_server/devices
$mkdir -p beos/system/add-ons/input_server/filters
$mkdir -p beos/system/boot
$mkdir -p beos/system/lib
$mkdir -p beos/system/servers
$mkdir -p home/config
$mkdir -p home/config/settings/kernel/drivers
$mkdir -p var/tmp
$mkdir -p var/log
# modules
echo "Installing kernel modules..."
cd $sourceDir/distro/${arch}.R1/beos/system/add-ons/kernel
$scd ${sPrefix}$sourceDir/distro/${arch}.R1/beos/system/add-ons/kernel
for f in $BEOS_ADD_ONS_BUS_MANAGERS; do
$cp ${sPrefix}bus_managers/$f $targetDir/beos/system/add-ons/kernel/bus_managers/$f
done
for f in busses/ide/ide_isa file_systems/bfs generic/block_io generic/fast_log \
generic/ide_adapter generic/locked_pool generic/scsi_periph \
partitioning_systems/intel console/vga_text busses/ide/generic_ide_pci; do
$cp ${sPrefix}$f $targetDir/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 ${sPrefix}$name $targetDir/beos/system/add-ons/kernel/$name
done
cd $sourceDir/objects/${arch}.R1/add-ons/kernel
$scd ${sPrefix}$sourceDir/objects/${arch}.R1/add-ons/kernel
# drivers
for f in drivers/arch/${arch}/keyboard/keyboard; do
$cp ${sPrefix}$f $targetDir/beos/system/add-ons/kernel/drivers/bin
done
cd $sourceDir/distro/${arch}.R1/beos/system/add-ons/kernel/drivers/bin
$scd ${sPrefix}$sourceDir/distro/${arch}.R1/beos/system/add-ons/kernel/drivers/bin
for f in $BEOS_ADD_ONS_DRIVERS_GRAPHICS; do
$cp ${sPrefix}$f $targetDir/beos/system/add-ons/kernel/drivers/bin
done
for f in $BEOS_ADD_ONS_DRIVERS_NET; do
$cp ${sPrefix}$f $targetDir/beos/system/add-ons/kernel/drivers/bin
done
for f in ps2_hid; do
$cp ${sPrefix}$f $targetDir/beos/system/add-ons/kernel/drivers/bin
done
cd $sourceDir/distro/${arch}.R1/beos/system/add-ons/kernel/drivers/dev
$scd ${sPrefix}$sourceDir/distro/${arch}.R1/beos/system/add-ons/kernel/drivers/dev
for f in misc/config console tty random dprintf null zero; do
$cp ${sPrefix}$f $targetDir/beos/system/add-ons/kernel/drivers/bin
done
# kernel
echo "Installing kernel..."
$cp ${sPrefix}$sourceDir/objects/${arch}.R1/system/kernel_${arch} $targetDir/beos/system/
# libs
echo "Installing libraries..."
cd $sourceDir/distro/${arch}.R1/beos/system/lib
$scd ${sPrefix}$sourceDir/distro/${arch}.R1/beos/system/lib
for f in $BEOS_SYSTEM_LIB; do
$cp ${sPrefix}$f $targetDir/beos/system/lib/
done
cd $sourceDir/objects/${arch}.R1/system/
$scd ${sPrefix}$sourceDir/objects/${arch}.R1/system/
$cp ${sPrefix}runtime_loader/rld.so ${sPrefix}libroot.so $targetDir/beos/system/lib/
# servers
echo "Installing servers..."
cd $sourceDir/distro/${arch}.R1/beos/system/servers
$scd ${sPrefix}$sourceDir/distro/${arch}.R1/beos/system/servers
for f in $BEOS_SYSTEM_SERVERS; do
$cp ${sPrefix}$f $targetDir/beos/system/servers/
done
# apps
echo "Installing apps..."
cd $sourceDir/objects/${arch}.R1/tests/kernel/boot_floppy
$scd ${sPrefix}$sourceDir/objects/${arch}.R1/tests/kernel/boot_floppy
for f in fortune; do
$cp ${sPrefix}kernel_$f $targetDir/beos/bin/$f
done
cd $sourceDir/distro/${arch}.R1/beos/bin
$scd ${sPrefix}$sourceDir/distro/${arch}.R1/beos/bin
for f in ../apps/consoled $BEOS_BIN route; do
$cp ${sPrefix}$f $targetDir/beos/bin/
done
cd $sourceDir/distro/${arch}.R1/beos/apps
$scd ${sPrefix}$sourceDir/distro/${arch}.R1/beos/apps
for f in $BEOS_APPS; do
$cp ${sPrefix}$f $targetDir/beos/apps/
done
cd $sourceDir/distro/${arch}.R1/beos/preferences
$scd ${sPrefix}$sourceDir/distro/${arch}.R1/beos/preferences
for f in $BEOS_PREFERENCES; do
$cp ${sPrefix}$f $targetDir/beos/preferences/
done
# scripts and data files
echo "Installing scripts and data files..."
cd $sourceDir
$scd ${sPrefix}$sourceDir
$cp ${sPrefix}data/system/boot/Bootscript \
${sPrefix}data/system/boot/SetupEnvironment \
${sPrefix}data/system/boot/Netscript $targetDir/beos/system/boot/
$cp ${sPrefix}data/etc/profile ${sPrefix}data/etc/termcap $targetDir/beos/etc/
$cp ${sPrefix}src/tests/kernel/boot_floppy/fortune/fortunes $targetDir/beos/etc/
$cp -r ${sPrefix}distro/${arch}.R1/beos/etc $targetDir/beos/
$cp ${sPrefix}data/settings/kernel/drivers/kernel \
$targetDir/home/config/settings/kernel/drivers/
$ln -sf /boot/beos/etc/timezones/Europe/Paris \
$targetDir/home/config/settings/timezone
$cp ${sPrefix}distro/${arch}.R1/beos/etc/Keymap/US-International \
$targetDir/home/config/settings/Key_map
# boot loader
echo "Installing boot loader..."
cd $sourceDir/objects/${arch}.R1/system/
rm -f zbeos
objcopy -O binary boot_loader zbeos
$cd $targetDir/beos/system
$cp ${sPrefix}$sourceDir/objects/${arch}.R1/system/zbeos .
# boot module links
echo "Creating boot module links..."
$cd $targetDir/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/block_io \
generic/fast_log generic/ide_adapter generic/locked_pool generic/scsi_periph \
partitioning_systems/intel busses/ide/generic_ide_pci; 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
echo "Creating driver links..."
$cd $targetDir/beos/system/add-ons/kernel
for f in drivers/dev/dprintf drivers/dev/keyboard drivers/dev/null \
drivers/dev/misc/config drivers/dev/tty drivers/dev/zero \
drivers/dev/disk/scsi/scsi_dsk drivers/dev/disk/scsi/scsi_cd \
drivers/dev/misc/config drivers/dev/input/ps2_hid \
drivers/dev/console drivers/dev/graphics/radeon.driver \
drivers/dev/graphics/nv.driver drivers/dev/graphics/mga.driver \
drivers/dev/graphics/nm.driver drivers/dev/net/ipro1000 \
drivers/dev/net/rtl8139 drivers/dev/net/rtl8169 \
drivers/dev/net/sis900 drivers/dev/net/via-rhine \
drivers/dev/net/wb840 drivers/dev/net/net_stack_driver \
drivers/dev/graphics/vesa; do
relName=$(echo $f | sed -e s@drivers/dev/@@)
linkName=bin/$(basename $f)
while [ $relName != . ]; do
relName=$(dirname $relName)
linkName=../$linkName
done
$ln -fs $linkName $(dirname $f)
done
# add-ons
echo "Copying add-ons..."
cd $sourceDir/distro/${arch}.R1/beos/system/add-ons/accelerants
$scd ${sPrefix}$sourceDir/distro/${arch}.R1/beos/system/add-ons/accelerants
for f in $BEOS_ADD_ONS_ACCELERANTS; do
$cp ${sPrefix}$f $targetDir/beos/system/add-ons/accelerants/
done
cd $sourceDir/distro/${arch}.R1/beos/system/add-ons/Translators
$scd ${sPrefix}$sourceDir/distro/${arch}.R1/beos/system/add-ons/Translators
for f in $BEOS_ADD_ONS_TRANSLATORS; do
$cp ${sPrefix}$f $targetDir/beos/system/add-ons/Translators/
done
cd $sourceDir/distro/${arch}.R1/beos/system/add-ons/media
$scd ${sPrefix}$sourceDir/distro/${arch}.R1/beos/system/add-ons/media
for f in $BEOS_ADD_ONS_MEDIA; do
$cp ${sPrefix}$f $targetDir/beos/system/add-ons/media/
done
cd $sourceDir/distro/${arch}.R1/beos/system/add-ons/input_server/
$cd ${sPrefix}$sourceDir/distro/${arch}.R1/beos/system/add-ons/input_server/
for f in devices/keyboard devices/mouse; do
$cp ${sPrefix}$f $targetDir/beos/system/add-ons/input_server/$(dirname $f)/
done
# network add-ons
cd $sourceDir/distro/${arch}.R1/beos/system/add-ons/kernel/obos_network
$scd ${sPrefix}$sourceDir/distro/${arch}.R1/beos/system/add-ons/kernel/obos_network
for f in $BEOS_NETWORK_CORE; do
$cp ${sPrefix}$f $targetDir/beos/system/add-ons/kernel/network
done
cd $sourceDir/distro/${arch}.R1/beos/system/add-ons/kernel/obos_network/interfaces
$scd ${sPrefix}$sourceDir/distro/${arch}.R1/beos/system/add-ons/kernel/obos_network/interfaces
for f in $BEOS_NETWORK_INTERFACES; do
$cp ${sPrefix}$f $targetDir/beos/system/add-ons/kernel/network/interfaces
done
cd $sourceDir/distro/${arch}.R1/beos/system/add-ons/kernel/obos_network/ppp
$scd ${sPrefix}$sourceDir/distro/${arch}.R1/beos/system/add-ons/kernel/obos_network/ppp
for f in $BEOS_NETWORK_PPP; do
$cp ${sPrefix}$f $targetDir/beos/system/add-ons/kernel/network/ppp
done
cd $sourceDir/distro/${arch}.R1/beos/system/add-ons/kernel/obos_network/protocols
$scd ${sPrefix}$sourceDir/distro/${arch}.R1/beos/system/add-ons/kernel/obos_network/protocols
for f in $BEOS_NETWORK_PROTOCOLS; do
$cp ${sPrefix}$f $targetDir/beos/system/add-ons/kernel/network/protocols
done
# install fonts
echo "Installing fonts..."
cd $sourceDir/distro/${arch}.R1/beos/etc/
$cd ${sPrefix}$sourceDir/distro/${arch}.R1/beos/etc/
$cp -r ${sPrefix}fonts $targetDir/beos/etc/
# install MIME database
mimeDBSource=$sourceDir/src/data/beos_mime
mimeDBDest=$targetDir/home/config/settings/beos_mime
echo "Deleting old MIME database..."
$rm -rf $mimeDBDest
$mkdir -p $mimeDBDest
echo "Installing MIME database..."
for inSuperFile in $mimeDBSource/*.super; do
superType=$(basename $inSuperFile .super)
outSuperDir=$mimeDBDest/$superType
# compile rdef to rsrc file and the rsrc file to attributes
tmpFile=/tmp/mimedb$$.rsrc
tmpFile2=/tmp/mimedb$$.mime
$rc -o $tmpFile $inSuperFile
mkdir -p $tmpFile2
$resattr -O -o $tmpFile2 $tmpFile
$cp -r ${sPrefix}$tmpFile2 $outSuperDir
rm -rf $tmpFile $tmpFile2
# iterate through the sub types
for inSubFile in $mimeDBSource/$superType/*; do
# check, if the type exists
if test -f $inSubFile && grep META:TYPE $inSubFile &> /dev/null; then
subType=$(basename $inSubFile)
outSubFile=$outSuperDir/$subType
# compile rdef to rsrc file and the rsrc file to attributes
tmpFile=/tmp/mimedb$$.rsrc
tmpFile2=/tmp/mimedb$$.mime
$rc -o $tmpFile $inSubFile
$resattr -O -o $tmpFile2 $tmpFile
$cp ${sPrefix}$tmpFile2 $outSubFile
rm -f $tmpFile $tmpFile2
fi
done
done
# source the include file, if any
if [ "$includeFile" != "" ]; then
. $includeFile
fi
cd $previousDir
sync
if [ ! $alreadyMounted ]; then
echo Unmounting ...
$fsShellCommand quit
fi
if [ $archive ]; then
zip haiku.zip $imagePath
fi