diff options
Diffstat (limited to 'upgrade')
-rwxr-xr-x | upgrade | 131 |
1 files changed, 131 insertions, 0 deletions
@@ -0,0 +1,131 @@ +#! /usr/bin/env bash + +# Upgrade remote packages in a bdep-managed build2 toolchain build, +# essentially as if by executing: +# +# bdep sync -fur && b +# +# In each project of the toolchain. +# +# Note that we can't just do that because as soon as we drop some dependency +# package, the tools (b, bppg, etc) become non-runnable (missing shared +# libraries, etc). +# +# Note also that this script expects the build system (build2) and the rest of +# the toolchain (bpkg, bdep, etc) to be built in separate build configuration +# (for example, tsan for build2 and asan for the rest). +# +# Finally, this script only upgrades the default configurations. To upgrade +# the rest you can use the normal way, for example: +# +# bdep sync -fura +# +# If the -c option is specified, then the second configuration is upgraded +# and configured but is not updated. This can be done at a later stage by +# running the build system in the configuration directory: +# +# BDEP_SYNC=0 b +# +trap "exit 1" ERR +set -o errtrace # Trap in functions. + +function info () { echo "$*" 1>&2; } +function error () { info "$*"; exit 1; } + +# Make sure the build2 tools are runnable. +# +b --version >/dev/null +bpkg --version >/dev/null +bdep --version >/dev/null + +configure_only= + +while [ $# -gt 0 ]; do + case $1 in + -c) + configure_only=--configure-only + shift + ;; + *) + error "unexpected $1" + ;; + esac +done + +# Get the configuration directories. +# +bcfg="$(b info: build2/ | sed -n -re 's/^out_root: (.+)$/\1/p')" +pcfg="$(b info: bpkg/ | sed -n -re 's/^out_root: (.+)$/\1/p')" + +if [ -z "$bcfg" -o -z "$pcfg" ]; then + error "unable to determine build configuration directories" +fi + +bcfg="$(dirname "$bcfg")" +pcfg="$(dirname "$pcfg")" + +if [ "$bcfg" = "$pcfg" ]; then + error "build2 and bpkg build configuration directories are the same" +fi + +# The plan is as follows: +# +# 0. First, make backup copies of both configurations. If something goes wrong, +# it's likely the tools will be left in a non-runnable state. +# +# 1. Next, install the build system on the side and then upgrade the build +# system configuration using that plus the existing bpkg/bdep. +# +# 2. Finally, upgrade the rest. Note that we only have one shot at this since +# we are running bpkg that is being upgraded. +# + +# Step 0. +# +if test -e "$bcfg.bak"; then + error "$bcfg.bak already exist" +fi + +if test -e "$pcfg.bak"; then + error "$pcfg.bak already exist" +fi + +set -x + +cp -rp "$bcfg" "$bcfg.bak" +cp -rp "$pcfg" "$pcfg.bak" + +# Step 1. +# +bpkg install -d "$bcfg" \ + config.install.root=/tmp/build2-install \ + config.bin.rpath=/tmp/build2-install/lib \ + build2 + +/tmp/build2-install/bin/b --version >/dev/null + +bpkg fetch -d "$bcfg" +BDEP_SYNC=0 bpkg build -d "$bcfg" --build /tmp/build2-install/bin/b --keep-out -ur + +b --version >/dev/null + +b build2/ # Should be a noop. + +rm -rf /tmp/build2-install + +# Step 2. +# +bpkg fetch -d "$pcfg" +BDEP_SYNC=0 bpkg build -d "$pcfg" --keep-out -ur "$configure_only" + +if [ -z "$configure_only" ]; then + + bpkg --version >/dev/null + bdep --version >/dev/null + + b bpkg/ bdep/ # Should be a noop. + +fi + +rm -rf "$bcfg.bak" +rm -rf "$pcfg.bak" |