mirror of
https://github.com/status-im/nim-workplace.git
synced 2025-02-16 13:26:26 +00:00
Automate the installation of Nim and Nimble
This commit is contained in:
parent
55f8d4dc61
commit
7ea680b3ae
16
.envrc
Executable file
16
.envrc
Executable 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
3
.gitignore
vendored
@ -4,3 +4,6 @@
|
||||
# Ignore the maintained Nimble develop file
|
||||
nimble.develop
|
||||
|
||||
# Track changes in the scripts folder
|
||||
!scripts/
|
||||
|
||||
|
@ -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
165
scripts/rebuild-nim
Executable 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
|
Loading…
x
Reference in New Issue
Block a user