Mercurial > hg > aboriginal
view sources/toys/run-emulator.sh @ 928:0291e9591d18
Update downloads/binaries/README
author | Rob Landley <rob@landley.net> |
---|---|
date | Tue, 08 Dec 2009 20:22:53 -0600 |
parents | 4bfe2b34dd9f |
children | abff74b958a1 |
line wrap: on
line source
#!/bin/bash # The following environment variables affect the behavior of this script: # HDB - Image file to use for -hdb on /home (none if blank) # HDBMEGS - Number of megabytes to create # HDC - Image file to use for -hdc on /mnt (none of blank) # QEMU_MEMORY - number of megabytes of memory for qemu (defaults to 128) # Also, to use the distcc accelerator you need to have distccd and $ARCH-cc # in the $PATH. [ ! -z "$QEMU_MEMORY" ] && QEMU_EXTRA="-m $QEMU_MEMORY $QEMU_EXTRA" # Should we set up an ext3 image as a second virtual hard drive for /home? if [ ! -z "$HDB" ] then if [ ! -e "$HDB" ] then # If we don't already have an hdb image, should we set up a sparse file and # format it ext3? if [ ! -z "$HDBMEGS" ] then dd if=/dev/zero of="$HDB" bs=1024 seek=$[$HDBMEGS*1024-1] count=1 && mke2fs -b 1024 -F "$HDB" -i 4096 && tune2fs -j -c 0 -i 0 "$HDB" [ $? -ne 0 ] && exit 1 fi fi WITH_HDB="-hdb $HDB" fi [ ! -z "$HDC" ] && [ -e "$HDC" ] && WITH_HDC="-hdc $HDC" # Start of distcc setup unique_port() { # Try to find a unique port number for each running instance of the program. # To reduce the chance of the port already being in use by another program, # we use a range either before or after that used by normal programs, but # beyond that allocated to most persistent demons. There's a small chance # even these ports are already in use, but this at least prevents # simultaneous run-emulator instances for different targets from # trivially interfering with each other. START=8192 RANGE=$[$(awk '{print $1}' /proc/sys/net/ipv4/ip_local_port_range)-$START] if [ $RANGE -lt 1 ] then START=$[$(awk '{print $2}' /proc/sys/net/ipv4/ip_local_port_range)] RANGE=$[65535-$START] fi echo $[($$%$RANGE)+$START] } # The ARCH gets substituted in here by system-image.sh ARCH= # If the cross compiler isn't in the $PATH, look for it in the current # directory and the user's home directory. DISTCC_PATH="$(which $ARCH-cc 2>/dev/null | sed 's@\(.*\)/.*@\1@')" if [ -z "$DISTCC_PATH" ] then [ ! -f "cross-compiler-$ARCH/bin/$ARCH-cc" ] && DISTCC_PATH="$(pwd)/cross-compiler-$ARCH/bin" [ ! -f "$HOME/cross-compiler-$ARCH/bin/$ARCH-cc" ] && DISTCC_PATH="$HOME/cross-compiler-$ARCH/bin" fi if [ -z "$(which distccd)" ] then echo 'No distccd in $PATH, acceleration disabled.' elif [ -z "$DISTCC_PATH" ] then echo "No $ARCH-cc in "'$PATH'", acceleration disabled." else # Populate a directory full of symlinks to the cross compiler using the # unprefixed names distccd will try to use. mkdir -p "distcc_links" && for i in $(cd "$DISTCC_PATH"; ls $ARCH-* | sed "s/^$ARCH-//" ) do ln -sf "$DISTCC_PATH/$ARCH-$i" "distcc_links/$i" done if [ -e "$DISTCC_PATH/$ARCH-rawgcc" ] then for i in cc gcc g++ c++ do ln -sf "$DISTCC_PATH/$ARCH-rawgcc" distcc_links/$i done fi # Run the distcc daemon on the host system with $PATH restricted to the # cross compiler binaries. # Note that we tell it --no-detach and background it ourselves so jobs -p can # find it later to kill it after the emulator exits. PORT=$(unique_port) CPUS=$[$(echo /sys/devices/system/cpu/cpu[0-9]* | wc -w)*2] PATH="$(pwd)/distcc_links" "$(which distccd)" --no-detach --daemon \ --listen 127.0.0.1 -a 127.0.0.1 -p $PORT --jobs $CPUS \ --log-stderr --verbose 2>distccd.log & # Clean up afterwards: Kill child processes we started (I.E. distccd). trap "kill $(jobs -p)" EXIT # When background processes die, they should do so silently. disown $(jobs -p) # Let the QEMU launch know we're using distcc. DISTCC_PATH_PREFIX=/usr/distcc: KERNEL_EXTRA="DISTCC_HOSTS=10.0.2.2:$PORT/$CPUS CPUS=$CPUS $KERNEL_EXTRA" fi # Kill our child processes on exit. trap "pkill -P$$" EXIT # The actual emulator invocation command gets appended here by system-image.sh