trigger:
  branches:
    include:
    - 'devel'
    - 'version-*'
pr:
  branches:
    include:
    - '*'

variables:
- name: skipci
  value: false 

jobs:
- job: packages

  timeoutInMinutes: 90 # default `60` led to lots of cancelled jobs; use 0 for unlimited (may be undesirable)

  strategy:
    matrix:
      Linux_amd64:
        vmImage: 'ubuntu-24.04'
        CPU: amd64
      # regularly breaks, refs bug #17325
#       Linux_i386:
#         # on 'ubuntu-16.04' (not supported anymore anyways) it errored with:
#         # g++-multilib : Depends: gcc-multilib (>= 4:5.3.1-1ubuntu1) but it is not going to be installed
#         vmImage: 'ubuntu-18.04'
#         CPU: i386
      OSX_arm64:
        vmImage: 'macos-15'
        CPU: arm64
      OSX_arm64_cpp:
        vmImage: 'macos-15'
        CPU: arm64
        NIM_COMPILE_TO_CPP: true
      Windows_amd64_batch0_3:
        vmImage: 'windows-2025'
        CPU: amd64
        # see also: `NIM_TEST_PACKAGES`
        NIM_TESTAMENT_BATCH: "0_3"
      Windows_amd64_batch1_3:
        vmImage: 'windows-2025'
        CPU: amd64
        NIM_TESTAMENT_BATCH: "1_3"
      Windows_amd64_batch2_3:
        vmImage: 'windows-2025'
        CPU: amd64
        NIM_TESTAMENT_BATCH: "2_3"

  pool:
    vmImage: $(vmImage)

  workspace:
    clean: all

  steps:
    - bash: git config --global core.autocrlf false
      displayName: 'Disable auto conversion to CRLF by git (Windows-only)'
      condition: and(succeeded(), eq(variables['Agent.OS'], 'Windows_NT'))

    - checkout: self
      fetchDepth: 2 # see D20210329T004830

    - bash: |
        set -e
        . ci/funs.sh
        if nimIsCiSkip; then
          echo '##vso[task.setvariable variable=skipci]true'
        fi
      displayName: 'Check whether to skip CI'

    - task: NodeTool@0
      inputs:
        versionSpec: '20.x'
      displayName: 'Install node.js 20.x'
      condition: and(succeeded(), eq(variables['skipci'], 'false'))

    - bash: |
        set -e
        . ci/funs.sh
        echo_run sudo add-apt-repository universe
        echo_run sudo apt-get update -qq
        DEBIAN_FRONTEND='noninteractive' \
          echo_run sudo apt-get install --no-install-recommends -yq \
            gcc-14 g++-14 libpcre3 liblapack-dev libpcre3 liblapack-dev libcurl4-openssl-dev libgc-dev libsdl1.2-dev libsfml-dev valgrind libc6-dbg
        echo_run sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-14 60 --slave /usr/bin/g++ g++ /usr/bin/g++-14
      displayName: 'Install dependencies (amd64 Linux)'
      condition: and(succeeded(), eq(variables['skipci'], 'false'), eq(variables['Agent.OS'], 'Linux'), eq(variables['CPU'], 'amd64'))

    - bash: |
        set -e
        . ci/funs.sh
        echo_run sudo dpkg --add-architecture i386
        # Downgrade llvm:
        # - llvm has to be downgraded to have 32bit version installed for sfml.

        cat << EOF | sudo tee /etc/apt/preferences.d/pin-to-rel
        Package: libllvm6.0
        Pin: origin "azure.archive.ubuntu.com"
        Pin-Priority: 1001
        EOF

        # echo_run sudo apt-get update -qq
        echo_run sudo apt-get update -qq || echo "failed, see bug #17343"
        # `:i386` (e.g. in `libffi-dev:i386`) is needed otherwise you may get:
        # `could not load: libffi.so` during dynamic loading.
        DEBIAN_FRONTEND='noninteractive' \
          echo_run sudo apt-get install --no-install-recommends --allow-downgrades -yq \
            g++-multilib gcc-multilib libcurl4-openssl-dev:i386 libgc-dev:i386 \
            libsdl1.2-dev:i386 libsfml-dev:i386 libglib2.0-dev:i386 libffi-dev:i386


        cat << EOF > bin/gcc
        #!/bin/bash

        exec $(which gcc) -m32 "\$@"
        EOF

        cat << EOF > bin/g++
        #!/bin/bash

        exec $(which g++) -m32 "\$@"
        EOF

        echo_run chmod 755 bin/gcc
        echo_run chmod 755 bin/g++

      displayName: 'Install dependencies (i386 Linux)'
      condition: and(succeeded(), eq(variables['skipci'], 'false'), eq(variables['Agent.OS'], 'Linux'), eq(variables['CPU'], 'i386'))

    - bash: brew install boehmgc make sfml
      displayName: 'Install dependencies (OSX)'
      condition: and(succeeded(), eq(variables['skipci'], 'false'), eq(variables['Agent.OS'], 'Darwin'))
      # XXX can't find boehm on macos 13

    - bash: |
        set -e
        . ci/funs.sh
        nimInternalInstallDepsWindows
        echo_run echo '##vso[task.prependpath]$(System.DefaultWorkingDirectory)/dist/mingw64/bin'

      displayName: 'Install dependencies (Windows)'
      condition: and(succeeded(), eq(variables['skipci'], 'false'), eq(variables['Agent.OS'], 'Windows_NT'))

    - bash: echo '##vso[task.prependpath]$(System.DefaultWorkingDirectory)/bin'
      condition: and(succeeded(), eq(variables['skipci'], 'false'))
      displayName: 'Add build binaries to PATH'

    - bash: . ci/funs.sh && nimCiSystemInfo
      condition: and(succeeded(), eq(variables['skipci'], 'false'))
      displayName: 'System information'

    - bash: . ci/funs.sh && nimBuildCsourcesIfNeeded CC=gcc ucpu=$(CPU)
      condition: and(succeeded(), eq(variables['skipci'], 'false'))
      displayName: 'Build csourcesAny'

    # this could be revived if performance justifies it (needs a few updates)
    # - task: Cache@2
    #   inputs:
    #     key: 'csourcesAny | "$(Agent.OS)" | $(CPU) | $(csources_version)'
    #     path: $(nim_csources)
    #   condition: and(succeeded(), eq(variables['skipci'], 'false'))
    #   displayName: 'Restore built csourcesAny'

    - bash: . ci/funs.sh && nimInternalBuildKochAndRunCI
      # would could also show on failure: echo '##vso[task.complete result=Failed]'
      condition: and(succeeded(), eq(variables['skipci'], 'false'))
      displayName: 'koch, Run CI'
      env:
        SYSTEM_ACCESSTOKEN: $(System.AccessToken)
