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"
|