Files
libguestfs/run.in
2012-12-17 22:24:53 +01:00

182 lines
5.0 KiB
Bash
Executable File

#!/bin/bash -
# libguestfs 'run' programs locally script
# Copyright (C) 2011-2012 Red Hat Inc.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#----------------------------------------------------------------------
# With this script you can run all the virt tools without needing to
# install them first. You just have to do for example:
#
# ./run ./inspector/virt-inspector [args ...]
#
# This works for any C program, virt tools, and most non-C bindings
# and programs in the libguestfs distribution. Also you can make a
# symbolic [not hard] link to this 'run' script from anywhere
# (eg. $HOME/bin/run) if you wish.
#
# The script can also be used to make the output of tests shorter:
# TESTS_ENVIRONMENT = ... $(top_builddir)/run --test [$(VG)]
# (Use the optional $(VG) when the tests must also be run under
# valgrind).
#----------------------------------------------------------------------
if [ "$1" = "--test" ]; then
test_mode=1
shift
fi
# Find this script.
b=@abs_builddir@
# Set tmpdir and cachedir so the appliance doesn't conflict with
# globally installed libguestfs.
#
# We set it to a subdirectory ('tmp') so that we can label this
# subdirectory to make libvirt + sVirt + SELinux enforcing work.
export LIBGUESTFS_TMPDIR="$b/tmp"
export LIBGUESTFS_CACHEDIR="$b/tmp"
mkdir -p "$b/tmp"
chcon --reference=/tmp tmp 2>/dev/null ||:
# Set local environment relative to this script.
export LIBGUESTFS_PATH="$b/appliance"
if [ -z "$LD_LIBRARY_PATH" ]; then
LD_LIBRARY_PATH="$b/src/.libs:$b/gobject/.libs"
else
LD_LIBRARY_PATH="$b/src/.libs:$b/gobject/.libs:$LD_LIBRARY_PATH"
fi
export LD_LIBRARY_PATH
# For Perl.
if [ -z "$PERL5LIB" ]; then
PERL5LIB="$b/perl/blib/lib:$b/perl/blib/arch"
else
PERL5LIB="$b/perl/blib/lib:$b/perl/blib/arch:$PERL5LIB"
fi
export PERL5LIB
# For Python.
export PYTHON=@PYTHON@
if [ -z "$PYTHONPATH" ]; then
PYTHONPATH="$b/python:$b/python/.libs"
else
PYTHONPATH="$b/python:$b/python/.libs:$PYTHONPATH"
fi
export PYTHONPATH
# For Ruby.
export RUBY=@RUBY@
if [ -z "$RUBYLIB" ]; then
RUBYLIB="$b/ruby/lib:$b/ruby/ext/guestfs"
else
RUBYLIB="$b/ruby/lib:$b/ruby/ext/guestfs:$RUBYLIB"
fi
export RUBYLIB
export LD_LIBRARY_PATH="$b/ruby/ext/guestfs:$LD_LIBRARY_PATH"
# For OCaml.
if [ -z "$CAML_LD_LIBRARY_PATH" ]; then
CAML_LD_LIBRARY_PATH="$b/ocaml"
else
CAML_LD_LIBRARY_PATH="$b/ocaml:$CAML_LD_LIBRARY_PATH"
fi
export CAML_LD_LIBRARY_PATH
# For Java.
export JAVA_EXE=@JAVA_EXE@
if [ -z "$CLASSPATH" ]; then
CLASSPATH="$b/java:$b/java/t:$b/java/libguestfs-@VERSION@.jar"
else
CLASSPATH="$b/java:$b/java/t:$b/java/libguestfs-@VERSION@.jar:$CLASSPATH"
fi
export CLASSPATH
# For Erlang.
if [ -z "$PATH" ]; then
PATH="$b/erlang"
else
PATH="$b/erlang:$PATH"
fi
export PATH
# For Lua.
export LUA=@LUA@
if [ -z "$LUA_CPATH" ]; then
LUA_CPATH="$b/lua/?.so"
else
LUA_CPATH="$b/lua/?.so;$LUA_CPATH"
fi
export LUA_CPATH
# For GObject, Javascript and friends.
export GJS=@GJS@
if [ -z "$GI_TYPELIB_PATH" ]; then
GI_TYPELIB_PATH="$b/gobject"
else
GI_TYPELIB_PATH="$b/gobject:$GI_TYPELIB_PATH"
fi
export GI_TYPELIB_PATH
# Be friendly to valgrind (https://live.gnome.org/Valgrind)
export G_SLICE=always-malloc
export G_DEBUG=gc-friendly
# This is a cheap way to find some use-after-free and uninitialized
# read problems when using glibc.
random_val="$(awk 'BEGIN{srand(); print 1+int(255*rand())}' < /dev/null)"
export MALLOC_PERTURB_=$random_val
# Do we have libtool? If we have it then we can use it to make
# running valgrind simpler. However don't depend on it.
if libtool --help >/dev/null 2>&1; then
libtool="libtool --mode=execute"
fi
# Avoid GNOME keyring stupidity
export GNOME_KEYRING_CONTROL=
export GNOME_KEYRING_PID=
# Run the program.
if [ -z "$test_mode" ]; then
exec $libtool "$@"
else
# For tests (./run --test), redirect all output to a file, and
# only print the file if the test fails.
pid=$$
tmpout=$b/tmp/run-$pid
rm -f $tmpout
start_t="$(date +'%s')"
$libtool "$@" > $tmpout 2>&1
fail=$?
end_t="$(date +'%s')"
if [ "$fail" -eq 0 ]; then
# Test successful.
echo $(($end_t - $start_t)) seconds: "$@"
elif [ "$fail" -eq 77 ]; then
# Tests return 77 to mean skipped.
cat $tmpout
else
# Test failed.
echo "$b/run --test" "$@"
cat $tmpout
echo "$b/run: command failed with exit code $fail"
fi
rm -f $tmpout
exit $fail
fi