summaryrefslogtreecommitdiff
path: root/bootstrap
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2020-03-24 07:58:19 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2020-03-24 07:58:19 +0200
commit3cb35ef6f58f9d0f850c50832aae605ba1f70ca1 (patch)
tree61b68891c0e2cd8778925580b97629245bec0bc8 /bootstrap
parent5b2535524e6b939ee314e029d90bc7cc44dd9981 (diff)
Add script for bootstrapping build2 development environment
Diffstat (limited to 'bootstrap')
-rwxr-xr-xbootstrap250
1 files changed, 250 insertions, 0 deletions
diff --git a/bootstrap b/bootstrap
new file mode 100755
index 0000000..0458945
--- /dev/null
+++ b/bootstrap
@@ -0,0 +1,250 @@
+#! /usr/bin/env bash
+
+# @@ Do we really want to require PDF doc generation? This will unlikely
+# work anywhere except Linux. Maybe we should only distribute .xhtml
+# and only generate PDFs for web publishing? Maybe decide when moving
+# to ad hoc rules?
+
+# Boostrap the build2 development environment.
+#
+# Note that this script runs git-update-index commands specified in the
+# README-GIT files of cloned repositories.
+#
+# This script assumes the following steps have been performed:
+#
+# 1. The latest staged toolchain has been temporarily installed somewhere
+# other than /usr/local (e.g., /tmp/build2) and is in PATH.
+#
+# 2. The CLI and ODB compilers have been built and are either installed (if
+# you don't plan to contribute to them) or symlinked in /usr/local/bin/.
+# For the latter case it would typically go to ~/work/{cli,odb/}, for
+# example (for CLI; note: remove sanitizers for ODB):
+#
+# NOTE: clone using the git.codesynthesis.com:/var/scm/cli/cli.git SSH
+# URL for rw access.
+#
+# mkdir -p ~/work/cli
+# cd ~/work/cli
+# git clone --recursive https://git.codesynthesis.com/cli/cli.git
+# cd cli
+# bdep init -C ../builds/gccN-asan @gccN-asan cc \
+# config.cxx=g++-N \
+# config.cc.coptions="-Wall -Wextra -Werror -g3 -fsanitize=address -fsanitize=undefined -fno-omit-frame-pointer"
+# b
+# sudo ln -s "$(pwd)/cli/cli /usr/local/bin/cli"
+# which cli
+# cli --version
+#
+# Once this is done, you should be able to:
+#
+# mkdir -p ~/work/build2
+# cd ~/work/build2
+# git clone --recursive https://git.build2.org/etc.git
+# PATH="/tmp/build2/bin:$PATH" etc/bootstrap
+#
+# NOTE: use the git.build2.org:/var/scm/etc.git SSH URL and pass the
+# --ssh bootstrap option for rw access.
+#
+# After a successful bootstrap you can remove the staged toolchain.
+#
+# Options:
+#
+# --ssh
+# Use SSH URL for cloning (rw access).
+#
+# --no-symlink
+# Do not create executable symlinks in /usr/local/bin/.
+#
+# --no-clone
+# Do not clone the repositories or build the bootstrap build system
+# (b-boot) assuming this has already been done. This option is primarily
+# useful for initializing additional configurations (e.g., Clang in
+# addition to GCC).
+#
+# --cxx
+# --cfg
+# C++ compiler to use and the corresponding build configuration name, for
+# example, g++-9/gcc9 or clang++-8/clang8; g++/gcc by default.
+#
+owd="$(pwd)"
+trap "{ cd '$owd'; exit 1; }" ERR
+set -o errtrace # Trap in functions.
+
+function info () { echo "$*" 1>&2; }
+function error () { info "$*"; exit 1; }
+
+# Run a command with tracing (similar to set -x).
+#
+# Note that this function will execute a command with arguments that contain
+# spaces but it will not print them as quoted (and neither does set -x).
+#
+function run ()
+{
+ echo "+ $@" 1>&2
+ "$@"
+}
+
+# Make sure the necessary tools are runnable.
+#
+cli --version >/dev/null
+odb --version >/dev/null
+b --version >/dev/null
+bpkg --version >/dev/null
+bdep --version >/dev/null
+
+url="https://git.build2.org"
+sym=true
+clone=true
+cxx=g++
+cfg=gcc
+
+while [ $# -gt 0 ]; do
+ case $1 in
+ --ssh)
+ url="git.build2.org:/var/scm"
+ shift
+ ;;
+ --no-symlink)
+ sym=
+ shift
+ ;;
+ --no-clone)
+ clone=
+ shift
+ ;;
+ --cxx)
+ shift
+ cxx="$1"
+ shift
+ ;;
+ --cfg)
+ shift
+ cfg="$1"
+ shift
+ ;;
+ *)
+ error "unexpected $1"
+ ;;
+ esac
+done
+
+function git_clone () # <url>
+{
+ local u d l
+
+ u="$1"
+ d="$(basename -s .git "$u")"
+
+ run git clone --recursive "$u"
+
+ # Run git-update-index commands from README-GIT.
+ #
+ if [ -f "$d/README-GIT" ]; then
+ run cd "$d"
+ l=
+ while read l || [ -n "$l" ]; do
+ info "+ $l"
+ eval $l
+ done < <(sed -rn -e 's/^(git update-index .+)/\1/p' README-GIT)
+ run cd -
+ fi
+
+ # Generate documentation (currently and temporarily handled with a script).
+ #
+ if [ -f "$d/doc/cli.sh" ]; then
+ run cd "$d/doc"
+ run ./cli.sh
+ run cd -
+ fi
+}
+
+if [ "$clone" ]; then
+ git_clone "$url/libbutl.git"
+ git_clone "$url/build2.git"
+
+ git_clone "$url/libbpkg.git"
+ git_clone "$url/bpkg.git"
+ git_clone "$url/bdep.git"
+
+ # Build the bootstrap build system (b-boot).
+ #
+ run cd build2
+ run make -f bootstrap.gmake CXX="$cxx" CXXFLAGS=-O3 -j 8
+ run make -f bootstrap.gmake CXX="$cxx" CXXFLAGS=-O3 cleano # Cleanup objs.
+ run build2/b-boot --version
+ run cd -
+fi
+
+# @@ TODO: make build system configuration ASAN/TSAN configurable.
+#
+# ASAN: -g3 -fsanitize=address -fsanitize=undefined -fno-omit-frame-pointer
+# TSAN: -g3 -fsanitize=thread
+
+run mkdir -p builds
+
+# Build system configuration.
+#
+run bpkg create -d "builds/$cfg-asan-bs" cc cli \
+ config.cxx="$cxx" \
+ config.cc.coptions="-Wall -Wextra -Werror -g3 -fsanitize=address -fsanitize=undefined -fno-omit-frame-pointer" \
+ config.cc.loptions="-fuse-ld=gold -Wl,--threads,--thread-count,4" \
+ config.install.root=/tmp/install config.dist.root=/tmp/dist
+
+run bdep init -d libbutl -A "builds/$cfg-asan-bs" "@$cfg-asan-bs" --no-default
+run bdep init -d build2 -A "builds/$cfg-asan-bs" "@$cfg-asan-bs"
+
+run b build2/build2/
+run build2/build2/b --version
+
+# Package manager (and the rest of the toolchain) configuration.
+#
+run bpkg create -d "builds/$cfg-asan-pm" cc cli \
+ config.cxx="$cxx" \
+ config.cc.coptions="-Wall -Wextra -Werror -g3 -fsanitize=address -fsanitize=undefined -fno-omit-frame-pointer" \
+ config.cc.loptions="-fuse-ld=gold -Wl,--threads,--thread-count,4" \
+ config.install.root=/tmp/install config.dist.root=/tmp/dist
+
+run bdep init -d libbutl -A "builds/$cfg-asan-pm" "@$cfg-asan-pm" --default
+run bdep init -d libbpkg -A "builds/$cfg-asan-pm" "@$cfg-asan-pm"
+run bdep init -d bpkg -A "builds/$cfg-asan-pm" "@$cfg-asan-pm"
+run bdep init -d bdep -A "builds/$cfg-asan-pm" "@$cfg-asan-pm"
+
+# Generate database support (currently and temporarily handled with a script).
+#
+# Note: this has to be done after bdep-init since we need the libodb headers.
+# We also have to pre-update version headers.
+#
+run bpkg update -d builds/$cfg-asan-pm libodb
+run b "builds/$cfg-asan-pm/libbutl/libbutl/hxx{version}"
+run b "builds/$cfg-asan-pm/libbpkg/libbpkg/hxx{version}"
+run b "builds/$cfg-asan-pm/bpkg/bpkg/hxx{version common-options}"
+run b "builds/$cfg-asan-pm/bdep/bdep/hxx{version common-options project-options}"
+
+run cd bpkg/bpkg
+run ./odb.sh
+run cd -
+
+run cd bdep/bdep
+run ./odb.sh
+run cd -
+
+run b bpkg/bpkg/ bdep/bdep/
+run bpkg/bpkg/bpkg --version
+run bdep/bdep/bdep --version
+
+# Add symlinks.
+#
+if [ "$sym" ]; then
+ run sudo ln -s "$owd/build2/build2/b" /usr/local/bin/b
+ run sudo ln -s "$owd/build2/build2/b-boot" /usr/local/bin/b-boot
+ run sudo ln -s "$owd/bpkg/bpkg/bpkg" /usr/local/bin/bpkg
+ run sudo ln -s "$owd/bdep/bdep/bdep" /usr/local/bin/bdep
+
+ run export PATH="/usr/local/bin:$PATH"
+ run which b bpkg bdep
+
+ # Re-run update using the bootstrapped toolchain (normally should be a
+ # noop).
+ #
+ run b build2/build2/ bpkg/bpkg/ bdep/bdep/
+fi