diff --git a/bootstrap.sh b/bootstrap.sh index c591b11e2..5071d7e74 100755 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -1,8 +1,5 @@ #!/usr/bin/env bash -set -eu -set -o pipefail - : ' todo @@ -11,17 +8,19 @@ todo - shrink icu data ' -MASON_VERSION="v0.17.0" +MASON_VERSION="fde1d9f5" function setup_mason() { if [[ ! -d ./.mason ]]; then - git clone https://github.com/mapbox/mason.git ./.mason - (cd ./.mason && git checkout ${MASON_VERSION}) - else - echo "Updating to latest mason" - (cd ./.mason && git fetch && git checkout ${MASON_VERSION} && git pull origin ${MASON_VERSION}) + git clone https://github.com/mapbox/mason.git .mason || return + elif ! git -C .mason rev-parse -q --verify "$MASON_VERSION" >/dev/null; then + git -C .mason fetch --all || true # non-fatal fi - export PATH=$(pwd)/.mason:$PATH + git -C .mason checkout --detach "$MASON_VERSION" -- || return + case ":$PATH:" in + *":$PWD/.mason:"*) : already there ;; + *) export PATH="$PWD/.mason:$PATH" ;; + esac export CXX=${CXX:-clang++} export CC=${CC:-clang} } @@ -45,7 +44,7 @@ function install() { } ICU_VERSION="57.1" -BOOST_VERSION="1.65.1" +BOOST_VERSION="1.73.0" function install_mason_deps() { install ccache 3.3.1 @@ -60,9 +59,6 @@ function install_mason_deps() { install proj 4.9.3 libproj install pixman 0.34.0 libpixman-1 install cairo 1.14.8 libcairo - install protobuf 3.2.0 - # technically protobuf is not a mapnik core dep, but installing - # here by default helps make mapnik-vector-tile builds easier install webp 0.6.0 libwebp install libgdal 2.1.3 libgdal install boost ${BOOST_VERSION} @@ -133,22 +129,46 @@ function setup_runtime_settings() { echo "export PROJ_LIB=${MASON_LINKED_ABS}/share/proj" > mapnik-settings.env echo "export ICU_DATA=${MASON_LINKED_ABS}/share/icu/${ICU_VERSION}" >> mapnik-settings.env echo "export GDAL_DATA=${MASON_LINKED_ABS}/share/gdal" >> mapnik-settings.env - source mapnik-settings.env +} + +# turn arguments of the form NAME=VALUE into exported variables; +# any other arguments are reported and cause error return status +function export_variables() { + local arg= ret=0 + for arg + do + if [[ "$arg" =~ ^[[:alpha:]][_[:alnum:]]*= ]] + then + export "$arg" + else + printf >&2 "bootstrap.sh: invalid argument: %s\n" "$arg" + ret=1 + fi + done + return $ret } function main() { - setup_mason - install_mason_deps - make_config > ./config.py - setup_runtime_settings - echo "Ready, now run:" - echo "" - echo " ./configure && make" + export_variables "$@" || return + # setup_mason must not run in subshell, because it sets default + # values of CC, CXX and adds mason to PATH, which we want to keep + # when sourced + setup_mason || return + ( + # this is wrapped in subshell to allow sourcing this script + # without having the terminal closed on error + set -eu + set -o pipefail + + install_mason_deps + make_config > ./config.py + setup_runtime_settings + + printf "\n\e[1;32m%s\e[m\n" "bootstrap successful, now run:" + echo "" + echo " ./configure && make" + echo "" + ) } -main - -# allow sourcing of script without -# causing the terminal to bail on error -set +eu -set +o pipefail +main "$@"