123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 |
- # 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
- )
- }
|