strategy: maxParallel: 10 matrix: # TODO: Broken by OpenSSL not found for nimble # https://github.com/nim-lang/Nim/blob/bf320ed172f74f60fd274338e82bdc9ce3520dd9/lib/wrappers/openssl.nim#L61 # could not load: (libcrypto-1_1|libeay32).dll # (bad format; library may be wrong architecture) # Windows_devel_32bit: # VM: 'windows-latest' # UCPU: i686 # CHANNEL: devel # TEST_LANG: c Windows_stable_noasm_64bit: VM: 'windows-latest' UCPU: amd64 CHANNEL: stable TEST_LANG: c BACKEND: NO_ASM Windows_cpp_stable_noasm_64bit: VM: 'windows-latest' UCPU: amd64 CHANNEL: stable TEST_LANG: cpp BACKEND: NO_ASM Linux_stable_noasm_64bit: VM: 'ubuntu-18.04' UCPU: amd64 CHANNEL: stable TEST_LANG: c BACKEND: NO_ASM Linux_cpp_stable_noasm_64bit: VM: 'ubuntu-18.04' UCPU: amd64 CHANNEL: stable TEST_LANG: cpp BACKEND: NO_ASM # Deactivated for now, this is cross-compilation and tricky to get right # Linux_devel_32bit: # VM: 'ubuntu-16.04' # UCPU: i686 # CHANNEL: devel # TEST_LANG: c MacOS_stable_noasm_64bit: VM: 'macOS-10.15' UCPU: amd64 CHANNEL: stable TEST_LANG: c BACKEND: NO_ASM # ------------------------------- # No assembly for windows # Windows_devel_64bit: # VM: 'windows-latest' # UCPU: amd64 # CHANNEL: stable # TEST_LANG: c # BACKEND: ASM # Windows_cpp_devel_64bit: # VM: 'windows-latest' # UCPU: amd64 # CHANNEL: stable # TEST_LANG: cpp # BACKEND: ASM Linux_stable_asm_64bit: VM: 'ubuntu-18.04' UCPU: amd64 CHANNEL: stable TEST_LANG: c BACKEND: ASM Linux_cpp_stable_asm_64bit: VM: 'ubuntu-18.04' UCPU: amd64 CHANNEL: stable TEST_LANG: cpp BACKEND: ASM MacOS_stable_asm_64bit: VM: 'macOS-10.15' UCPU: amd64 CHANNEL: stable TEST_LANG: c BACKEND: ASM pool: vmImage: $(VM) steps: - task: CacheBeta@1 displayName: 'cache Nim binaries' inputs: key: NimBinaries | $(Agent.OS) | $(CHANNEL) | $(UCPU) path: NimBinaries - task: CacheBeta@1 displayName: 'cache MinGW-w64' inputs: key: mingwCache | 8_1_0 | $(UCPU) path: mingwCache condition: eq(variables['Agent.OS'], 'Windows_NT') - powershell: | Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem' -Name 'LongPathsEnabled' -Value 1 displayName: 'long path support' condition: eq(variables['Agent.OS'], 'Windows_NT') - bash: | echo "PATH=${PATH}" set -e echo "Installing MinGW-w64" if [[ $UCPU == "i686" ]]; then MINGW_FILE="i686-8.1.0-release-posix-dwarf-rt_v6-rev0.7z" MINGW_URL="https://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win32/Personal%20Builds/mingw-builds/8.1.0/threads-posix/dwarf/${MINGW_FILE}" MINGW_DIR="mingw32" else MINGW_FILE="x86_64-8.1.0-release-posix-seh-rt_v6-rev0.7z" MINGW_URL="https://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/Personal%20Builds/mingw-builds/8.1.0/threads-posix/seh/${MINGW_FILE}" MINGW_DIR="mingw64" fi mkdir -p mingwCache pushd mingwCache if [[ ! -e "$MINGW_FILE" ]]; then rm -f *.7z curl -OLsS "$MINGW_URL" fi 7z x -y -bd "$MINGW_FILE" >/dev/null mkdir -p /c/custom mv "$MINGW_DIR" /c/custom/ popd # Workaround https://developercommunity.visualstudio.com/content/problem/891929/windows-2019-cygheap-base-mismatch-detected-git-ba.html echo "##vso[task.prependpath]/usr/bin" echo "##vso[task.prependpath]/mingw64/bin" echo "##vso[task.setvariable variable=MINGW_DIR;]$MINGW_DIR" displayName: 'Install dependencies (Windows)' condition: eq(variables['Agent.OS'], 'Windows_NT') - powershell: | # export custom mingw PATH to other tasks echo "##vso[task.prependpath]c:\custom\$(MINGW_DIR)\bin" displayName: 'Mingw PATH (Windows)' condition: eq(variables['Agent.OS'], 'Windows_NT') - bash: | echo "PATH=${PATH}" export ncpu= case '$(Agent.OS)' in 'Linux') ncpu=$(nproc) ;; 'Darwin') ncpu=$(sysctl -n hw.ncpu) ;; 'Windows_NT') ncpu=$NUMBER_OF_PROCESSORS ;; esac [[ -z "$ncpu" || $ncpu -le 0 ]] && ncpu=1 echo "Found ${ncpu} cores" echo "##vso[task.setvariable variable=ncpu;]$ncpu" displayName: 'Detecting number of cores' - bash: | sudo dpkg --add-architecture i386 sudo apt-fast update -qq # `:i386` (e.g. in `libffi-dev:i386`) is needed otherwise you may get: # `could not load: libffi.so` during dynamic loading. DEBIAN_FRONTEND='noninteractive' \ sudo apt-fast install --no-install-recommends --allow-downgrades -yq \ g++-multilib gcc-multilib libcurl4-openssl-dev:i386 libgc-dev:i386 \ libffi-dev:i386 mkdir -p bin cat << EOF > bin/gcc #!/bin/bash exec $(which gcc) -m32 "\$@" EOF cat << EOF > bin/g++ #!/bin/bash exec $(which g++) -m32 "\$@" EOF chmod 755 bin/gcc chmod 755 bin/g++ # Add to path echo '##vso[task.prependpath]$(System.DefaultWorkingDirectory)/bin' displayName: 'Install dependencies (i386 Linux)' condition: and(eq(variables['Agent.OS'], 'Linux'), eq(variables['UCPU'], 'i686')) - bash: | echo "PATH=${PATH}" gcc -v export ucpu=${UCPU} if [ "${CHANNEL}" = stable ]; then BRANCH="v$(curl https://nim-lang.org/channels/stable)" else BRANCH="${CHANNEL}" fi mkdir -p NimBinaries pushd NimBinaries if [ ! -x "nim-${CHANNEL}/bin/nim" ]; then git clone -b "${BRANCH}" https://github.com/nim-lang/nim "nim-${CHANNEL}/" pushd "nim-${CHANNEL}" git clone --depth 1 https://github.com/nim-lang/csources csources/ pushd csources make -j $ncpu ucpu=${UCPU} CC=gcc popd rm -rf csources bin/nim c koch ./koch boot -d:release ./koch tools else pushd "nim-${CHANNEL}" git fetch origin "${BRANCH}" if [[ $(git merge FETCH_HEAD | grep -c "Already up to date.") -ne 1 ]]; then bin/nim c koch ./koch boot -d:release ./koch tools fi fi popd # exit nim-${CHANNEL} popd # exit NimBinaries displayName: 'Building Nim' # https://forum.nim-lang.org/t/7494 - powershell: | bitsadmin.exe /rawreturn /transfer "cURL-certicates" /priority FOREGROUND https://curl.se/ca/cacert.pem $pwd\NimBinaries\nim-$(CHANNEL)\bin\cacert.pem displayName: 'cURL certificates (Windows)' condition: eq(variables['Agent.OS'], 'Windows_NT') - powershell: | echo "##vso[task.prependpath]$pwd\NimBinaries\nim-$(CHANNEL)\bin" displayName: 'Set env variable (Windows)' condition: eq(variables['Agent.OS'], 'Windows_NT') - bash: | echo "##vso[task.prependpath]$PWD/NimBinaries/nim-${CHANNEL}/bin" displayName: 'Set env variable (Posix)' condition: ne(variables['Agent.OS'], 'Windows_NT') # GMP is preinstalled on Azure # - bash: | # echo "PATH=${PATH}" # sudo apt-get install libgmp-dev # displayName: 'Downloading GMP (Linux)' # condition: eq(variables['Agent.OS'], 'Linux') # # - bash: | # echo "PATH=${PATH}" # brew install gmp # displayName: 'Downloading GMP (MacOS)' # condition: eq(variables['Agent.OS'], 'Darwin') - bash: | echo "PATH=${PATH}" sudo apt-get install libgmp-dev displayName: 'Downloading GMP (Linux 32-bit)' condition: and(eq(variables['Agent.OS'], 'Linux'), eq(variables['UCPU'], 'i686')) # Workaround #113 and https://github.com/status-im/nim-serialization/issues/33 # and nimble flaky pinning / dependency resolution, # json_serialization install would override nim-serialization pinning - bash: | echo "PATH=${PATH}" nimble refresh nimble install -y gmp jsony displayName: 'Installing package and testing dependencies' - bash: | echo "PATH=${PATH}" export ucpu=${UCPU} nimble test_parallel displayName: 'Testing Constantine with Assembler and with GMP' condition: and(ne(variables['Agent.OS'], 'Windows_NT'), eq(variables['BACKEND'], 'ASM')) - bash: | echo "PATH=${PATH}" export ucpu=${UCPU} nimble test_parallel_no_assembler displayName: 'Testing Constantine without Assembler and with GMP' condition: and(ne(variables['Agent.OS'], 'Windows_NT'), eq(variables['BACKEND'], 'NO_ASM')) - bash: | echo "PATH=${PATH}" export ucpu=${UCPU} nimble test_no_gmp displayName: 'Testing the package (without GMP and ASM on Windows)' condition: eq(variables['Agent.OS'], 'Windows_NT')