summaryrefslogtreecommitdiffstats
path: root/run.in
blob: a6ce66f981fb81131f9eeb1da2bb8a1a5fb9758b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#!/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@

# 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