#! /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 () # { 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