haiku/makehdimage
Ingo Weinhold 8a9c34bcfb Added `-i <include file>' option. If specified, the file is included
(sourced) before unmounting the image. That solve my problem that mounting
and copying things onto the image after makehdimage is done, damages the
FS integrity for any reason (Axel can't reproduce it, of course :-).
Maybe others have the same problem.


git-svn-id: file:///srv/svn/repos/haiku/trunk/current@11744 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-03-14 22:08:28 +00:00

423 lines
13 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 copy 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 RUN_WITHOUT_APP_SERVER=1
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"
BEOS_SYSTEM_LIB="libbe.so libstdc++.r4.so libnet.so libmedia.so \
libtranslation.so libbind.so libnetapi.so libsocket.so"
BEOS_SYSTEM_SERVERS="registrar debug_server syslog_daemon media_server \
media_addon_server input_server"
BEOS_ADD_ONS_TRANSLATORS="STXTTranslator RTF-Translator"
BEOS_ADD_ONS_MEDIA="mixer.media_addon legacy.media_addon multi_audio.media_addon"
BEOS_ADD_ONS_INPUT_DEVICES="<input>keyboard"
echo "Building executables and libraries..."
jam -j$(sysinfo -cpu | head -c 2) -q rc resattr 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 \
rld.so kernel_fortune consoled \
$BEOS_BIN $BEOS_SYSTEM_LIB $BEOS_SYSTEM_SERVERS \
$BEOS_ADD_ONS_TRANSLATORS $BEOS_ADD_ONS_MEDIA $BEOS_ADD_ONS_INPUT_DEVICES\
libnet.so dprintf null zero random ps2_hid \<driver\>tty console \
\<driver\>config vga_text timezone_files keymap_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
else
sPrefix=:
cd="$fsShellCommand cd"
scd="$fsShellCommand cd"
cp="$fsShellCommand cp"
ln="$fsShellCommand ln"
mkdir="$fsShellCommand mkdir"
rm="$fsShellCommand rm"
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..."
$mkdir -p beos/bin
$mkdir -p beos/etc
$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/input
$mkdir -p beos/system/add-ons/kernel/drivers/dev/misc
$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/partitioning_systems
$mkdir -p beos/system/add-ons/Translators
$mkdir -p beos/system/add-ons/media
$mkdir -p beos/system/add-ons/input_server/devices
$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
# 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 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 \
console/vga_text bus_managers/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
for f in bus_managers/config_manager; do
name=$(basename $f)
$cp ${sPrefix}$f/$name $targetDir/beos/system/add-ons/kernel/$f
done
# 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 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/kernel/kernel $targetDir/beos/system/kernel_${arch}
# 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/kernel/
$scd ${sPrefix}$sourceDir/objects/${arch}.R1/kernel/
$cp ${sPrefix}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/kernel
$scd ${sPrefix}$sourceDir/objects/${arch}.R1/kernel
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; do
$cp ${sPrefix}$f $targetDir/beos/bin/
done
$cd $targetDir/beos/bin
# 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 $targetDir/beos/system/boot/
$cp ${sPrefix}data/etc/profile ${sPrefix}data/etc/termcap $targetDir/beos/etc/
$cp ${sPrefix}src/kernel/apps/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/kernel/
rm -f zbeos
objcopy -O binary boot_loader zbeos
$cd $targetDir/beos/system
$cp ${sPrefix}$sourceDir/objects/${arch}.R1/kernel/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/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
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; 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/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/devices/
$cd ${sPrefix}$sourceDir/distro/${arch}.R1/beos/system/add-ons/input_server/devices/
for f in keyboard; do
$cp ${sPrefix}$f $targetDir/beos/system/add-ons/input_server/devices/
done
# 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