Automate the installation of Nim and Nimble

This commit is contained in:
Zahary Karadjov 2021-12-21 18:47:27 +02:00
parent 55f8d4dc61
commit 7ea680b3ae
No known key found for this signature in database
GPG Key ID: C8936F8A3073D609
4 changed files with 192 additions and 0 deletions

16
.envrc Executable file
View File

@ -0,0 +1,16 @@
#!/usr/bin/env bash
export NIM_REPO="https://github.com/status-im/Nim"
export NIMBLE_REPO="https://github.com/nim-lang/nimble"
if [[ -z "${NIM_COMMIT}" ]]; then
export NIM_COMMIT="727c6378d2464090564dbcd9bc8b9ac648467e38" # v1.6.0
fi
if [[ -z "${NIMBLE_COMMIT}" ]]; then
export NIMBLE_COMMIT="26c9102c84c6b278985cedce79d6b8982361cb81" # latest (2021-12-16)
fi
source ./scripts/rebuild-nim
export PATH="$(pwd)/${NIM_DIR}/bin:$(pwd)/scripts:${PATH}"

3
.gitignore vendored
View File

@ -4,3 +4,6 @@
# Ignore the maintained Nimble develop file
nimble.develop
# Track changes in the scripts folder
!scripts/

View File

@ -2,6 +2,14 @@
A Nimble-based environment for working on one or more Status Nim projects.
## Pre-requisites
The scripts in this repo will automatically manage your Nim and Nimble versions.
To enable the automation, please install `direnv` from your distro's package
manager or by following the instructions here:
https://github.com/direnv/direnv
## Commands
### `./add-project <project-name>`

165
scripts/rebuild-nim Executable file
View File

@ -0,0 +1,165 @@
#!/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