mirror of https://gitee.com/openkylin/libvirt.git
209 lines
5.8 KiB
Bash
Executable File
209 lines
5.8 KiB
Bash
Executable File
#!/bin/sh
|
|
# Run this to generate all the initial makefiles, etc.
|
|
|
|
die()
|
|
{
|
|
echo "error: $1" >&2
|
|
exit 1
|
|
}
|
|
|
|
starting_point=$(pwd)
|
|
|
|
srcdir=$(dirname "$0")
|
|
test "$srcdir" || srcdir=.
|
|
|
|
cd "$srcdir" || {
|
|
die "Failed to cd into $srcdir"
|
|
}
|
|
|
|
test -f src/libvirt.c || {
|
|
die "$0 must live in the top-level libvirt directory"
|
|
}
|
|
|
|
dry_run=
|
|
no_git=
|
|
gnulib_srcdir=
|
|
extra_args=
|
|
while test "$#" -gt 0; do
|
|
case "$1" in
|
|
--dry-run)
|
|
# This variable will serve both as an indicator of the fact that
|
|
# a dry run has been requested, and to store the result of the
|
|
# dry run. It will be ultimately used as return code for the
|
|
# script: 0 means no action is necessary, 2 means that autogen.sh
|
|
# needs to be executed, and 1 is reserved for failures
|
|
dry_run=0
|
|
shift
|
|
;;
|
|
--no-git)
|
|
no_git=" $1"
|
|
shift
|
|
;;
|
|
--gnulib-srcdir=*)
|
|
gnulib_srcdir=" $1"
|
|
shift
|
|
;;
|
|
--gnulib-srcdir)
|
|
gnulib_srcdir=" $1=$2"
|
|
shift
|
|
shift
|
|
;;
|
|
--system)
|
|
prefix=/usr
|
|
sysconfdir=/etc
|
|
localstatedir=/var
|
|
if test -d $prefix/lib64; then
|
|
libdir=$prefix/lib64
|
|
else
|
|
libdir=$prefix/lib
|
|
fi
|
|
extra_args="--prefix=$prefix --localstatedir=$localstatedir"
|
|
extra_args="$extra_args --sysconfdir=$sysconfdir --libdir=$libdir"
|
|
shift
|
|
;;
|
|
*)
|
|
# All remaining arguments will be passed to configure verbatim
|
|
break
|
|
;;
|
|
esac
|
|
done
|
|
no_git="$no_git$gnulib_srcdir"
|
|
|
|
gnulib_hash()
|
|
{
|
|
local no_git=$1
|
|
|
|
if test "$no_git"; then
|
|
echo "no-git"
|
|
return
|
|
fi
|
|
|
|
# Compute the hash we'll use to determine whether rerunning bootstrap
|
|
# is required. The first is just the SHA1 that selects a gnulib snapshot.
|
|
# The second ensures that whenever we change the set of gnulib modules used
|
|
# by this package, we rerun bootstrap to pull in the matching set of files.
|
|
# The third ensures that whenever we change the set of local gnulib diffs,
|
|
# we rerun bootstrap to pull in those diffs.
|
|
git submodule status .gnulib | awk '{ print $1 }'
|
|
git hash-object bootstrap.conf
|
|
git ls-tree -d HEAD gnulib/local | awk '{ print $3 }'
|
|
}
|
|
|
|
# Only look into git submodules if we're in a git checkout
|
|
if test -d .git || test -f .git; then
|
|
|
|
# Check for dirty submodules
|
|
if test -z "$CLEAN_SUBMODULE"; then
|
|
for path in $(git submodule status | awk '{ print $2 }'); do
|
|
case "$(git diff "$path")" in
|
|
*-dirty*)
|
|
echo "error: $path is dirty, please investigate" >&2
|
|
echo "set CLEAN_SUBMODULE to discard submodule changes" >&2
|
|
exit 1
|
|
;;
|
|
esac
|
|
done
|
|
fi
|
|
if test "$CLEAN_SUBMODULE" && test -z "$no_git"; then
|
|
if test -z "$dry_run"; then
|
|
echo "Cleaning up submodules..."
|
|
git submodule foreach 'git clean -dfqx && git reset --hard' || {
|
|
die "Cleaning up submodules failed"
|
|
}
|
|
fi
|
|
fi
|
|
|
|
# Update all submodules. If any of the submodules has not been
|
|
# initialized yet, it will be initialized now; moreover, any submodule
|
|
# with uncommitted changes will be returned to the expected state
|
|
echo "Updating submodules..."
|
|
git submodule update --init || {
|
|
die "Updating submodules failed"
|
|
}
|
|
|
|
# The expected hash, eg. the one computed after the last
|
|
# successful bootstrap run, is stored on disk
|
|
state_file=.git-module-status
|
|
expected_hash=$(cat "$state_file" 2>/dev/null)
|
|
actual_hash=$(gnulib_hash "$no_git")
|
|
|
|
if test "$actual_hash" = "$expected_hash"; then
|
|
# The gnulib hash matches our expectations, and all the files
|
|
# that can only be generated through bootstrap are present:
|
|
# we just need to run autoreconf. Unless we're performing a
|
|
# dry run, of course...
|
|
if test -z "$dry_run"; then
|
|
echo "Running autoreconf..."
|
|
autoreconf -v || {
|
|
die "autoreconf failed"
|
|
}
|
|
fi
|
|
else
|
|
# Whenever the gnulib submodule or any of the related bits
|
|
# has been changed in some way (see gnulib_hash) we need to
|
|
# run bootstrap again. If we're performing a dry run, we
|
|
# change the return code instead to signal our caller
|
|
if test "$dry_run"; then
|
|
dry_run=2
|
|
else
|
|
echo "Running bootstrap..."
|
|
./bootstrap$no_git || {
|
|
die "bootstrap failed"
|
|
}
|
|
gnulib_hash >"$state_file"
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
# When performing a dry run, we can stop here
|
|
test "$dry_run" && exit "$dry_run"
|
|
|
|
# If asked not to run configure, we can stop here
|
|
test "$NOCONFIGURE" && exit 0
|
|
|
|
cd "$starting_point" || {
|
|
die "Failed to cd into $starting_point"
|
|
}
|
|
|
|
if test "$OBJ_DIR"; then
|
|
mkdir -p "$OBJ_DIR" || {
|
|
die "Failed to create $OBJ_DIR"
|
|
}
|
|
cd "$OBJ_DIR" || {
|
|
die "Failed to cd into $OBJ_DIR"
|
|
}
|
|
fi
|
|
|
|
# Make sure we can find GNU make and tell the user
|
|
# the right command to run
|
|
MAKE=
|
|
for cmd in make gmake; do
|
|
if $cmd -v 2>&1 | grep -q "GNU Make"; then
|
|
MAKE=$cmd
|
|
break
|
|
fi
|
|
done
|
|
test "$MAKE" || {
|
|
die "GNU make is required to build libvirt"
|
|
}
|
|
|
|
if test -z "$*" && test -z "$extra_args" && test -f config.status; then
|
|
echo "Running config.status..."
|
|
./config.status --recheck || {
|
|
die "config.status failed"
|
|
}
|
|
else
|
|
if test -z "$*" && test -z "$extra_args"; then
|
|
echo "I am going to run configure with no arguments - if you wish"
|
|
echo "to pass any to it, please specify them on the $0 command line."
|
|
else
|
|
echo "Running configure with $extra_args $@"
|
|
fi
|
|
"$srcdir/configure" $extra_args "$@" || {
|
|
die "configure failed"
|
|
}
|
|
fi
|
|
|
|
echo
|
|
echo "Now type '$MAKE' to compile libvirt."
|