summaryrefslogtreecommitdiff
path: root/install
diff options
context:
space:
mode:
Diffstat (limited to 'install')
-rwxr-xr-xinstall241
1 files changed, 241 insertions, 0 deletions
diff --git a/install b/install
new file mode 100755
index 0000000..aa9a6b1
--- /dev/null
+++ b/install
@@ -0,0 +1,241 @@
+#! /usr/bin/env bash
+
+# Test installation of the build2 toolchain distribution. Essentially, this
+# is an automated build2-toolchain/INSTALL.
+#
+# Usage: install [options] <build2-toolchain-archive> <build2-repo>
+#
+# -i <dir>
+# Target installation directory instead of default /tmp/build2-install.
+#
+# -l <dir>
+# Prerequisite library (libodb, libodb-sqlite) installation directory
+# instead of default /usr/local.
+#
+# -s
+# Use sudo when installing.
+#
+# -t
+# Install toolchain only.
+#
+# --cxx <path>
+# C++ compiler to use, g++ by default.
+#
+# --cxxflags <flags>
+# C++ compiler flags to use, -W -Wall -Wno-unknown-pragmas by default.
+#
+# --cppflags <flags>
+# Extra C++ preprocessor flags to use.
+#
+# For example:
+#
+# install /tmp/build2-toolchain-0.1.0.tar.gz http://pkg.cppget.org/1/alpha
+#
+usage="usage: $0 [options] <build2-toolchain-archive> <build2-repo>"
+
+owd=`pwd`
+trap "{ cd $owd; exit 1; }" ERR
+
+function info () { echo "$*" 1>&2; }
+function error () { info "$*"; exit 1; }
+
+tca=
+rep=
+tmp=/tmp
+lib="/usr/local" # Library (libodb, etc) installation directory.
+ins="$tmp/build2-install" # Our installation directory.
+sudo=
+extras=brep # Extras to build.
+extras_show=brep-loader # Extra programs (in bin/) to test with --version.
+pmc="build2-toolchain" # bpkg configuration directory
+cxx="g++"
+cxxflags="-W -Wall -Wno-unknown-pragmas"
+cppflags=
+
+while [ $# -gt 0 ]; do
+ case $1 in
+ -s)
+ sudo=sudo
+ shift
+ ;;
+ -i)
+ shift
+ ins=${1%/}
+ shift
+ ;;
+ -l)
+ shift
+ lib=${1%/}
+ shift
+ ;;
+ -t)
+ extras=
+ shift
+ ;;
+ --cxx)
+ shift
+ cxx=$1
+ shift
+ ;;
+ --cxxflags)
+ shift
+ cxxflags="$1"
+ shift
+ ;;
+ --cppflags)
+ shift
+ cppflags="$1"
+ shift
+ ;;
+ *)
+ if [ -z "$tca" ]; then
+ tca=${1%/}; shift
+ else
+ rep=$1; break
+ fi
+ ;;
+ esac
+done
+
+if [ -z "$tca" ]; then
+ error $usage
+fi
+
+if [ -z "$rep" ]; then
+ error $usage
+fi
+
+cd $tmp
+
+# Download archive if it is an HTTP URL.
+#
+if [[ $tca == http://* ]]; then
+ url=$tca
+ tca=`echo "$url" | sed -e 's%^.*/\(.*\)$%\1%' -`
+ if [ -z "$tca" ]; then
+ error "unable to extract archive name from $url"
+ fi
+ rm -f $tca
+ wget $url
+elif [[ $tca != /* ]]; then
+ tca=$owd/$tca
+fi
+
+if [[ $rep != http://* && $rep != /* ]]; then
+ rep=$owd/$rep
+fi
+
+if [[ $ins != /* ]]; then
+ ins=$owd/$ins
+fi
+
+# Warm sudo up so that the rest of this script can continue unattended.
+#
+if [ "$sudo" ]; then
+ $sudo echo >/dev/null
+fi
+
+tcb=`basename $tca .tar.gz`
+
+# Unpack.
+#
+rm -rf $tcb
+rm -rf $tcb.disabled
+tar xfz $tca
+
+# Bootstrap.
+#
+cd $tcb/build2
+./bootstrap --cxx $cxx --cxxflags "$cxxflags"
+./build/b-boot \
+ config.cxx=$cxx \
+ config.cxx.coptions="$cxxflags" \
+ config.bin.rpath=$ins-boot/lib update
+cd ..
+
+./build2/build/b \
+ config.cxx=$cxx \
+ config.cxx.coptions="$cxxflags" \
+ config.cxx.poptions="$cppflags -I$lib/include" \
+ config.cxx.loptions=-L$lib/lib \
+ config.bin.rpath="$ins-boot/lib $lib/lib" \
+ config.install.root=$ins-boot \
+ config.install.root.sudo=$sudo \
+ configure
+
+./build2/build/b update
+
+$sudo mkdir -p $ins-boot
+$sudo rm -rf $ins-boot/*
+./build2/build/b install
+
+function show () # <dir> <prog>...
+{
+ local d=$1; shift
+ for p in $*; do
+ if [ `which $p` != "$d/bin/$p" ]; then
+ error "wrong $p path: `which $p`"
+ fi
+
+ $p --version 1>&2
+ done
+}
+
+# Disable any rpaths that may still be pointing inside the build directory.
+#
+cd $tmp
+mv $tcb $tcb.disabled
+
+OLDPATH="$PATH"
+PATH="$ins-boot/bin:$OLDPATH"
+show $ins-boot b bpkg
+
+# Rebuild via the package manager.
+#
+mkdir -p $pmc
+rm -rf $pmc/*
+rm -rf $pmc.disabled
+cd $pmc
+
+bpkg create \
+ cxx \
+ config.cxx=$cxx \
+ config.cxx.coptions="$cxxflags" \
+ config.cxx.poptions="$cppflags -I$lib/include" \
+ config.cxx.loptions=-L$lib/lib \
+ config.bin.rpath="$ins/lib $lib/lib" \
+ config.install.root=$ins \
+ config.install.root.sudo=$sudo \
+
+bpkg add $rep
+bpkg fetch
+bpkg build --yes build2 bpkg
+
+$sudo mkdir -p $ins
+$sudo rm -rf $ins/*
+bpkg install build2 bpkg
+
+cd $tmp
+mv $pmc $pmc.disabled
+
+PATH="$ins/bin:$OLDPATH"
+show $ins b bpkg
+
+mv $pmc.disabled $pmc
+
+# Build extras using the bpkg-built toolchain.
+#
+if [ ! -z "$extras" ]; then
+ cd $pmc
+ bpkg build --yes $extras
+ bpkg install $extras
+ cd $tmp
+
+ mv $pmc $pmc.disabled
+ show $ins $extras_show
+ mv $pmc.disabled $pmc
+fi
+
+mv $tcb.disabled $tcb
+
+cd $owd