# Copyright (C) Viktor Szakats
#
# SPDX-License-Identifier: curl

name: windows

on:
  push:
    branches:
      - master
      - '*/ci'
    paths-ignore:
      - '**/*.md'
      - '.azure-pipelines.yml'
      - '.circleci/**'
      - '.cirrus.yml'
      - 'appveyor.*'
      - 'packages/**'
      - 'plan9/**'
      - 'projects/**'
      - 'winbuild/**'
  pull_request:
    branches:
      - master
    paths-ignore:
      - '**/*.md'
      - '.azure-pipelines.yml'
      - '.circleci/**'
      - '.cirrus.yml'
      - 'appveyor.*'
      - 'packages/**'
      - 'plan9/**'
      - 'projects/**'
      - 'winbuild/**'

concurrency:
  group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }}
  cancel-in-progress: true

permissions: {}

jobs:
  cygwin:
    name: 'cygwin (${{ matrix.build }}, ${{ matrix.platform }}, ${{ matrix.config }})'
    runs-on: windows-latest
    timeout-minutes: 45
    env:
      SHELLOPTS: 'igncr'
    strategy:
      matrix:
        include:
          - { build: 'automake', platform: 'x86_64', tflags: ''       , config: '--enable-debug --disable-threaded-resolver' }
          - { build: 'cmake'   , platform: 'x86_64', tflags: 'skipall', config: '-DCURL_USE_OPENSSL=ON' }
      fail-fast: false
    steps:
      - run: git config --global core.autocrlf input
      - uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4
      - uses: cygwin/cygwin-install-action@006ad0b0946ca6d0a3ea2d4437677fa767392401 # v4
        with:
          platform: ${{ matrix.platform }}
          # https://cygwin.com/cgi-bin2/package-grep.cgi
          packages: autoconf libtool ${{ matrix.build }} gcc-core gcc-g++ binutils make libssl-devel zlib-devel libbrotli-devel libnghttp2-devel libpsl-devel libssh2-devel
          site: https://mirrors.kernel.org/sourceware/cygwin/

      - name: 'autotools configure'
        if: ${{ matrix.build == 'automake' }}
        timeout-minutes: 5
        shell: C:\cygwin\bin\bash.exe '{0}'
        run: |
          export PATH="/usr/bin:$(cygpath ${SYSTEMROOT})/System32"
          autoreconf -fi
          mkdir bld && cd bld && ../configure --enable-warnings --enable-werror \
            --prefix="${HOME}"/install \
            --enable-websockets \
            --with-openssl \
            --with-libssh2 \
            --disable-dependency-tracking \
            ${{ matrix.config }} || { tail -n 1200 config.log; false; }

      - name: 'autotools build'
        if: ${{ matrix.build == 'automake' }}
        timeout-minutes: 10
        shell: C:\cygwin\bin\bash.exe '{0}'
        run: |
          make -C bld -j3 V=1 install
          find . -name '*.exe' -o -name '*.dll'
          bld/src/curl.exe --disable --version

      - name: 'autotools build examples'
        if: ${{ matrix.build == 'automake' }}
        timeout-minutes: 5
        shell: C:\cygwin\bin\bash.exe '{0}'
        run: |
          make -C bld -j3 V=1 examples

      - name: 'autotools build tests'
        if: ${{ matrix.build == 'automake' && matrix.tflags != 'skipall' }}
        timeout-minutes: 15
        shell: C:\cygwin\bin\bash.exe '{0}'
        run: |
          make -C bld -j3 -C tests V=1

      - name: 'autotools run tests'
        if: ${{ matrix.build == 'automake' && matrix.tflags != 'skipall' && matrix.tflags != 'skiprun' }}
        timeout-minutes: 40
        shell: C:\cygwin\bin\bash.exe '{0}'
        run: |
          export TFLAGS='-j8 ${{ matrix.tflags }}'
          if [ -x "$(cygpath "${SYSTEMROOT}/System32/curl.exe")" ]; then
            TFLAGS+=" -ac $(cygpath "${SYSTEMROOT}/System32/curl.exe")"
          fi
          make -C bld -j3 V=1 test-ci

      - name: 'cmake configure'
        if: ${{ matrix.build == 'cmake' }}
        timeout-minutes: 5
        shell: C:\cygwin\bin\bash.exe '{0}'
        run: |
          export PATH="/usr/bin:$(cygpath ${SYSTEMROOT})/System32"
          cmake -B bld ${options} \
            "-DCMAKE_C_FLAGS=${cflags}" \
            -DCMAKE_UNITY_BUILD=ON \
            -DCURL_WERROR=ON \
            -DBUILD_EXAMPLES=ON \
            -DENABLE_WEBSOCKETS=ON \
            -DCURL_BROTLI=ON -DUSE_NGHTTP2=ON \
            ${{ matrix.config }}

      - name: 'cmake build'
        if: ${{ matrix.build == 'cmake' }}
        timeout-minutes: 10
        shell: C:\cygwin\bin\bash.exe '{0}'
        run: |
          cmake --build bld --config '${{ matrix.type }}' --parallel 3
          [[ '${{ matrix.config }}' != *'BUILD_SHARED_LIBS=OFF'* ]] && cp -f -p bld/lib/*.dll bld/src/
          find . -name '*.exe' -o -name '*.dll'
          bld/src/curl.exe --disable --version

      - name: 'cmake build tests'
        if: ${{ matrix.build == 'cmake' && matrix.tflags != 'skipall' }}
        timeout-minutes: 15
        shell: C:\cygwin\bin\bash.exe '{0}'
        run: |
          cmake --build bld --config '${{ matrix.type }}' --parallel 3 --target testdeps

      - name: 'cmake run tests'
        if: ${{ matrix.build == 'cmake' && matrix.tflags != 'skipall' && matrix.tflags != 'skiprun' }}
        timeout-minutes: 40
        shell: C:\cygwin\bin\bash.exe '{0}'
        run: |
          export TFLAGS='-j8 ${{ matrix.tflags }}'
          if [ -x "$(cygpath "${SYSTEMROOT}/System32/curl.exe")" ]; then
            TFLAGS+=" -ac $(cygpath "${SYSTEMROOT}/System32/curl.exe")"
          fi
          ls bld/lib/*.dll >/dev/null 2>&1 && cp -f -p bld/lib/*.dll bld/tests/libtest/
          cmake --build bld --config '${{ matrix.type }}' --target test-ci

  msys2:
    name: 'msys2 (${{ matrix.build }}, ${{ matrix.sys }}, ${{ matrix.env }}, ${{ matrix.config }})'
    runs-on: windows-latest
    timeout-minutes: 45
    strategy:
      matrix:
        include:
          - { build: 'autotools', sys: 'msys'   , env: 'x86_64'      , tflags: '!19                !1233', config: '--enable-debug --disable-threaded-resolver --disable-proxy' }
          - { build: 'autotools', sys: 'msys'   , env: 'x86_64'      , tflags: '!19 !504 !704 !705 !1233', config: '--enable-debug --disable-threaded-resolver' }
          - { build: 'autotools', sys: 'msys'   , env: 'x86_64'      , tflags: '!19 !504 !704 !705 !1233', config: '' }
          - { build: 'autotools', sys: 'mingw64', env: 'x86_64'      , tflags: 'skiprun'                 , config: '--enable-debug --disable-threaded-resolver --disable-curldebug --enable-static=no' }
          # FIXME: WebSockets test results ignored due to frequent failures on native Windows:
          - { build: 'cmake'    , sys: 'mingw64', env: 'x86_64'      , tflags: '~2301 ~2302'             , config: '-DENABLE_DEBUG=ON -DBUILD_SHARED_LIBS=OFF -DCURL_USE_SCHANNEL=ON -DENABLE_UNICODE=ON', type: 'Debug' }
          - { build: 'cmake'    , sys: 'mingw64', env: 'x86_64'      , tflags: 'skiprun'                 , config: '-DENABLE_DEBUG=OFF -DBUILD_SHARED_LIBS=ON -DCURL_USE_SCHANNEL=ON -DENABLE_UNICODE=ON -DENABLE_CURLDEBUG=ON', type: 'Release' }
          - { build: 'cmake'    , sys: 'clang64', env: 'clang-x86_64', tflags: 'skiprun'                 , config: '-DENABLE_DEBUG=ON -DBUILD_SHARED_LIBS=OFF -DCURL_USE_OPENSSL=ON -DENABLE_UNICODE=OFF', type: 'Release' }
      fail-fast: false
    steps:
      - run: git config --global core.autocrlf input
      - uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4
      - uses: msys2/setup-msys2@d0e80f58dffbc64f6a3a1f43527d469b4fc7b6c8 # v2
        if: ${{ matrix.sys == 'msys' }}
        with:
          msystem: ${{ matrix.sys }}
          # https://packages.msys2.org/search
          install: gcc ${{ matrix.build }} make openssl-devel zlib-devel brotli-devel libnghttp2-devel libpsl-devel libssh2-devel
      - uses: msys2/setup-msys2@d0e80f58dffbc64f6a3a1f43527d469b4fc7b6c8 # v2
        if: ${{ matrix.sys != 'msys' }}
        with:
          msystem: ${{ matrix.sys }}
          install: >-
            mingw-w64-${{ matrix.env }}-cc
            mingw-w64-${{ matrix.env }}-${{ matrix.build }} make
            mingw-w64-${{ matrix.env }}-openssl
            mingw-w64-${{ matrix.env }}-libssh2

      - name: 'autotools configure'
        if: ${{ matrix.build == 'autotools' }}
        timeout-minutes: 5
        shell: msys2 {0}
        run: |
          autoreconf -fi
          mkdir bld && cd bld && ../configure --enable-warnings --enable-werror \
            --prefix="${HOME}"/install \
            --enable-websockets \
            --with-openssl \
            --with-libssh2 \
            --disable-dependency-tracking \
            ${{ matrix.config }} || { tail -n 1200 config.log; false; }

      - name: 'autotools build'
        if: ${{ matrix.build == 'autotools' }}
        timeout-minutes: 10
        shell: msys2 {0}
        run: |
          make -C bld -j3 V=1 install
          find . -name '*.exe' -o -name '*.dll'
          bld/src/curl.exe --disable --version

      - name: 'autotools build examples'
        if: ${{ matrix.build == 'autotools' }}
        timeout-minutes: 5
        shell: msys2 {0}
        run: |
          make -C bld -j3 V=1 examples

      - name: 'autotools build tests'
        if: ${{ matrix.build == 'autotools' && matrix.tflags != 'skipall' }}
        timeout-minutes: 10
        shell: msys2 {0}
        run: |
          make -C bld -j3 -C tests V=1

      - name: 'autotools run tests'
        if: ${{ matrix.build == 'autotools' && matrix.tflags != 'skipall' && matrix.tflags != 'skiprun' }}
        timeout-minutes: 30
        shell: msys2 {0}
        run: |
          export TFLAGS='-j14 !TFTP ${{ matrix.tflags }}'
          if [ -x "$(cygpath "${SYSTEMROOT}/System32/curl.exe")" ]; then
            TFLAGS+=" -ac $(cygpath "${SYSTEMROOT}/System32/curl.exe")"
          fi
          make -C bld -j3 V=1 test-ci

      - name: 'cmake configure'
        if: ${{ matrix.build == 'cmake' }}
        timeout-minutes: 5
        shell: msys2 {0}
        run: |
          if [[ '${{ matrix.env }}' = 'clang'* ]]; then
            options='-DCMAKE_C_COMPILER=clang'
          else
            options='-DCMAKE_C_COMPILER=gcc'
          fi
          cflags='-Wno-deprecated-declarations'  # for examples
          if [ '${{ matrix.test }}' = 'uwp' ]; then
            options+=' -DCMAKE_SYSTEM_NAME=WindowsStore -DCMAKE_SYSTEM_VERSION=10.0'
            pacman --noconfirm --ask 20 --noprogressbar --sync --needed 'mingw-w64-${{ matrix.env }}-winstorecompat-git'
            specs="$(realpath gcc-specs-uwp)"
            gcc -dumpspecs | sed -e 's/-lmingwex/-lwindowsapp -lmingwex -lwindowsapp -lwindowsappcompat/' -e 's/-lmsvcrt/-lmsvcr120_app/' > "${specs}"
            cflags+=" -specs=${specs} -DWINSTORECOMPAT -DWINAPI_FAMILY=WINAPI_FAMILY_APP"
            # CMake (as of v3.26.4) gets confused and applies the MSVC rc.exe command-line
            # template to windres. Reset it to the windres template manually:
            rcopts='<CMAKE_RC_COMPILER> -O coff <DEFINES> <INCLUDES> <FLAGS> <SOURCE> <OBJECT>'
          else
            rcopts=''
          fi
          [ '${{ matrix.type }}' = 'Debug' ] && options+=' -DCMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG='
          [ '${{ matrix.type }}' = 'Release' ] && options+=' -DCMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE='
          cmake -B bld ${options} \
            "-DCMAKE_C_FLAGS=${cflags}" \
            "-DCMAKE_RC_COMPILE_OBJECT=${rcopts}" \
            '-DCMAKE_BUILD_TYPE=${{ matrix.type }}' \
            -DCMAKE_UNITY_BUILD=ON \
            -DCURL_WERROR=ON \
            -DBUILD_EXAMPLES=ON \
            -DENABLE_WEBSOCKETS=ON \
            -DCURL_BROTLI=ON -DUSE_NGHTTP2=ON \
            ${{ matrix.config }}

      - name: 'cmake build'
        if: ${{ matrix.build == 'cmake' }}
        timeout-minutes: 10
        shell: msys2 {0}
        run: |
          cmake --build bld --config '${{ matrix.type }}' --parallel 3
          [[ '${{ matrix.config }}' != *'BUILD_SHARED_LIBS=OFF'* ]] && cp -f -p bld/lib/*.dll bld/src/
          find . -name '*.exe' -o -name '*.dll'
          bld/src/curl.exe --disable --version

      - name: 'cmake build tests'
        if: ${{ matrix.build == 'cmake' && matrix.tflags != 'skipall' }}
        timeout-minutes: 10
        shell: msys2 {0}
        run: |
          cmake --build bld --config '${{ matrix.type }}' --parallel 3 --target testdeps

      - name: 'cmake run tests'
        if: ${{ matrix.build == 'cmake' && matrix.tflags != 'skipall' && matrix.tflags != 'skiprun' }}
        timeout-minutes: 40
        shell: msys2 {0}
        run: |
          export TFLAGS='-j14 !TFTP ${{ matrix.tflags }}'
          if [ -x "$(cygpath "${SYSTEMROOT}/System32/curl.exe")" ]; then
            TFLAGS+=" -ac $(cygpath "${SYSTEMROOT}/System32/curl.exe")"
          fi
          ls bld/lib/*.dll >/dev/null 2>&1 && cp -f -p bld/lib/*.dll bld/tests/libtest/
          cmake --build bld --config '${{ matrix.type }}' --target test-ci

  old-mingw-w64:
    name: 'old-mingw-w64 (${{ matrix.build }}, ${{ matrix.env }}, ${{ matrix.config }})'
    runs-on: windows-latest
    timeout-minutes: 45
    strategy:
      matrix:
        include:
          - build: 'cmake'
            env: '9.5.0-x86_64'
            url: 'https://github.com/brechtsanders/winlibs_mingw/releases/download/9.5.0-10.0.0-msvcrt-r1/winlibs-x86_64-posix-seh-gcc-9.5.0-mingw-w64msvcrt-10.0.0-r1.7z'
            config: '-DENABLE_DEBUG=ON -DBUILD_SHARED_LIBS=OFF -DCURL_USE_SCHANNEL=ON -DENABLE_UNICODE=OFF'
            type: 'Release'
            tflags: '~2301 ~2302 ~3027'
          - build: 'cmake'
            env: '7.3.0-x86_64'
            url: 'https://downloads.sourceforge.net/mingw-w64/Toolchains%20targetting%20Win64/Personal%20Builds/mingw-builds/7.3.0/threads-win32/seh/x86_64-7.3.0-release-win32-seh-rt_v5-rev0.7z'
            config: '-DENABLE_DEBUG=ON -DBUILD_SHARED_LIBS=OFF -DCURL_USE_SCHANNEL=ON -DENABLE_UNICODE=ON'
            type: 'Debug'
            tflags: '~2301 ~2302 ~3027'
          - build: 'cmake'
            env: '6.4.0-i686'
            url: 'https://downloads.sourceforge.net/mingw-w64/Toolchains%20targetting%20Win32/Personal%20Builds/mingw-builds/6.4.0/threads-win32/dwarf/i686-6.4.0-release-win32-dwarf-rt_v5-rev0.7z'
            config: '-DENABLE_DEBUG=ON -DBUILD_SHARED_LIBS=OFF -DCURL_USE_SCHANNEL=ON -DENABLE_UNICODE=OFF -DCMAKE_UNITY_BUILD=OFF'
            type: 'Debug'
            tflags: 'skiprun'
      fail-fast: false
    steps:
      - name: 'cache compiler (gcc ${{ matrix.env }})'
        uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4
        id: cache-compiler
        with:
          path: C:\my-cache\mingw-w64-${{ matrix.env }}
          key: ${{ runner.os }}-mingw-w64-${{ matrix.env }}

      - name: 'install compiler (gcc ${{ matrix.env }})'
        if: ${{ steps.cache-compiler.outputs.cache-hit != 'true' }}
        timeout-minutes: 5
        shell: C:\msys64\usr\bin\bash.exe {0}
        run: |
          mkdir -p /c/my-cache/
          cd /c/my-cache/ || exit 1
          curl --fail --silent --show-error --retry 3 --retry-connrefused --output pack.bin --location --proto-redir =https '${{ matrix.url }}'
          mkdir -p mingw-w64-${{ matrix.env }}
          cd mingw-w64-${{ matrix.env }} || exit 1
          pwd
          7z x -y ../pack.bin >/dev/null

      - run: git config --global core.autocrlf input
      - uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4

      - name: 'update PATH (gcc ${{ matrix.env }})'
        shell: C:\msys64\usr\bin\bash.exe {0}
        run: |
          echo "PATH=/c/my-cache/mingw-w64-${{ matrix.env }}/mingw64/bin:/c/msys64/usr/bin:$PATH" >> $GITHUB_ENV

      - name: 'cmake configure'
        if: ${{ matrix.build == 'cmake' }}
        timeout-minutes: 5
        shell: C:\msys64\usr\bin\bash.exe {0}
        run: |
          cflags='-Wno-deprecated-declarations'  # for examples
          [ '${{ matrix.type }}' = 'Debug' ] && options+=' -DCMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG='
          [ '${{ matrix.type }}' = 'Release' ] && options+=' -DCMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE='
          cmake -B bld ${options} \
            '-GMSYS Makefiles' \
            -DCMAKE_C_COMPILER=gcc \
            "-DCMAKE_C_FLAGS=${cflags}" \
            '-DCMAKE_BUILD_TYPE=${{ matrix.type }}' \
            -DCMAKE_UNITY_BUILD=ON \
            -DCURL_WERROR=ON \
            -DBUILD_EXAMPLES=ON \
            -DENABLE_WEBSOCKETS=ON \
            ${{ matrix.config }}

      - name: 'cmake build'
        if: ${{ matrix.build == 'cmake' }}
        timeout-minutes: 10
        shell: C:\msys64\usr\bin\bash.exe {0}
        run: |
          cmake --build bld --config '${{ matrix.type }}' --parallel 3
          [[ '${{ matrix.config }}' != *'BUILD_SHARED_LIBS=OFF'* ]] && cp -f -p bld/lib/*.dll bld/src/
          bld/src/curl.exe --disable --version

      - name: 'cmake build tests'
        if: ${{ matrix.build == 'cmake' && matrix.tflags != 'skipall' }}
        timeout-minutes: 10
        shell: C:\msys64\usr\bin\bash.exe {0}
        run: |
          cmake --build bld --config '${{ matrix.type }}' --parallel 3 --target testdeps

      - name: 'cmake run tests'
        if: ${{ matrix.build == 'cmake' && matrix.tflags != 'skipall' && matrix.tflags != 'skiprun' }}
        timeout-minutes: 40
        shell: C:\msys64\usr\bin\bash.exe {0}
        run: |
          export TFLAGS='-j14 !TFTP ${{ matrix.tflags }}'
          if [ -x "$(cygpath "${SYSTEMROOT}/System32/curl.exe")" ]; then
            TFLAGS+=" -ac $(cygpath "${SYSTEMROOT}/System32/curl.exe")"
          fi
          ls bld/lib/*.dll >/dev/null 2>&1 && cp -f -p bld/lib/*.dll bld/tests/libtest/
          cmake --build bld --config '${{ matrix.type }}' --target test-ci

  msvc:
    name: 'msvc (${{ matrix.arch }}, ${{ matrix.plat }}, ${{ matrix.config }})'
    runs-on: windows-latest
    timeout-minutes: 30
    strategy:
      matrix:
        include:
          - { arch: 'x64', plat: 'windows', tflags: '~1516 ~2301 ~2302 ~2303 ~2307', config: '-DENABLE_DEBUG=ON -DCURL_USE_SCHANNEL=ON  -DBUILD_SHARED_LIBS=OFF -DENABLE_UNICODE=ON ', type: 'Debug' }
          - { arch: 'x64', plat: 'windows', tflags: '~1516 ~2301 ~2302 ~2303 ~2307', config: '-DENABLE_DEBUG=ON -DCURL_USE_SCHANNEL=OFF -DBUILD_SHARED_LIBS=OFF -DENABLE_UNICODE=OFF', type: 'Debug' }
          - { arch: 'x64', plat: 'windows', tflags: '~1516 ~2301 ~2302 ~2303 ~2307', config: '-DENABLE_DEBUG=ON -DCURL_USE_SCHANNEL=OFF -DHTTP_ONLY=ON          -DENABLE_UNICODE=OFF', type: 'Debug' }
      fail-fast: false
    steps:
      - uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4
      - name: 'cmake configure'
        timeout-minutes: 5
        shell: bash
        run: |
          archgen=${{ matrix.arch }}; [ "${archgen}" = 'x86' ] && archgen='Win32'
          if [ '${{ matrix.plat }}' = 'uwp' ]; then
            system='WindowsStore'
            options='-DCMAKE_SYSTEM_VERSION=10.0'
          else
            system='Windows'
          fi
          [ '${{ matrix.type }}' = 'Debug' ] && options+=' -DCMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG='
          [ '${{ matrix.type }}' = 'Release' ] && options+=' -DCMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE='
          cmake -B bld ${options} \
            "-DCMAKE_SYSTEM_NAME=${system}" \
            -DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake \
            "-DCMAKE_GENERATOR_PLATFORM=${archgen}" \
            '-DVCPKG_TARGET_TRIPLET=${{ matrix.arch }}-${{ matrix.plat }}' \
            -DCMAKE_VS_GLOBALS=TrackFileAccess=false \
            '-DCMAKE_UNITY_BUILD=${{ matrix.unity }}' \
            "-DCMAKE_C_FLAGS=${cflags}" \
            '-DCMAKE_BUILD_TYPE=${{ matrix.type }}' \
            -DCMAKE_UNITY_BUILD=ON \
            -DCURL_WERROR=ON \
            -DBUILD_EXAMPLES=ON \
            -DENABLE_WEBSOCKETS=ON \
            ${{ matrix.config }}

      - name: 'cmake build'
        timeout-minutes: 5
        shell: bash
        run: |
          cmake --build bld --config '${{ matrix.type }}' --parallel 3
          [[ '${{ matrix.config }}' != *'BUILD_SHARED_LIBS=OFF'* ]] && cp -f -p bld/lib/*.dll bld/src/
          bld/src/curl.exe --disable --version

      - name: 'cmake build tests'
        if: ${{ matrix.tflags != 'skipall' }}
        timeout-minutes: 10
        shell: bash
        run: |
          cmake --build bld --config '${{ matrix.type }}' --parallel 3 --target testdeps

      - name: 'cmake run tests'
        if: ${{ matrix.tflags != 'skipall' && matrix.tflags != 'skiprun' }}
        timeout-minutes: 30
        shell: bash
        run: |
          export TFLAGS='-j14 !TFTP ${{ matrix.tflags }}'
          ls bld/lib/*.dll >/dev/null 2>&1 && cp -f -p bld/lib/*.dll bld/tests/libtest/
          cmake --build bld --config '${{ matrix.type }}' --target test-ci
