#!/bin/sh # set -u function error () { printf >&2 "%s\n\nPlease see README.md for build instructions.\n" "$1"; exit 1; } # ================================================= # = Fallback build directory and signing identity = # ================================================= : ${builddir:=$HOME/build/TextMate} : ${identity:=-} : ${capnp_prefix:=/usr/local} : ${rest_api:=https://api.textmate.org} # ======================= # = Application version = # ======================= ver=$(curl -sf "${rest_api}/releases/nightly/version")${tag:-+git.$(git rev-parse --short HEAD)} # =============================== # = Check if boost is installed = # =============================== if which -s brew && [[ -z "$boostdir" && ! -d /usr/local/include/boost ]]; then boostdir=$(brew --prefix boost)/include/boost fi for dir in "${boostdir:-/usr/include/boost}" /{opt,usr}/local/include/boost ${CPATH//:/ }; do if [[ ! -L "${builddir}/include/boost" && -d "${dir}" ]]; then mkdir -p "${builddir}/include" && ln -fs "${dir}" "${builddir}/include/boost" fi done test -L "${builddir}/include/boost" || error "*** boost not installed." # =========================================== # = Check if google sparsehash is installed = # =========================================== if which -s brew && [[ -z "$sparsedir" && ! -d /usr/local/include/sparsehash ]]; then sparsedir=$(brew --prefix google-sparsehash)/include/sparsehash fi for dir in "${sparsedir:-/usr/include/sparsehash}" /{opt,usr}/local/include/sparsehash/ ; do if [[ ! -L "${builddir}/include/sparsehash" && -d "${dir}" ]]; then mkdir -p "${builddir}/include" && ln -fs "${dir}" "${builddir}/include/sparsehash" fi done test -L "${builddir}/include/sparsehash" || error "*** google sparsehash not installed." # =========================================== # = Check if non-system openssl is intalled = # =========================================== if which -s brew && [[ -z "$libressl_prefix" && ! -d "${libressl_prefix}/include/openssl" ]]; then libressl_prefix=$(brew --prefix libressl) test -d "${libressl_prefix}/include/" || error "*** openssl headers not found." fi if which -s port && [[ -z "$libressl_prefix" && ! -d "${libressl_prefix}/include/openssl" ]]; then libressl_prefix=/opt/local/ test -d "${libressl_prefix}/include/openssl" || error "*** openssl headers not found." fi # =============================================== # = Check if we can use pbzip2 instead of bzip2 = # =============================================== bzip2_flag="-j" if which -s pbzip2; then bzip2_flag="--use-compress-prog=pbzip2" fi # ============================== # = Check various dependencies = # ============================== test -x "${capnp_prefix}/bin/capnp" || error "*** cap’n’proto not installed in ‘${capnp_prefix}’. Set \`capnp_prefix\` if installed elsewhere." for dep in ninja ragel multimarkdown pgrep pkill; do which -s "$dep" || error "*** dependency missing: ‘${dep}’." done # ===================================== # = Generate fixtures and build files = # ===================================== mkdir -p "$builddir/Frameworks/SoftwareUpdate/fixtures" DST=$(cd >/dev/null "$builddir/Frameworks/SoftwareUpdate/fixtures"; pwd) make -C Frameworks/SoftwareUpdate/fixtures bin/gen_build -o build.ninja -C "$builddir" -dAPP_VERSION="$ver" -didentity="$identity" -drest_api="$rest_api" -dbzip2_flag="$bzip2_flag" -dcapnp_prefix="$capnp_prefix" -dlibressl_prefix="$libressl_prefix" target BUNDLES_TBZ=Applications/TextMate/resources/DefaultBundles.tbz test -e "$BUNDLES_TBZ" || builddir="$builddir" bin/create_default_bundles_tbz "$BUNDLES_TBZ"