#!/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 so the appliance doesn't conflict with globally # installed libguestfs. export TMPDIR="$b" # Set local environment relative to this script. export LIBGUESTFS_PATH="$b/appliance" library_path="$b/src/.libs:$b/gobject/.libs" if [ -z "$LD_LIBRARY_PATH" ]; then LD_LIBRARY_PATH=$library_path else LD_LIBRARY_PATH="$library_path:$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@ export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$b/ruby/ext/guestfs" # For OCaml. export CAML_LD_LIBRARY_PATH="$b/ocaml" # For Java. export JAVA=@JAVA@ export CLASSPATH="$b/java:$b/java/t:$b/java/libguestfs-@VERSION@.jar" # 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 # 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 # 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. fail=0 pid=$$ rm -f $b/run.$pid $libtool "$@" > $b/run.$pid 2>&1 || { fail=$? if [ "$fail" -eq 77 ]; then cat $b/run.$pid else echo "$b/run --test" "$@" cat $b/run.$pid echo "$b/run: command failed with exit code $fail" fi } rm -f $b/run.$pid exit $fail fi