#!/bin/bash - # libguestfs 'run' programs locally script # Copyright (C) 2011-2025 Red Hat Inc. # # @configure_input@ # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # This library 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 # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; 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 virt-inspector [args ...] # # This works for any C program, virt tools, and most non-C bindings # and programs in the libguestfs distribution. # # For lots more ways to use this script, see the libguestfs # guestfs-building(1) man page. # # The script should also be used for tests like this: # # TESTS_ENVIRONMENT = ... $(top_builddir)/run --test # # The --test parameter introduces a timeout, stopping tests from # running forever. #---------------------------------------------------------------------- if [ "$1" = "--test" ]; then timeout_mode=1 shift fi # Function to intelligently prepend a path to an environment variable. # See http://stackoverflow.com/a/9631350 prepend() { eval $1="$2\${$1:+:\$$1}" } # Source and build directories (absolute paths so this works from any # directory). s="$(cd @abs_srcdir@ && pwd)" b="$(cd @abs_builddir@ && pwd)" # Set T to current date & time (mainly for valgrind logfile name). T=`date +%Y%m%d.%H.%M.%S` export T # 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 "$b/tmp" 2>/dev/null ||: # Only set path if the appliance was enabled. if [ "x@ENABLE_APPLIANCE@" = "xyes" ]; then export LIBGUESTFS_PATH="$b/appliance" elif [ -z "$LIBGUESTFS_PATH" ]; then cat <<'EOF' >&2 run: warning: You used './configure --disable-appliance' so LIBGUESTFS_PATH run: warning: has not been set automatically. EOF fi # Set the PATH to contain all the libguestfs binaries. There are a # lot of binaries, so a lot of path entries. prepend PATH "$b/align" prepend PATH "$b/builder" prepend PATH "$b/cat" prepend PATH "$b/customize" prepend PATH "$b/df" prepend PATH "$b/dib" prepend PATH "$b/diff" prepend PATH "$b/edit" prepend PATH "$b/erlang" prepend PATH "$b/fish" prepend PATH "$b/format" prepend PATH "$b/fuse" prepend PATH "$b/get-kernel" prepend PATH "$b/inspector" prepend PATH "$b/make-fs" prepend PATH "$b/rescue" prepend PATH "$b/resize" prepend PATH "$b/sparsify" prepend PATH "$b/sysprep" prepend PATH "$b/test-tool" prepend PATH "$b/tools" export PATH # Set LD_LIBRARY_PATH and DYLD_LIBRARY_PATH to contain library. prepend LD_LIBRARY_PATH "$b/gobject/.libs" prepend LD_LIBRARY_PATH "$b/java/.libs" prepend LD_LIBRARY_PATH "$b/lib/.libs" prepend DYLD_LIBRARY_PATH "$b/gobject/.libs" prepend DYLD_LIBRARY_PATH "$b/java/.libs" prepend DYLD_LIBRARY_PATH "$b/lib/.libs" export LD_LIBRARY_PATH export DYLD_LIBRARY_PATH # Make virt-builder use the local website copy to avoid hitting # the network all the time. if [ -z "$XDG_CONFIG_DIRS" ]; then prepend XDG_CONFIG_DIRS "$b/builder/test-website" export XDG_CONFIG_DIRS fi # For Perl. prepend PERL5LIB "$b/perl/blib/arch" prepend PERL5LIB "$b/perl/blib/lib" export PERL5LIB # Enable Perl valgrinding. # XXX Unclear if this actually makes any difference. It seems you # have to recompile the Perl interpreter with debugging enabled. export PERL_DEBUG=1 export PERL_VALGRIND=1 export PERL_DESTRUCT_LEVEL=2 # For Python. export PYTHON="@PYTHON@" prepend PYTHONPATH "$b/python/.libs" prepend PYTHONPATH "$b/python" prepend PYTHONPATH "$s/python" export PYTHONPATH # For Ruby. export RUBY="@RUBY@" export RAKE="@RAKE@" prepend RUBYLIB "$b/ruby/ext/guestfs" prepend RUBYLIB "$b/ruby/lib" export RUBYLIB prepend LD_LIBRARY_PATH "$b/ruby/ext/guestfs" prepend DYLD_LIBRARY_PATH "$b/ruby/ext/guestfs" # For OCaml. prepend CAML_LD_LIBRARY_PATH "$b/ocaml" export CAML_LD_LIBRARY_PATH # For Java. export JAVA_EXE="@JAVA_EXE@" prepend CLASSPATH "$b/java/libguestfs-@VERSION@.jar" prepend CLASSPATH "$b/java/t" prepend CLASSPATH "$b/java" export CLASSPATH # For Erlang (note $PATH is adjusted above to include erl-guestfs). prepend ERL_LIBS "$b/erlang" export ERL_LIBS # For Lua. export LUA="@LUA@" # Can't use 'prepend' here because Lua paths use semicolons. if [ -z "$LUA_CPATH" ]; then LUA_CPATH="$b/lua/?.so" else LUA_CPATH="$b/lua/?.so;$LUA_CPATH" fi export LUA_CPATH # For golang. export GOLANG="@GOLANG@" if [ -z "$CGO_CFLAGS" ]; then CGO_CFLAGS="-I$s/include" else CGO_CFLAGS="$CGO_CFLAGS -I$s/include" fi export CGO_CFLAGS if [ -z "$CGO_CFLAGS_ALLOW" ]; then CGO_CFLAGS_ALLOW='-UGUESTFS_NO_DEPRECATED' export CGO_CFLAGS_ALLOW else echo "Warning: CGO_CFLAGS_ALLOW already defined! Be sure to include" echo "the -U option." fi if [ -z "$CGO_LDFLAGS" ]; then CGO_LDFLAGS="-L$b/lib/.libs" else CGO_LDFLAGS="$CGO_LDFLAGS -L$b/lib/.libs" fi export CGO_LDFLAGS # For rust export RUST="@RUST@" export CARGO="@CARGO@" if [ -z "$RUSTFLAGS" ]; then RUSTFLAGS="-C link-args=-L$b/lib/.libs" else RUSTFLAGS="$RUSTFLAGS -C link-args=-L$b/lib/.libs" fi export RUSTFLAGS # For GObject, Javascript and friends. export GJS="@GJS@" prepend GI_TYPELIB_PATH "$b/gobject" 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 # Allow dependent packages like virt-v2v to be compiled against # local libguestfs. prepend PKG_CONFIG_PATH "$b/lib/local" export PKG_CONFIG_PATH prepend OCAMLPATH "$b/ocaml" export OCAMLPATH # 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 "$timeout_mode" ]; then exec $libtool "$@" fi # For tests (./run --test): # - timeout if the test takes too long to run # Originally 1h, but that is not long enough to run the C API # tests on Koji. timeout_period=4h timeout_kill=30s # Must use the --foreground option (RHBZ#1025269). if timeout --foreground 2 sleep 0 >/dev/null 2>&1; then # Does this version of timeout have the -k option? (Not on RHEL 6) if timeout -k 10s 10s true >/dev/null 2>&1; then timeout="timeout --foreground -k $timeout_kill $timeout_period" fi fi $timeout $libtool "$@" fail=$? if [ "$fail" -eq 0 ]; then # Test successful. : elif [ "$fail" -eq 77 ]; then # Tests return 77 to mean skipped. : elif [ "$fail" -eq 124 ]; then # Timed out. echo "$b/run: command timed out after $timeout_period" else # Test failed. echo "$b/run: command failed with exit code $fail" fi exit $fail