#!/usr/bin/env bash # used in Travis CI and AppVeyor scripts # Copyright (c) 2018-2020 Status Research & Development GmbH. Licensed under # either of: # - Apache License, version 2.0 # - MIT license # at your option. This file may not be copied, modified, or distributed except # according to those terms. set -e NIM_COMMIT_HASH="" # full hash for NIM_COMMIT, retrieved in "nim_needs_rebuilding()" NIM_DIR=nim CSOURCES_DIR=nim-csources NIMBLE_DIR=nimble cd "$(dirname "${BASH_SOURCE}")" cd .. ## env vars # verbosity level [ -z "${V}" ] && V=0 [ -z "${CC}" ] && CC="gcc" # to build csources in parallel, set MAKE="make -jN" [ -z "${MAKE}" ] && MAKE="make" # for 32-bit binaries on a 64-bit host UCPU="" [ "${ARCH_OVERRIDE}" = "x86" ] && UCPU="ucpu=i686" [ -z "${NIM_BUILD_MSG}" ] && NIM_BUILD_MSG="Building the Nim compiler (${NIM_COMMIT})" [ -z "${CSOURCES_COMMIT}" ] && CSOURCES_COMMIT=a8a5241f9475099c823cfe1a5e0ca4022ac201ff [ -z "${NIM_REPO}" ] && NIM_REPO="https://github.com/status-im/Nim.git" [ -z "${NIMBLE_REPO}" ] && NIMBLE_REPO="https://github.com/nim-lang/nimble.git" [ -z "${NIM_COMMIT}" ] && { echo "Please specify NIM_COMMIT"; exit 1; } [ -z "${NIMBLE_COMMIT}" ] && { echo "Please specify NIMBLE_COMMIT"; exit 1; } # Windows detection if uname | grep -qiE "mingw|msys"; then ON_WINDOWS=1 EXE_SUFFIX=".exe" # otherwise it fails in AppVeyor due to https://github.com/git-for-windows/git/issues/2495 GIT_TIMESTAMP_ARG="--date=unix" # available since Git 2.9.4 else ON_WINDOWS=0 EXE_SUFFIX="" GIT_TIMESTAMP_ARG="--date=format-local:%s" # available since Git 2.7.0 fi NIM_BINARY="${NIM_DIR}/bin/nim${EXE_SUFFIX}" nim_needs_rebuilding() { REBUILD=0 NO_REBUILD=1 if [ ! -e "${NIM_DIR}" ]; then # Shallow clone, optimised for the default NIM_COMMIT value. git clone -q --depth=1 "${NIM_REPO}" "${NIM_DIR}" fi pushd "${NIM_DIR}" >/dev/null # support old Git versions, like the one from Ubuntu-18.04 git restore . 2>/dev/null || git reset --hard if ! git checkout -q "${NIM_COMMIT}" 2>/dev/null; then # Pay the price for a non-default NIM_COMMIT here, by fetching everything. # (This includes upstream branches and tags that might be missing from our fork.) git remote add upstream https://github.com/nim-lang/Nim git fetch --all git checkout -q "${NIM_COMMIT}" 2>/dev/null fi # In case the local branch diverged and a fast-forward merge is not possible. git fetch || true git reset -q --hard origin/${NIM_COMMIT} 2> /dev/null || true # In case NIM_COMMIT is a local branch that's behind the remote one it's tracking. git pull -q 2>/dev/null || true git checkout -q ${NIM_COMMIT} 2>/dev/null # We can't use "rev-parse" here, because it would return the tag object's # hash instead of the commit hash, when NIM_COMMIT is a tag. NIM_COMMIT_HASH="$(git rev-list -n 1 ${NIM_COMMIT})" popd >/dev/null # compare the last built commit to the one requested if [ -e "${NIM_DIR}/bin/nim_commit_${NIM_COMMIT_HASH}" ]; then # we built the requested commit in the past, so we simply reuse it rm -f "${NIM_DIR}/bin/nim${EXE_SUFFIX}" ln -s "nim_commit_${NIM_COMMIT_HASH}" "${NIM_DIR}/bin/nim${EXE_SUFFIX}" return ${NO_REBUILD} else return ${REBUILD} fi } build_nim() { echo "$NIM_BUILD_MSG" [ $V -eq 0 ] && exec >/dev/null 2>&1 pushd "${NIM_DIR}" # Git repos for csources and Nimble if [ ! -d "${CSOURCES_DIR}" ]; then mkdir -p "${CSOURCES_DIR}" pushd "${CSOURCES_DIR}" git clone https://github.com/nim-lang/csources_v1.git . git checkout $CSOURCES_COMMIT popd fi if [ ! "${CSOURCES_DIR}" = "csources" ]; then rm -rf csources ln -s "${CSOURCES_DIR}" csources fi if [ ! -d "${NIMBLE_DIR}" ]; then mkdir -p "${NIMBLE_DIR}" pushd "${NIMBLE_DIR}" git clone "${NIMBLE_REPO}" . git checkout "${NIMBLE_COMMIT}" # we have to delete .git or koch.nim will checkout a branch tip, overriding our target commit # TODO # This is quite the hack and it breaks the output of `nimble --version` # which prints the Nim revision instead of the Nimble revision. rm -rf .git popd fi mkdir -p dist rm -rf dist/nimble ln -s ../"${NIMBLE_DIR}" dist/nimble # Clean up the new Nimble cache, because the csources build # won't recognize the validity of the packages there: rm -rf ~/.nimble/pkgs2 # bootstrap the Nim compiler and build the tools rm -f bin/nim bin/nim_csources pushd csources if [ ${ON_WINDOWS} -eq 0 ]; then "${MAKE}" ${UCPU} clean "${MAKE}" ${UCPU} LD=${CC} else "${MAKE}" myos=windows ${UCPU} clean "${MAKE}" myos=windows ${UCPU} CC=gcc LD=gcc fi popd if [ -e csources/bin ]; then rm -f bin/nim bin/nim_csources cp -a csources/bin/nim bin/nim cp -a csources/bin/nim bin/nim_csources rm -rf csources/bin else cp -a bin/nim bin/nim_csources fi sed \ -e 's/koch$/--warnings:off --hints:off koch/' \ -e 's/koch boot/koch boot --warnings:off --hints:off/' \ -e '/nimBuildCsourcesIfNeeded/d' \ build_all.sh > build_all_custom.sh sh build_all_custom.sh rm -f build_all_custom.sh # Nimble needs a CA cert rm -f bin/cacertmony.pem curl -LsS -o bin/cacert.pem https://curl.se/ca/cacert.pem || echo "Warning: 'curl' failed to download a CA cert needed by Nimble. Ignoring it." # create the symlink mv bin/nim "bin/nim_commit_${NIM_COMMIT_HASH}" ln -s "nim_commit_${NIM_COMMIT_HASH}" "bin/nim${EXE_SUFFIX}" popd [ $V -eq 0 ] && exec >$(tty) 2>&1 } if nim_needs_rebuilding; then build_nim fi set +e