mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-28 08:54:53 +00:00
148 lines
4.6 KiB
Bash
148 lines
4.6 KiB
Bash
# Utilities used in CI pipelines and tooling to avoid duplication.
|
|
# Avoid top-level statements.
|
|
# Prefer nim scripts whenever possible.
|
|
# functions starting with `_` are considered internal, less stable.
|
|
|
|
echo_run () {
|
|
# echo's a command before running it, which helps understanding logs
|
|
echo ""
|
|
echo "cmd: $@" # in azure we could also use this: echo '##[section]"$@"'
|
|
"$@"
|
|
}
|
|
|
|
nimGetLastCommit() {
|
|
git log --no-merges -1 --pretty=format:"%s"
|
|
}
|
|
|
|
nimIsCiSkip(){
|
|
# D20210329T004830:here refs https://github.com/microsoft/azure-pipelines-agent/issues/2944
|
|
# `--no-merges` is needed to avoid merge commits which occur for PR's.
|
|
# $(Build.SourceVersionMessage) is not helpful
|
|
# nor is `github.event.head_commit.message` for github actions.
|
|
# Note: `[skip ci]` is now handled automatically for github actions, see https://github.blog/changelog/2021-02-08-github-actions-skip-pull-request-and-push-workflows-with-skip-ci/
|
|
commitMsg=$(nimGetLastCommit)
|
|
echo commitMsg: "$commitMsg"
|
|
if [[ $commitMsg == *"[skip ci]"* ]]; then
|
|
echo "skipci: true"
|
|
return 0
|
|
else
|
|
echo "skipci: false"
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
nimInternalInstallDepsWindows(){
|
|
echo_run mkdir dist
|
|
echo_run curl -L https://nim-lang.org/download/mingw64.7z -o dist/mingw64.7z
|
|
echo_run curl -L https://nim-lang.org/download/dlls.zip -o dist/dlls.zip
|
|
echo_run 7z x dist/mingw64.7z -odist
|
|
echo_run 7z x dist/dlls.zip -obin
|
|
}
|
|
|
|
nimInternalBuildKochAndRunCI(){
|
|
echo_run nim c koch
|
|
if ! echo_run ./koch runCI; then
|
|
echo_run echo "runCI failed"
|
|
echo_run nim r tools/ci_testresults.nim
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
nimDefineVars(){
|
|
. config/build_config.txt
|
|
nim_csources=bin/nim_csources_$nim_csourcesHash
|
|
}
|
|
|
|
_nimNumCpu(){
|
|
# linux: $(nproc)
|
|
# FreeBSD | macOS: $(sysctl -n hw.ncpu)
|
|
# OpenBSD: $(sysctl -n hw.ncpuonline)
|
|
# windows: $NUMBER_OF_PROCESSORS ?
|
|
if env | grep -q '^NIMCORES='; then
|
|
echo $NIMCORES
|
|
else
|
|
echo $(nproc 2>/dev/null || sysctl -n hw.logicalcpu 2>/dev/null || getconf _NPROCESSORS_ONLN 2>/dev/null || 1)
|
|
fi
|
|
}
|
|
|
|
_nimBuildCsourcesIfNeeded(){
|
|
# if some systems cannot use make or gmake, we could add support for calling `build.sh`
|
|
# but this is slower (not parallel jobs) and would require making build.sh
|
|
# understand the arguments passed to the makefile (e.g. `CC=gcc ucpu=amd64 uos=darwin`),
|
|
# instead of `--cpu amd64 --os darwin`.
|
|
unamestr=$(uname)
|
|
# uname values: https://en.wikipedia.org/wiki/Uname
|
|
if [ "$unamestr" = 'FreeBSD' ]; then
|
|
makeX=gmake
|
|
elif [ "$unamestr" = 'OpenBSD' ]; then
|
|
makeX=gmake
|
|
elif [ "$unamestr" = 'NetBSD' ]; then
|
|
makeX=gmake
|
|
elif [ "$unamestr" = 'CROSSOS' ]; then
|
|
makeX=gmake
|
|
elif [ "$unamestr" = 'SunOS' ]; then
|
|
makeX=gmake
|
|
else
|
|
makeX=make
|
|
fi
|
|
nCPU=$(_nimNumCpu)
|
|
echo_run which $makeX
|
|
# parallel jobs (5X faster on 16 cores: 10s instead of 50s)
|
|
echo_run $makeX -C $nim_csourcesDir -j $((nCPU + 2)) -l $nCPU "$@"
|
|
# keep $nim_csources in case needed to investigate bootstrap issues
|
|
# without having to rebuild
|
|
echo_run cp bin/nim $nim_csources
|
|
}
|
|
|
|
nimCiSystemInfo(){
|
|
nimDefineVars
|
|
echo_run eval echo '$'nim_csources
|
|
echo_run pwd
|
|
echo_run date
|
|
echo_run uname -a
|
|
echo_run git log --no-merges -1 --pretty=oneline
|
|
echo_run eval echo '$'PATH
|
|
echo_run gcc -v
|
|
echo_run node -v
|
|
echo_run make -v
|
|
}
|
|
|
|
nimCsourcesHash(){
|
|
nimDefineVars
|
|
echo $nim_csourcesHash
|
|
}
|
|
|
|
nimBuildCsourcesIfNeeded(){
|
|
# goal: allow cachine each tagged version independently
|
|
# to avoid rebuilding, so that tools like `git bisect`
|
|
# can grab a cached past version without rebuilding.
|
|
nimDefineVars
|
|
(
|
|
set -e
|
|
# avoid polluting caller scope with internal variable definitions.
|
|
if test -f "$nim_csources"; then
|
|
echo "$nim_csources exists."
|
|
else
|
|
if test -d "$nim_csourcesDir"; then
|
|
echo "$nim_csourcesDir exists."
|
|
else
|
|
# Note: using git tags would allow fetching just what's needed, unlike git hashes, e.g.
|
|
# via `git clone -q --depth 1 --branch $tag $nim_csourcesUrl`.
|
|
echo_run git clone -q --depth 1 -b $nim_csourcesBranch \
|
|
$nim_csourcesUrl "$nim_csourcesDir"
|
|
# old `git` versions don't support -C option, using `cd` explicitly:
|
|
echo_run cd "$nim_csourcesDir"
|
|
echo_run git checkout $nim_csourcesHash
|
|
echo_run cd "$OLDPWD"
|
|
# if needed we could also add: `git reset --hard $nim_csourcesHash`
|
|
fi
|
|
_nimBuildCsourcesIfNeeded "$@"
|
|
fi
|
|
|
|
echo_run rm -f bin/nim
|
|
# fixes bug #17913, but it's unclear why it's needed, maybe specific to MacOS Big Sur 11.3 on M1 arch?
|
|
echo_run cp $nim_csources bin/nim
|
|
echo_run $nim_csources -v
|
|
)
|
|
}
|