mirror of
https://github.com/status-im/nim-workplace.git
synced 2025-02-23 08:38:20 +00:00
166 lines
5.4 KiB
Bash
Executable File
166 lines
5.4 KiB
Bash
Executable File
#!/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
|
|
rm -rf .git
|
|
popd
|
|
fi
|
|
|
|
mkdir -p dist
|
|
rm -rf dist/nimble
|
|
ln -s ../"${NIMBLE_DIR}" dist/nimble
|
|
|
|
# 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
|
|
}
|
|
|
|
if nim_needs_rebuilding; then
|
|
build_nim
|
|
fi
|