summaryrefslogtreecommitdiff
path: root/upgrade
blob: 26d9fa250a4ccd88458861eaeb0270b19978e497 (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
130
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"