#!/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 head zip unzip mountvolume top finddir groups \ id env basename factor tty dstcheck comm modifiers version \ csplit cut beep" BEOS_APPS="MiniTerminal Expander People ShowImage Clock Pulse Playground \ SoundRecorder BitmapDrawing Magnify DiskProbe" BEOS_PREFERENCES="Backgrounds DataTranslations FileTypes Media Menu Mouse \ Keyboard Keymap Screen ScrollBar Sounds Time VirtualMemory Workspaces" 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 \ libdevice.so libgame.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="keyboard mouse" BEOS_ADD_ONS_DRIVERS_MISC="keyboard scsi_dsk scsi_cd dprintf null zero random ps2_hid \ tty console 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 \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/ if [ -e data/settings/kernel/drivers/vesa ]; then $cp ${sPrefix}data/settings/kernel/drivers/vesa \ $targetDir/home/config/settings/kernel/drivers/ fi $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/ if [ -e /boot/beos/etc/fonts/ttfonts/Swiss721.ttf ]; then $cp ${sPrefix}/boot/beos/etc/fonts/ttfonts/Courier10Pitch.ttf $targetDir/beos/etc/fonts/ttfonts/ $cp ${sPrefix}/boot/beos/etc/fonts/ttfonts/Swiss721_Bold.ttf $targetDir/beos/etc/fonts/ttfonts/ $cp ${sPrefix}/boot/beos/etc/fonts/ttfonts/Swiss721.ttf $targetDir/beos/etc/fonts/ttfonts/ fi # 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 sync $fsShellCommand quit fi if [ $archive ]; then zip haiku.zip $imagePath fi