mirror of
https://github.com/libssh2/libssh2.git
synced 2026-10-24 03:48:58 +03:00
1472 lines
65 KiB
YAML
1472 lines
65 KiB
YAML
# Copyright (C) The libssh2 project and its contributors.
|
|
#
|
|
# SPDX-License-Identifier: BSD-3-Clause
|
|
#
|
|
name: 'CI'
|
|
|
|
'on':
|
|
push:
|
|
branches:
|
|
- master
|
|
pull_request:
|
|
branches:
|
|
- master
|
|
|
|
concurrency:
|
|
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }}
|
|
cancel-in-progress: true
|
|
|
|
permissions: {}
|
|
cache-mode: none
|
|
|
|
env:
|
|
DO_NOT_TRACK: '1'
|
|
FIXTURE_TRACE_NO_DEBUGDUMP: '1'
|
|
HOMEBREW_NO_INSTALL_CLEANUP: '1'
|
|
MAKEFLAGS: -j 5
|
|
|
|
jobs:
|
|
check_style:
|
|
name: 'style-check'
|
|
runs-on: ubuntu-slim
|
|
timeout-minutes: 5
|
|
steps:
|
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
with:
|
|
persist-credentials: false
|
|
- name: 'checksrc'
|
|
run: scripts/checksrc-all.pl
|
|
|
|
linters:
|
|
name: 'linters'
|
|
runs-on: ubuntu-26.04-arm
|
|
timeout-minutes: 5
|
|
steps:
|
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
with:
|
|
persist-credentials: false
|
|
|
|
- name: 'install prereqs'
|
|
run: |
|
|
/home/linuxbrew/.linuxbrew/bin/brew install shellcheck zizmor
|
|
python3 -m venv ~/venv
|
|
~/venv/bin/pip --disable-pip-version-check --no-input --no-cache-dir install --progress-bar off --prefer-binary -r .github/workflows/requirements.txt
|
|
|
|
- name: 'REUSE check'
|
|
run: |
|
|
source ~/venv/bin/activate
|
|
reuse lint
|
|
|
|
- name: 'zizmor GHA'
|
|
env:
|
|
GH_TOKEN: '${{ secrets.GITHUB_TOKEN }}'
|
|
run: |
|
|
eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"
|
|
zizmor --pedantic .github/workflows/*.yml .github/dependabot.yml
|
|
|
|
- name: 'shellcheck GHA'
|
|
run: |
|
|
eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"
|
|
shellcheck --version
|
|
export SHELLCHECK_OPTS='--exclude=1090,1091,2086,2153 --enable=avoid-nullary-conditions,deprecate-which'
|
|
git ls-files '.github/workflows/*.yml' | while read -r f; do
|
|
echo "Verifying ${f}..."
|
|
{
|
|
echo '#!/usr/bin/env bash'
|
|
echo 'set -eu'
|
|
yq eval '.. | select(has("run") and (.run | type == "!!str")) | .run + "\ntrue\n"' "${f}"
|
|
} | shellcheck -
|
|
done
|
|
|
|
- name: 'shellcheck'
|
|
run: |
|
|
eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"
|
|
shellcheck --version
|
|
scripts/shellcheck.sh
|
|
|
|
- name: 'spacecheck'
|
|
run: scripts/spacecheck.pl
|
|
|
|
- name: 'cmakelint'
|
|
run: |
|
|
source ~/venv/bin/activate
|
|
scripts/cmakelint.sh
|
|
|
|
- name: 'spellcheck'
|
|
run: |
|
|
source ~/venv/bin/activate
|
|
scripts/spellcheck.sh
|
|
|
|
build_integration:
|
|
name: 'CM integration ${{ matrix.image }}'
|
|
runs-on: ${{ matrix.image }}
|
|
timeout-minutes: 5
|
|
defaults:
|
|
run:
|
|
shell: ${{ contains(matrix.image, 'windows') && 'msys2 {0}' || 'bash' }}
|
|
env:
|
|
CC: ${{ !contains(matrix.image, 'windows') && 'clang' || '' }}
|
|
MATRIX_IMAGE: '${{ matrix.image }}'
|
|
OLD_CMAKE_VERSION: 3.19.8
|
|
OLD_CMAKE_SHA256_LINUX_ARM: 807f5afb2a560e00af9640e496d5673afefc2888bf0ed076412884a5ebb547a1
|
|
OLD_CMAKE_SHA256_MACOS_UNI: 0976d23d982af05dcbfb3aa34fcb62ead43bea27f0e3bb95222f2a78161423f2
|
|
OLD_CMAKE_SHA256_WIN_INTEL: 2a30877a3d6b50da305b289f4d1c03befdfaeb2edba02a563c681e883d810380
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
image: [ubuntu-26.04-arm, macos-latest, windows-2022]
|
|
steps:
|
|
- uses: msys2/setup-msys2@ec48f7c5447b3140e2b088413ae3a55687bccb6e # v2.33.0
|
|
if: ${{ contains(matrix.image, 'windows') }}
|
|
with:
|
|
msystem: ucrt64
|
|
release: false
|
|
update: false
|
|
cache: false
|
|
path-type: inherit
|
|
install: >-
|
|
mingw-w64-ucrt-x86_64-zlib mingw-w64-ucrt-x86_64-libgcrypt mingw-w64-ucrt-x86_64-openssl mingw-w64-ucrt-x86_64-mbedtls
|
|
|
|
- name: 'install packages'
|
|
timeout-minutes: 3
|
|
run: |
|
|
if [[ "${MATRIX_IMAGE}" = *'windows'* ]]; then
|
|
cd ~
|
|
curl --disable --fail --silent --show-error --connect-timeout 15 --max-time 60 --retry 3 --retry-connrefused \
|
|
--location --proto-redir =https "https://github.com/Kitware/CMake/releases/download/v${OLD_CMAKE_VERSION}/cmake-${OLD_CMAKE_VERSION}-win64-x64.zip" --output pkg.bin
|
|
sha256sum pkg.bin && sha256sum pkg.bin | grep -qwF -- "${OLD_CMAKE_SHA256_WIN_INTEL}" && unzip -q pkg.bin && rm -f pkg.bin
|
|
printf '%s' ~/cmake-"${OLD_CMAKE_VERSION}"-win64-x64/bin/cmake.exe > ~/old-cmake-path.txt
|
|
elif [[ "${MATRIX_IMAGE}" = *'ubuntu'* ]]; then
|
|
sudo find /etc/apt/sources.list.d -type f -not -name 'ubuntu.sources' -delete -print
|
|
sudo sed -i '/azure/d' /etc/apt/apt-mirrors.txt; cat /etc/apt/apt-mirrors.txt
|
|
sudo apt-get -o Dpkg::Use-Pty=0 update
|
|
sudo apt-get -o Dpkg::Use-Pty=0 install libgcrypt-dev libssl-dev libwolfssl-dev
|
|
/home/linuxbrew/.linuxbrew/bin/brew install mbedtls@3
|
|
cd ~
|
|
curl --disable --fail --silent --show-error --connect-timeout 15 --max-time 60 --retry 3 --retry-connrefused \
|
|
--location --proto-redir =https "https://github.com/Kitware/CMake/releases/download/v${OLD_CMAKE_VERSION}/cmake-${OLD_CMAKE_VERSION}-Linux-aarch64.tar.gz" --output pkg.bin
|
|
sha256sum pkg.bin | tee /dev/stderr | grep -qwF -- "${OLD_CMAKE_SHA256_LINUX_ARM}" && tar -xzf pkg.bin && rm -f pkg.bin
|
|
printf '%s' ~/cmake-"${OLD_CMAKE_VERSION}"-Linux-aarch64/bin/cmake > ~/old-cmake-path.txt
|
|
else
|
|
brew install libgcrypt openssl mbedtls@3 wolfssl
|
|
cd ~
|
|
curl --disable --fail --silent --show-error --connect-timeout 15 --max-time 60 --retry 3 --retry-connrefused \
|
|
--location --proto-redir =https "https://github.com/Kitware/CMake/releases/download/v${OLD_CMAKE_VERSION}/cmake-${OLD_CMAKE_VERSION}-macos-universal.tar.gz" --output pkg.bin
|
|
sha256sum pkg.bin | tee /dev/stderr | grep -qwF -- "${OLD_CMAKE_SHA256_MACOS_UNI}" && tar -xzf pkg.bin && rm -f pkg.bin
|
|
printf '%s' ~/cmake-"${OLD_CMAKE_VERSION}"-macos-universal/CMake.app/Contents/bin/cmake > ~/old-cmake-path.txt
|
|
fi
|
|
|
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
with:
|
|
persist-credentials: false
|
|
|
|
- name: 'via ExternalProject'
|
|
if: ${{ !contains(matrix.image, 'ubuntu') }}
|
|
run: ./tests/cmake/test.sh ExternalProject
|
|
- name: 'via FetchContent'
|
|
run: ./tests/cmake/test.sh FetchContent
|
|
- name: 'via add_subdirectory OpenSSL'
|
|
run: ./tests/cmake/test.sh add_subdirectory -DCRYPTO_BACKEND=OpenSSL
|
|
- name: 'via add_subdirectory Libgcrypt'
|
|
run: ./tests/cmake/test.sh add_subdirectory -DCRYPTO_BACKEND=Libgcrypt
|
|
- name: 'via find_package OpenSSL'
|
|
run: ./tests/cmake/test.sh find_package -DCRYPTO_BACKEND=OpenSSL
|
|
- name: 'via find_package Libgcrypt'
|
|
run: ./tests/cmake/test.sh find_package -DCRYPTO_BACKEND=Libgcrypt
|
|
- name: 'via find_package mbedTLS'
|
|
run: |
|
|
if [[ "${MATRIX_IMAGE}" = *'ubuntu'* ]]; then
|
|
eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"
|
|
export PKG_CONFIG_PATH; PKG_CONFIG_PATH="$(brew --prefix mbedtls@3)/lib/pkgconfig"
|
|
export LDFLAGS; LDFLAGS="-Wl,-rpath,$(brew --prefix mbedtls@3)/lib"
|
|
elif [[ "${MATRIX_IMAGE}" = *'macos'* ]]; then
|
|
export PKG_CONFIG_PATH; PKG_CONFIG_PATH="$(brew --prefix mbedtls@3)"/lib/pkgconfig
|
|
fi
|
|
./tests/cmake/test.sh find_package -DCRYPTO_BACKEND=mbedTLS
|
|
|
|
- name: 'via find_package wolfSSL'
|
|
if: ${{ !contains(matrix.image, 'windows') }} # MSYS2 wolfSSL package not built with the OpenSSL compatibility option
|
|
run: ./tests/cmake/test.sh find_package -DCRYPTO_BACKEND=wolfSSL
|
|
|
|
- name: 'via find_package (PREFER_CONFIG=ON)'
|
|
if: ${{ contains(matrix.image, 'windows') }}
|
|
run: |
|
|
export TEST_CMAKE_FLAGS_PROVIDER='-DCMAKE_FIND_PACKAGE_PREFER_CONFIG=ON'
|
|
export TEST_CMAKE_FLAGS_CONSUMER="${TEST_CMAKE_FLAGS_PROVIDER}"
|
|
./tests/cmake/test.sh find_package -DCRYPTO_BACKEND=mbedTLS
|
|
|
|
- name: 'via ExternalProject (old cmake)'
|
|
if: ${{ contains(matrix.image, 'ubuntu') }}
|
|
run: |
|
|
export TEST_CMAKE_CONSUMER; TEST_CMAKE_CONSUMER="$(cat ~/old-cmake-path.txt)"
|
|
if [[ "${MATRIX_IMAGE}" = *'macos'* ]]; then
|
|
export CFLAGS='-arch arm64'
|
|
fi
|
|
if [[ "${MATRIX_IMAGE}" = *'windows'* ]]; then
|
|
export TEST_CMAKE_GENERATOR='MSYS Makefiles'
|
|
export TEST_CMAKE_FLAGS='-DCMAKE_C_COMPILER=x86_64-w64-mingw32-gcc'
|
|
fi
|
|
./tests/cmake/test.sh ExternalProject
|
|
|
|
- name: 'via add_subdirectory OpenSSL (old cmake)'
|
|
run: |
|
|
export TEST_CMAKE_CONSUMER; TEST_CMAKE_CONSUMER="$(cat ~/old-cmake-path.txt)"
|
|
[[ "${MATRIX_IMAGE}" = *'macos'* ]] && export CFLAGS='-arch arm64'
|
|
if [[ "${MATRIX_IMAGE}" = *'windows'* ]]; then
|
|
export TEST_CMAKE_GENERATOR='MSYS Makefiles'
|
|
export TEST_CMAKE_FLAGS='-DCMAKE_C_COMPILER=x86_64-w64-mingw32-gcc -DOPENSSL_ROOT_DIR=/ucrt64'
|
|
fi
|
|
./tests/cmake/test.sh add_subdirectory -DCRYPTO_BACKEND=OpenSSL
|
|
|
|
- name: 'via find_package OpenSSL (old cmake)'
|
|
run: |
|
|
export TEST_CMAKE_CONSUMER; TEST_CMAKE_CONSUMER="$(cat ~/old-cmake-path.txt)"
|
|
[[ "${MATRIX_IMAGE}" = *'macos'* ]] && export CFLAGS='-arch arm64'
|
|
if [[ "${MATRIX_IMAGE}" = *'windows'* ]]; then
|
|
export TEST_CMAKE_GENERATOR='MSYS Makefiles'
|
|
export TEST_CMAKE_FLAGS='-DCMAKE_C_COMPILER=x86_64-w64-mingw32-gcc -DOPENSSL_ROOT_DIR=/ucrt64'
|
|
fi
|
|
./tests/cmake/test.sh find_package -DCRYPTO_BACKEND=OpenSSL
|
|
|
|
build_linux:
|
|
name: 'linux'
|
|
runs-on: ${{ matrix.compiler == 'clang-tidy' && 'ubuntu-26.04-arm' || (matrix.image || 'ubuntu-latest') }}
|
|
timeout-minutes: 10
|
|
cache-mode: write
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
compiler: [gcc, clang, clang-tidy]
|
|
arch: [amd64]
|
|
crypto: [Libgcrypt, mbedTLS-prev, OpenSSL, wolfSSL]
|
|
build: ['CM']
|
|
zlib: ['OFF', 'ON']
|
|
exclude:
|
|
- { compiler: clang-tidy, zlib: 'OFF' }
|
|
include:
|
|
- { compiler: gcc , arch: arm64, crypto: AWS-LC , build: 'CM', zlib: 'ON', image: ubuntu-26.04-arm }
|
|
- { compiler: gcc , arch: amd64, crypto: BoringSSL , build: 'CM', zlib: 'ON', options: '-DENABLE_DEBUG_LOGGING=ON' }
|
|
- { compiler: gcc , arch: amd64, crypto: LibreSSL , build: 'CM', zlib: 'ON' }
|
|
- { compiler: gcc , arch: i386 , crypto: mbedTLS-from-source , build: 'CM', zlib: 'ON', image: ubuntu-26.04 }
|
|
- { compiler: gcc , arch: amd64, crypto: OpenSSL , build: 'AM', zlib: 'OFF', test: 'legacy-options' }
|
|
- { compiler: clang, arch: amd64, crypto: OpenSSL , build: 'AM', zlib: 'OFF', container: 'podman' }
|
|
- { compiler: clang, arch: amd64, crypto: OpenSSL , build: 'AM', zlib: 'ON', target: 'distcheck' }
|
|
- { compiler: clang, arch: amd64, crypto: OpenSSL , build: 'AM', zlib: 'ON', target: 'maketgz' }
|
|
- { compiler: gcc , arch: amd64, crypto: OpenSSL-4-no-deprecated , build: 'CM', zlib: 'ON', image: ubuntu-26.04, container: 'podman' }
|
|
- { compiler: gcc , arch: amd64, crypto: OpenSSL-111-from-source , build: 'CM', zlib: 'ON', image: ubuntu-26.04 }
|
|
- { compiler: clang, arch: amd64, crypto: wolfSSL-from-source , build: 'CM', zlib: 'ON', image: ubuntu-26.04, container: 'podman' }
|
|
- { compiler: clang, arch: amd64, crypto: wolfSSL-from-source-prev, build: 'CM', zlib: 'ON', image: ubuntu-26.04 }
|
|
env:
|
|
CC: ${{ matrix.compiler == 'clang-tidy' && 'clang' || matrix.compiler }}
|
|
MATRIX_ARCH: ${{ matrix.compiler == 'clang-tidy' && 'arm64' || matrix.arch }}
|
|
MATRIX_BUILD: '${{ matrix.build }}'
|
|
MATRIX_COMPILER: '${{ matrix.compiler }}'
|
|
MATRIX_CRYPTO: '${{ matrix.crypto }}'
|
|
MATRIX_OPTIONS: '${{ matrix.options }}'
|
|
MATRIX_TARGET: '${{ matrix.target }}'
|
|
MATRIX_TEST: '${{ matrix.test }}'
|
|
MATRIX_ZLIB: '${{ matrix.zlib }}'
|
|
AWSLC_VERSION: 5.8.0
|
|
AWSLC_SHA256: 04d9aa258641265099a3b1fbd37a21866e942943e16619087bf79c0b6e08f64e
|
|
BORINGSSL_VERSION: 0.20260929.0
|
|
BORINGSSL_SHA256: 04da9ba0664e0a7f028e961c38d604f2cc6dac852a84ca0e51dc1fa051d4c8fe
|
|
LIBRESSL_VERSION: 4.3.3
|
|
LIBRESSL_SHA256: ff97c432457f349e6ba3d416ab903bc7468f1436f0f32efe5fff808de292c7b8
|
|
MBEDTLS_VERSION: 3.6.7
|
|
MBEDTLS_SHA256: a7e8bcbec0e6f761b4af24f25677626b35f762f68eef79c08677a363212d11f6
|
|
MBEDTLS_VERSION_PREV: 3.1.0
|
|
MBEDTLS_SHA256_PREV: b02df6f68dd1537e115a8497d5c173dc71edc55ad084756e57a30f951b725acd
|
|
OPENSSL_VERSION: 4.0.3
|
|
OPENSSL_SHA256: 325b5c806167c13b40b1ffeadfe0248197c00eccc4cf123ec1e28d2d2fd216d9
|
|
OPENSSL111_VERSION: 1.1.1w
|
|
OPENSSL111_SHA256: cf3098950cb4d853ad95c0841f1f9c6d3dc102dccfcacd521d93925208b76ac8
|
|
WOLFSSL_VERSION: 5.9.4
|
|
WOLFSSL_SHA256: 7256bfc89b183a75183806c7debfa203443873b0b4a562e1b80d68e01b45ac57
|
|
WOLFSSL_VERSION_PREV: 5.5.4
|
|
WOLFSSL_SHA256_PREV: b7ee150e49def77c765bc02aac92ddeb0bebefd4cb12aa263d8f95e405221fb8
|
|
steps:
|
|
- name: 'install architecture'
|
|
if: ${{ env.MATRIX_ARCH == 'i386' }}
|
|
timeout-minutes: 2
|
|
run: |
|
|
sudo find /etc/apt/sources.list.d -type f -not -name 'ubuntu.sources' -delete -print
|
|
sudo sed -i '/azure/d' /etc/apt/apt-mirrors.txt; cat /etc/apt/apt-mirrors.txt
|
|
sudo dpkg --add-architecture "${MATRIX_ARCH}"
|
|
sudo apt-get -o Dpkg::Use-Pty=0 update
|
|
sudo apt-get -o Dpkg::Use-Pty=0 install gcc-multilib build-essential zlib1g-dev:"${MATRIX_ARCH}"
|
|
|
|
- name: 'install packages'
|
|
timeout-minutes: 2
|
|
run: |
|
|
if [ "${MATRIX_ARCH}" = 'i386' ]; then
|
|
arch=":${MATRIX_ARCH}"
|
|
fi
|
|
pkgs=''
|
|
[ "${MATRIX_COMPILER}" = 'clang-tidy' ] && pkgs+=' clang-22 clang-tidy-22'
|
|
[ "${MATRIX_CRYPTO}" = 'Libgcrypt' ] && pkgs+=" libgcrypt-dev${arch}"
|
|
[ "${MATRIX_CRYPTO}" = 'OpenSSL' ] && pkgs+=" libssl-dev${arch}"
|
|
[ "${MATRIX_CRYPTO}" = 'wolfSSL' ] && pkgs+=" libwolfssl-dev${arch}"
|
|
if [ -n "${pkgs}" ]; then
|
|
sudo find /etc/apt/sources.list.d -type f -not -name 'ubuntu.sources' -delete -print
|
|
sudo sed -i '/azure/d' /etc/apt/apt-mirrors.txt; cat /etc/apt/apt-mirrors.txt
|
|
sudo apt-get -o Dpkg::Use-Pty=0 update
|
|
sudo apt-get -o Dpkg::Use-Pty=0 install ${pkgs}
|
|
fi
|
|
|
|
- name: 'cache AWS-LC'
|
|
if: ${{ matrix.crypto == 'AWS-LC' }}
|
|
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
|
id: cache-aws-lc
|
|
with:
|
|
path: ~/usr
|
|
key: ${{ runner.os }}-aws-lc-${{ env.AWSLC_VERSION }}-${{ env.MATRIX_ARCH }}
|
|
|
|
- name: 'install AWS-LC from source'
|
|
if: ${{ matrix.crypto == 'AWS-LC' && !steps.cache-aws-lc.outputs.cache-hit }}
|
|
run: |
|
|
curl --disable --fail --silent --show-error --connect-timeout 15 --max-time 120 --retry 6 --retry-connrefused \
|
|
--location --proto-redir =https "https://github.com/awslabs/aws-lc/archive/refs/tags/v${AWSLC_VERSION}.tar.gz" --output pkg.bin
|
|
sha256sum pkg.bin | tee /dev/stderr | grep -qwF -- "${AWSLC_SHA256}" && tar -xzf pkg.bin && rm -f pkg.bin
|
|
cd "aws-lc-${AWSLC_VERSION}"
|
|
cmake -B . -G Ninja -DCMAKE_INSTALL_PREFIX="$HOME"/usr -DBUILD_TOOL=OFF -DBUILD_TESTING=OFF
|
|
cmake --build .
|
|
cmake --install .
|
|
|
|
- name: 'cache BoringSSL'
|
|
if: ${{ matrix.crypto == 'BoringSSL' }}
|
|
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
|
id: cache-boringssl
|
|
with:
|
|
path: ~/usr
|
|
key: ${{ runner.os }}-boringssl-${{ env.BORINGSSL_VERSION }}-${{ env.MATRIX_ARCH }}
|
|
|
|
- name: 'install BoringSSL from source'
|
|
if: ${{ matrix.crypto == 'BoringSSL' && !steps.cache-boringssl.outputs.cache-hit }}
|
|
run: |
|
|
curl --disable --fail --silent --show-error --connect-timeout 15 --max-time 120 --retry 6 --retry-connrefused \
|
|
--location --proto-redir =https "https://github.com/google/boringssl/releases/download/${BORINGSSL_VERSION}/boringssl-${BORINGSSL_VERSION}.tar.gz" --output pkg.bin
|
|
sha256sum pkg.bin | tee /dev/stderr | grep -qwF -- "${BORINGSSL_SHA256}" && tar -xzf pkg.bin && rm -f pkg.bin
|
|
cd "boringssl-${BORINGSSL_VERSION}"
|
|
cmake -B . -G Ninja -DCMAKE_INSTALL_PREFIX="$HOME"/usr -DBUILD_SHARED_LIBS=ON -DBUILD_TESTING=OFF
|
|
cmake --build .
|
|
cmake --install .
|
|
|
|
- name: 'cache LibreSSL'
|
|
if: ${{ matrix.crypto == 'LibreSSL' }}
|
|
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
|
id: cache-libressl
|
|
with:
|
|
path: ~/usr
|
|
key: ${{ runner.os }}-libressl-${{ env.LIBRESSL_VERSION }}-${{ env.MATRIX_ARCH }}
|
|
|
|
- name: 'install LibreSSL from source'
|
|
if: ${{ matrix.crypto == 'LibreSSL' && !steps.cache-libressl.outputs.cache-hit }}
|
|
run: |
|
|
curl --disable --fail --silent --show-error --connect-timeout 15 --max-time 120 --retry 6 --retry-connrefused \
|
|
"https://ftp.openbsd.org/pub/OpenBSD/LibreSSL/libressl-${LIBRESSL_VERSION}.tar.gz" --output pkg.bin
|
|
sha256sum pkg.bin | tee /dev/stderr | grep -qwF -- "${LIBRESSL_SHA256}" && tar -xzf pkg.bin && rm -f pkg.bin
|
|
cd "libressl-${LIBRESSL_VERSION}"
|
|
cmake -B . -G Ninja -DCMAKE_INSTALL_PREFIX="$HOME"/usr -DLIBRESSL_APPS=OFF -DLIBRESSL_TESTS=OFF
|
|
cmake --build .
|
|
cmake --install .
|
|
|
|
- name: 'cache mbedTLS'
|
|
if: ${{ matrix.crypto == 'mbedTLS-from-source' }}
|
|
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
|
id: cache-mbedtls
|
|
with:
|
|
path: ~/usr
|
|
key: ${{ runner.os }}-mbedtls-${{ env.MBEDTLS_VERSION }}-${{ env.MATRIX_ARCH }}
|
|
|
|
- name: 'install mbedTLS from source'
|
|
if: ${{ matrix.crypto == 'mbedTLS-from-source' && !steps.cache-mbedtls.outputs.cache-hit }}
|
|
run: |
|
|
curl --disable --fail --silent --show-error --connect-timeout 15 --max-time 120 --retry 6 --retry-connrefused \
|
|
--location --proto-redir =https "https://github.com/Mbed-TLS/mbedtls/releases/download/mbedtls-${MBEDTLS_VERSION}/mbedtls-${MBEDTLS_VERSION}.tar.bz2" --output pkg.bin
|
|
sha256sum pkg.bin | tee /dev/stderr | grep -qwF -- "${MBEDTLS_SHA256}" && tar -xjf pkg.bin && rm -f pkg.bin
|
|
cd "mbedtls-${MBEDTLS_VERSION}"
|
|
if [ "${MATRIX_ARCH}" = 'i386' ]; then
|
|
options="-DCMAKE_SYSTEM_NAME=Linux -DCMAKE_SYSTEM_VERSION=1 -DCMAKE_SYSTEM_PROCESSOR=${MATRIX_ARCH}"
|
|
cflags='-m32 -mpclmul -msse2 -maes'
|
|
fi
|
|
cmake -B . -G Ninja ${options} \
|
|
-DCMAKE_C_FLAGS="${cflags}" \
|
|
-DENABLE_PROGRAMS=OFF \
|
|
-DENABLE_TESTING=OFF \
|
|
-DUSE_STATIC_MBEDTLS_LIBRARY=OFF \
|
|
-DUSE_SHARED_MBEDTLS_LIBRARY=ON \
|
|
-DCMAKE_INSTALL_PREFIX="$HOME"/usr
|
|
cmake --build .
|
|
cmake --install .
|
|
|
|
- name: 'cache mbedTLS (prev)'
|
|
if: ${{ matrix.crypto == 'mbedTLS-prev' }}
|
|
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
|
id: cache-mbedtls-prev
|
|
with:
|
|
path: ~/usr
|
|
key: ${{ runner.os }}-mbedtls-${{ env.MBEDTLS_VERSION_PREV }}-${{ env.MATRIX_ARCH }}
|
|
|
|
- name: 'install mbedTLS (prev) from source'
|
|
if: ${{ matrix.crypto == 'mbedTLS-prev' && !steps.cache-mbedtls-prev.outputs.cache-hit }}
|
|
run: |
|
|
curl --disable --fail --silent --show-error --connect-timeout 15 --max-time 120 --retry 6 --retry-connrefused \
|
|
--location --proto-redir =https "https://github.com/Mbed-TLS/mbedtls/archive/refs/tags/v${MBEDTLS_VERSION_PREV}.tar.gz" --output pkg.bin
|
|
sha256sum pkg.bin | tee /dev/stderr | grep -qwF -- "${MBEDTLS_SHA256_PREV}" && tar -xzf pkg.bin && rm -f pkg.bin
|
|
cd "mbedtls-${MBEDTLS_VERSION_PREV}"
|
|
export CC=gcc # compiler warning promoted to error when using clang (as tested with 3.0.0/3.1.0)
|
|
cmake -B . -G Ninja \
|
|
-DENABLE_PROGRAMS=OFF \
|
|
-DENABLE_TESTING=OFF \
|
|
-DUSE_STATIC_MBEDTLS_LIBRARY=OFF \
|
|
-DUSE_SHARED_MBEDTLS_LIBRARY=ON \
|
|
-DCMAKE_INSTALL_PREFIX="$HOME"/usr
|
|
cmake --build .
|
|
cmake --install .
|
|
|
|
- name: 'cache OpenSSL'
|
|
if: ${{ matrix.crypto == 'OpenSSL-4-no-deprecated' }}
|
|
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
|
id: cache-openssl
|
|
with:
|
|
path: ~/usr
|
|
key: ${{ runner.os }}-openssl-${{ env.OPENSSL_VERSION }}-${{ env.MATRIX_ARCH }}
|
|
|
|
- name: 'install OpenSSL from source'
|
|
if: ${{ matrix.crypto == 'OpenSSL-4-no-deprecated' && !steps.cache-openssl.outputs.cache-hit }}
|
|
run: |
|
|
curl --disable --fail --silent --show-error --connect-timeout 15 --max-time 120 --retry 6 --retry-connrefused \
|
|
--location --proto-redir =https "https://github.com/openssl/openssl/releases/download/openssl-${OPENSSL_VERSION}/openssl-${OPENSSL_VERSION}.tar.gz" --output pkg.bin
|
|
sha256sum pkg.bin | tee /dev/stderr | grep -qwF -- "${OPENSSL_SHA256}" && tar -xzf pkg.bin && rm -f pkg.bin
|
|
cd "openssl-${OPENSSL_VERSION}"
|
|
./Configure no-deprecated \
|
|
no-apps no-docs no-tests no-makedepend \
|
|
no-comp no-quic no-legacy --prefix="$HOME"/usr
|
|
make install_sw
|
|
|
|
- name: 'cache OpenSSL 1.1.1'
|
|
if: ${{ matrix.crypto == 'OpenSSL-111-from-source' }}
|
|
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
|
id: cache-openssl111
|
|
with:
|
|
path: ~/usr
|
|
key: ${{ runner.os }}-openssl-${{ env.OPENSSL111_VERSION }}-${{ env.MATRIX_ARCH }}
|
|
|
|
- name: 'install OpenSSL 1.1.1 from source'
|
|
if: ${{ matrix.crypto == 'OpenSSL-111-from-source' && !steps.cache-openssl111.outputs.cache-hit }}
|
|
run: |
|
|
curl --disable --fail --silent --show-error --connect-timeout 15 --max-time 120 --retry 6 --retry-connrefused \
|
|
--location --proto-redir =https "https://github.com/openssl/openssl/releases/download/OpenSSL_1_1_1w/openssl-${OPENSSL111_VERSION}.tar.gz" --output pkg.bin
|
|
sha256sum pkg.bin | tee /dev/stderr | grep -qwF -- "${OPENSSL111_SHA256}" && tar -xzf pkg.bin && rm -f pkg.bin
|
|
cd "openssl-${OPENSSL111_VERSION}"
|
|
./config no-unit-test no-makedepend --prefix="$HOME"/usr no-tests
|
|
make
|
|
make -j1 install_sw
|
|
|
|
- name: 'install wolfSSL from source'
|
|
if: ${{ startsWith(matrix.crypto, 'wolfSSL-from-source') }}
|
|
run: |
|
|
if [ "${MATRIX_CRYPTO}" != 'wolfSSL-from-source' ]; then
|
|
WOLFSSL_VERSION="${WOLFSSL_VERSION_PREV}"
|
|
WOLFSSL_SHA256="${WOLFSSL_SHA256_PREV}"
|
|
options='-DWOLFSSL_OPENSSLEXTRA=ON'
|
|
fi
|
|
curl --disable --fail --silent --show-error --connect-timeout 15 --max-time 120 --retry 6 --retry-connrefused \
|
|
--location --proto-redir =https "https://github.com/wolfSSL/wolfssl/archive/v${WOLFSSL_VERSION}-stable.tar.gz" --output pkg.bin
|
|
sha256sum pkg.bin | tee /dev/stderr | grep -qwF -- "${WOLFSSL_SHA256}" && tar -xzf pkg.bin && rm -f pkg.bin
|
|
cd "wolfssl-${WOLFSSL_VERSION}-stable"
|
|
cmake -B bld -G Ninja ${options} \
|
|
-DWOLFSSL_LIBSSH2=ON \
|
|
-DBUILD_SELFTEST=OFF \
|
|
-DWOLFSSL_OPENSSLALL=ON \
|
|
-DWOLFSSL_EXAMPLES=OFF \
|
|
-DWOLFSSL_CRYPT_TESTS=OFF \
|
|
-DCMAKE_POSITION_INDEPENDENT_CODE=ON \
|
|
-DCMAKE_C_FLAGS='-DWOLFSSL_AESGCM_STREAM' \
|
|
-DCMAKE_INSTALL_PREFIX="$HOME"/usr
|
|
cmake --build bld
|
|
cmake --install bld
|
|
cd ..
|
|
|
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
with:
|
|
persist-credentials: false
|
|
|
|
- name: 'autoreconf'
|
|
if: ${{ matrix.build == 'AM' }}
|
|
run: autoreconf -fi
|
|
|
|
- name: 'configure'
|
|
if: ${{ matrix.target != 'maketgz' }}
|
|
env:
|
|
MATRIX_COMPILER: '${{ matrix.compiler }}'
|
|
run: |
|
|
options="${MATRIX_OPTIONS}"
|
|
cflags=''
|
|
if [[ ( "${MATRIX_CRYPTO}" = 'Libgcrypt' && "${MATRIX_ZLIB}" = 'OFF' ) || "${MATRIX_TEST}" = 'legacy-options' ]]; then
|
|
cflags+=' -DLIBSSH2_KEX_SHA1_ENABLE -DLIBSSH2_MD5_ENABLE -DLIBSSH2_MD5_PEM_ENABLE -DLIBSSH2_HMAC_SHA1_ENABLE -DLIBSSH2_HMAC_RIPEMD_ENABLE'
|
|
cflags+=' -DLIBSSH2_RSA_SHA1_ENABLE -DLIBSSH2_BLOWFISH_ENABLE -DLIBSSH2_RC4_ENABLE -DLIBSSH2_CAST_ENABLE -DLIBSSH2_3DES_ENABLE'
|
|
fi
|
|
if [ "${MATRIX_TARGET}" = 'distcheck' ]; then
|
|
cflags+=' -DLIBSSH2_DSA_ENABLE' # build test only, it cannot pass test in CI
|
|
fi
|
|
if [ "${MATRIX_BUILD}" = 'CM' ]; then
|
|
if [ "${MATRIX_CRYPTO}" = 'AWS-LC' ] || \
|
|
[ "${MATRIX_CRYPTO}" = 'BoringSSL' ] || \
|
|
[ "${MATRIX_CRYPTO}" = 'LibreSSL' ] || \
|
|
[[ "${MATRIX_CRYPTO}" = 'OpenSSL-'* ]]; then
|
|
crypto='OpenSSL'
|
|
elif [[ "${MATRIX_CRYPTO}" = 'mbedTLS-'* ]]; then
|
|
crypto='mbedTLS'
|
|
elif [[ "${MATRIX_CRYPTO}" = 'wolfSSL-'* ]]; then
|
|
crypto='wolfSSL'
|
|
else
|
|
crypto="${MATRIX_CRYPTO}"
|
|
fi
|
|
[ -d "$HOME"/usr ] && options+=" -DCMAKE_PREFIX_PATH=$HOME/usr"
|
|
if [ "${MATRIX_ARCH}" = 'i386' ]; then
|
|
options+=" -DCMAKE_SYSTEM_NAME=Linux -DCMAKE_SYSTEM_VERSION=1 -DCMAKE_SYSTEM_PROCESSOR=${MATRIX_ARCH}"
|
|
cflags+=' -m32'
|
|
fi
|
|
if [ "${MATRIX_COMPILER}" = 'clang-tidy' ]; then
|
|
options+=' -DLIBSSH2_CLANG_TIDY=ON -DCLANG_TIDY=/usr/bin/clang-tidy-22'
|
|
options+=' -DCMAKE_C_COMPILER=clang-22'
|
|
fi
|
|
if [[ "${MATRIX_CRYPTO}" =~ ^(OpenSSL|Libgcrypt|mbedTLS|wolfSSL)$ && "${MATRIX_COMPILER}" != 'clang-tidy' && "${MATRIX_ZLIB}" = 'ON' ]]; then
|
|
options+=' -DCMAKE_C_STANDARD=90'
|
|
cflags+=' -D_DEFAULT_SOURCE' # for glibc ISO mode, in tests: popen(), pclose(), in examples: fileno(), tcsetattr()
|
|
fi
|
|
cmake -B bld -G Ninja ${options} $TOOLCHAIN_OPTION \
|
|
-DCMAKE_C_FLAGS="${cflags}" \
|
|
-DCMAKE_UNITY_BUILD=ON \
|
|
-DENABLE_WERROR=ON \
|
|
-DCRYPTO_BACKEND=${crypto} \
|
|
-DENABLE_ZLIB_COMPRESSION="${MATRIX_ZLIB}"
|
|
else
|
|
export CFLAGS
|
|
if [ "${MATRIX_ARCH}" = 'i386' ]; then
|
|
options+=' --host=i686-pc-linux-gnu'
|
|
cflags+=' -m32'
|
|
fi
|
|
mkdir bld && cd bld
|
|
if [ "${MATRIX_ZLIB}" = 'OFF' ]; then
|
|
options+=' --with-libz=no'
|
|
else
|
|
options+=' --with-libz'
|
|
fi
|
|
if [ "${MATRIX_TARGET}" != 'distcheck' ]; then
|
|
options+=' --disable-examples-build'
|
|
fi
|
|
CFLAGS+=" ${cflags}"
|
|
../configure --enable-option-checking=fatal --enable-werror --enable-debug \
|
|
${options} \
|
|
--disable-dependency-tracking
|
|
fi
|
|
|
|
- name: 'configure log'
|
|
if: ${{ !cancelled() }}
|
|
run: cat bld/config.log bld/CMakeFiles/CMakeConfigureLog.yaml 2>/dev/null || true
|
|
|
|
- name: 'libssh2_config.h'
|
|
run: |
|
|
echo '::group::raw'; cat bld/src/libssh2_config.h || true; echo '::endgroup::'
|
|
grep -F '#define' bld/src/libssh2_config.h | sort || true
|
|
|
|
- name: 'build'
|
|
if: ${{ !matrix.target }}
|
|
run: |
|
|
if [ "${MATRIX_BUILD}" = 'CM' ]; then
|
|
cmake --build bld --verbose --target package
|
|
else
|
|
make -C bld V=1
|
|
fi
|
|
|
|
- name: 'tests'
|
|
if: ${{ !matrix.target && matrix.compiler != 'clang-tidy' }}
|
|
timeout-minutes: 10
|
|
env:
|
|
FIXTURE_CONTAINER_CMD: ${{ matrix.container || 'docker' }}
|
|
run: |
|
|
if [ "${MATRIX_BUILD}" = 'CM' ]; then
|
|
export OPENSSH_SERVER_IMAGE; OPENSSH_SERVER_IMAGE=ghcr.io/libssh2/ci_tests_openssh_server:$(git rev-parse --short=20 HEAD:tests/openssh_server)
|
|
[ -d "$HOME"/usr ] && export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$HOME/usr/lib"
|
|
cd bld && ctest --parallel 10 -VV --output-on-failure
|
|
else
|
|
make -C bld check V=1 || { cat bld/tests/*.log; false; }
|
|
fi
|
|
|
|
- name: 'build examples'
|
|
if: ${{ !matrix.target }}
|
|
run: |
|
|
if [ "${MATRIX_BUILD}" = 'CM' ]; then
|
|
cmake --build bld --target libssh2-examples-build
|
|
else
|
|
make -C bld examples
|
|
fi
|
|
|
|
- name: 'autotools distcheck'
|
|
if: ${{ matrix.target == 'distcheck' }}
|
|
timeout-minutes: 5
|
|
run: make -C bld distcheck
|
|
|
|
- name: 'autotools maketgz'
|
|
if: ${{ matrix.target == 'maketgz' }}
|
|
timeout-minutes: 5
|
|
run: |
|
|
export SOURCE_DATE_EPOCH=1711526400
|
|
./configure --enable-werror --disable-debug \
|
|
--disable-dependency-tracking
|
|
./scripts/maketgz 99.98.97
|
|
# Test reproducibility
|
|
mkdir run1; mv ./libssh2-99.98.97.* run1/
|
|
make clean
|
|
./scripts/maketgz 99.98.97
|
|
mkdir run2; cp -p ./libssh2-99.98.97.* run2/
|
|
diff run1 run2
|
|
# Test build from tarball
|
|
tar -xvf libssh2-99.98.97.tar.gz
|
|
cd libssh2-99.98.97
|
|
./configure --enable-option-checking=fatal --enable-werror --enable-debug --prefix="$HOME"/temp \
|
|
--disable-dependency-tracking
|
|
make install
|
|
cd ..
|
|
# Verify install
|
|
diff -u <(find libssh2-99.98.97/docs -name '*.3' -printf '%f\n' | sort) <(find "$HOME"/temp/share/man/man3 -name '*.3' -printf '%f\n' | sort)
|
|
diff -u <(find libssh2-99.98.97/include -name '*.h' -printf '%f\n' | sort) <(find "$HOME"/temp/include -name '*.h' -printf '%f\n' | sort)
|
|
rm -rf libssh2-99.98.97
|
|
|
|
build_linux_cross_mingw64:
|
|
name: "linux -> mingw-w64, ${{ matrix.build }} ${{ matrix.compiler }}"
|
|
runs-on: ubuntu-26.04-arm
|
|
timeout-minutes: 10
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
include:
|
|
- { build: 'AM', compiler: 'gcc' }
|
|
- { build: 'CM', compiler: 'gcc' }
|
|
- { build: 'CM', compiler: 'clang-tidy' }
|
|
env:
|
|
MATRIX_BUILD: '${{ matrix.build }}'
|
|
TRIPLET: 'x86_64-w64-mingw32'
|
|
steps:
|
|
- name: 'install packages'
|
|
timeout-minutes: 2
|
|
env:
|
|
INSTALL_PACKAGES: ${{ matrix.compiler == 'clang-tidy' && 'clang-22 clang-tidy-22' || '' }}
|
|
run: |
|
|
sudo find /etc/apt/sources.list.d -type f -not -name 'ubuntu.sources' -delete -print
|
|
sudo sed -i '/azure/d' /etc/apt/apt-mirrors.txt; cat /etc/apt/apt-mirrors.txt
|
|
sudo apt-get -o Dpkg::Use-Pty=0 update
|
|
sudo apt-get -o Dpkg::Use-Pty=0 install gcc-mingw-w64-x86-64-win32 ${INSTALL_PACKAGES}
|
|
|
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
with:
|
|
persist-credentials: false
|
|
|
|
- name: 'autoreconf'
|
|
if: ${{ matrix.build == 'AM' }}
|
|
run: autoreconf -fi
|
|
|
|
- name: 'configure'
|
|
env:
|
|
MATRIX_COMPILER: '${{ matrix.compiler }}'
|
|
run: |
|
|
if [ "${MATRIX_BUILD}" = 'CM' ]; then
|
|
if [ "${MATRIX_COMPILER}" = 'clang-tidy' ]; then
|
|
options+=' -DLIBSSH2_CLANG_TIDY=ON -DCLANG_TIDY=/usr/bin/clang-tidy-22'
|
|
options+=' -DCMAKE_C_COMPILER=clang-22'
|
|
options+=" -DCMAKE_RC_COMPILER=llvm-windres-$(clang-22 -dumpversion | cut -d '.' -f 1)"
|
|
options+=' -DCMAKE_RC_FLAGS=--target=pe-x86-64' # Required for non-x86-64 runners
|
|
else
|
|
options+=" -DCMAKE_C_COMPILER=${TRIPLET}-gcc"
|
|
fi
|
|
cmake -B bld -G Ninja \
|
|
-DCMAKE_SYSTEM_NAME=Windows \
|
|
-DCMAKE_C_COMPILER_TARGET="${TRIPLET}" \
|
|
-DCMAKE_UNITY_BUILD=ON \
|
|
-DENABLE_WERROR=ON \
|
|
-DENABLE_DEBUG_LOGGING=ON \
|
|
-DENABLE_ECDSA_WINCNG=ON \
|
|
${options}
|
|
else
|
|
mkdir bld && cd bld
|
|
../configure --enable-option-checking=fatal --enable-werror --enable-debug \
|
|
--host="${TRIPLET}" \
|
|
--disable-dependency-tracking --disable-examples-build
|
|
fi
|
|
|
|
- name: 'configure log'
|
|
if: ${{ !cancelled() }}
|
|
run: cat bld/config.log bld/CMakeFiles/CMakeConfigureLog.yaml 2>/dev/null || true
|
|
|
|
- name: 'libssh2_config.h'
|
|
run: |
|
|
echo '::group::raw'; cat bld/src/libssh2_config.h || true; echo '::endgroup::'
|
|
grep -F '#define' bld/src/libssh2_config.h | sort || true
|
|
|
|
- name: 'build'
|
|
run: |
|
|
if [ "${MATRIX_BUILD}" = 'CM' ]; then
|
|
cmake --build bld
|
|
else
|
|
make -C bld
|
|
fi
|
|
|
|
- name: 'build examples'
|
|
run: |
|
|
if [ "${MATRIX_BUILD}" = 'CM' ]; then
|
|
cmake --build bld --target libssh2-examples-build
|
|
else
|
|
make -C bld examples
|
|
fi
|
|
|
|
build_cygwin:
|
|
name: 'cygwin'
|
|
runs-on: windows-2022
|
|
timeout-minutes: 10
|
|
defaults:
|
|
run:
|
|
shell: D:\cygwin\bin\bash.exe '{0}' # zizmor: ignore[misfeature]
|
|
env:
|
|
MATRIX_BUILD: '${{ matrix.build }}'
|
|
SHELLOPTS: 'igncr'
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
include:
|
|
- { build: 'AM', platform: 'x86_64', compiler: 'gcc' }
|
|
- { build: 'CM', platform: 'x86_64', compiler: 'gcc' }
|
|
steps:
|
|
- uses: cygwin/cygwin-install-action@3f0a3f9f988f7e96b8c18098ae05eaec175f5b52 # v6.0.2
|
|
with:
|
|
platform: ${{ matrix.platform }}
|
|
work-vol: 'D:'
|
|
# https://cygwin.com/packages/
|
|
packages: ${{ matrix.build == 'AM' && 'autoconf automake libtool make' || 'cmake ninja' }} gcc-core gcc-g++ binutils libssl-devel zlib-devel
|
|
|
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
with:
|
|
persist-credentials: false
|
|
|
|
- name: 'autoreconf'
|
|
if: ${{ matrix.build == 'AM' }}
|
|
run: autoreconf -fi
|
|
|
|
- name: 'configure'
|
|
timeout-minutes: 2
|
|
run: |
|
|
PATH="/usr/bin:$(cygpath ${SYSTEMROOT})/System32"
|
|
if [ "${MATRIX_BUILD}" = 'CM' ]; then
|
|
cmake -B bld -G Ninja \
|
|
-DCMAKE_UNITY_BUILD=ON \
|
|
-DENABLE_WERROR=ON \
|
|
-DENABLE_DEBUG_LOGGING=ON \
|
|
-DCRYPTO_BACKEND=OpenSSL \
|
|
-DOPENSSL_ROOT_DIR=/usr/lib \
|
|
-DENABLE_ZLIB_COMPRESSION=ON \
|
|
-DBUILD_OSSFUZZ=ON \
|
|
-DRUN_DOCKER_TESTS=OFF \
|
|
-DRUN_SSHD_TESTS=OFF
|
|
else
|
|
mkdir bld && cd bld
|
|
../configure --enable-option-checking=fatal --enable-werror --enable-debug \
|
|
--with-crypto=openssl \
|
|
--disable-docker-tests \
|
|
--disable-dependency-tracking --disable-examples-build
|
|
fi
|
|
|
|
- name: 'configure log'
|
|
if: ${{ !cancelled() }}
|
|
run: cat bld/config.log bld/CMakeFiles/CMakeConfigureLog.yaml 2>/dev/null || true
|
|
|
|
- name: 'libssh2_config.h'
|
|
run: |
|
|
echo '::group::raw'; cat bld/src/libssh2_config.h || true; echo '::endgroup::'
|
|
grep -F '#define' bld/src/libssh2_config.h | sort || true
|
|
|
|
- name: 'build'
|
|
timeout-minutes: 5
|
|
run: |
|
|
PATH="/usr/bin:$(cygpath ${SYSTEMROOT})/System32"
|
|
if [ "${MATRIX_BUILD}" = 'CM' ]; then
|
|
cmake --build bld
|
|
else
|
|
make -C bld
|
|
fi
|
|
|
|
- name: 'tests'
|
|
timeout-minutes: 5
|
|
run: |
|
|
PATH="/usr/bin:$(cygpath ${SYSTEMROOT})/System32"
|
|
if [ "${MATRIX_BUILD}" = 'CM' ]; then
|
|
cd bld && ctest --parallel 10 -VV --output-on-failure
|
|
else
|
|
make -C bld check V=1 || { cat bld/tests/*.log; false; }
|
|
fi
|
|
|
|
- name: 'build examples'
|
|
run: |
|
|
if [ "${MATRIX_BUILD}" = 'CM' ]; then
|
|
cmake --build bld --target libssh2-examples-build
|
|
else
|
|
make -C bld examples
|
|
fi
|
|
|
|
build_msys2:
|
|
name: 'msys2'
|
|
runs-on: windows-2022
|
|
timeout-minutes: 10
|
|
cache-mode: write
|
|
defaults:
|
|
run:
|
|
shell: msys2 {0} # zizmor: ignore[misfeature]
|
|
env:
|
|
MATRIX_BUILD: '${{ matrix.build }}'
|
|
MATRIX_CRYPTO: '${{ matrix.crypto }}'
|
|
MATRIX_ENV: '${{ matrix.env }}'
|
|
MATRIX_TEST: '${{ matrix.test }}'
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
include:
|
|
- { build: 'AM', sys: msys , crypto: openssl, env: x86_64 }
|
|
- { build: 'CM', sys: msys , crypto: OpenSSL, env: x86_64 }
|
|
- { build: 'AM', sys: ucrt64 , crypto: wincng , env: ucrt-x86_64 }
|
|
- { build: 'CM', sys: mingw64, crypto: WinCNG , env: x86_64, test: 'legacy-options' }
|
|
- { build: 'AM', sys: ucrt64 , crypto: openssl, env: ucrt-x86_64 }
|
|
- { build: 'AM', sys: mingw32, crypto: openssl, env: i686, test: 'legacy-options' }
|
|
- { build: 'AM', sys: ucrt64 , crypto: openssl, env: ucrt-x86_64 }
|
|
- { build: 'AM', sys: clang64, crypto: openssl, env: clang-x86_64 }
|
|
- { build: 'AM', sys: clang64, crypto: wincng , env: clang-x86_64, test: 'unicode' }
|
|
- { build: 'CM', sys: ucrt64 , crypto: OpenSSL, env: ucrt-x86_64 }
|
|
- { build: 'CM', sys: clang64, crypto: OpenSSL, env: clang-x86_64 }
|
|
- { build: 'CM', sys: clang64, crypto: OpenSSL, env: clang-x86_64, test: 'no-options' }
|
|
- { build: 'CM', sys: ucrt64 , crypto: OpenSSL, env: ucrt-x86_64, test: 'uwp' }
|
|
|
|
steps:
|
|
- uses: msys2/setup-msys2@ec48f7c5447b3140e2b088413ae3a55687bccb6e # v2.33.0
|
|
if: ${{ matrix.sys == 'msys' }}
|
|
with:
|
|
msystem: ${{ matrix.sys }}
|
|
install: gcc ${{ matrix.build == 'AM' && 'autotools make' || 'cmake ninja' }} openssl-devel zlib-devel
|
|
- uses: msys2/setup-msys2@ec48f7c5447b3140e2b088413ae3a55687bccb6e # v2.33.0
|
|
if: ${{ matrix.sys != 'msys' }}
|
|
with:
|
|
msystem: ${{ matrix.sys }}
|
|
suppress-deprecation-warnings: 'msystem-mingw64 msystem-mingw32'
|
|
install: >-
|
|
mingw-w64-${{ matrix.env }}-cc
|
|
mingw-w64-${{ matrix.env }}-${{ matrix.build == 'AM' && 'autotools' || 'cmake' }} ${{ matrix.build == 'AM' && 'make' || '' }}
|
|
mingw-w64-${{ matrix.env }}-openssl
|
|
|
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
with:
|
|
persist-credentials: false
|
|
|
|
- name: 'autoreconf'
|
|
if: ${{ matrix.build == 'AM' }}
|
|
run: autoreconf -fi
|
|
|
|
- name: 'configure'
|
|
env:
|
|
SSHD: 'C:/Program Files/Git/usr/bin/sshd.exe'
|
|
run: |
|
|
cflags=''
|
|
if [ "${MATRIX_TEST}" = 'legacy-options' ]; then
|
|
cflags+=' -DLIBSSH2_KEX_SHA1_ENABLE -DLIBSSH2_MD5_ENABLE -DLIBSSH2_MD5_PEM_ENABLE -DLIBSSH2_HMAC_SHA1_ENABLE -DLIBSSH2_HMAC_RIPEMD_ENABLE'
|
|
cflags+=' -DLIBSSH2_RSA_SHA1_ENABLE -DLIBSSH2_BLOWFISH_ENABLE -DLIBSSH2_RC4_ENABLE -DLIBSSH2_CAST_ENABLE -DLIBSSH2_3DES_ENABLE'
|
|
cflags+=' -DLIBSSH2_DSA_ENABLE'
|
|
fi
|
|
if [ "${MATRIX_BUILD}" = 'CM' ]; then
|
|
if [[ "${MATRIX_ENV}" = 'clang'* ]]; then
|
|
options=' -DCMAKE_C_COMPILER=clang'
|
|
else
|
|
options=' -DCMAKE_C_COMPILER=gcc'
|
|
fi
|
|
if [ "${MATRIX_TEST}" = 'uwp' ]; then
|
|
options+=' -DCMAKE_SYSTEM_NAME=WindowsStore -DCMAKE_SYSTEM_VERSION=10.0'
|
|
cflags+=' -DWINSTORECOMPAT -DWINAPI_FAMILY=WINAPI_FAMILY_APP -D_WIN32_WINNT=0x0a00'
|
|
if [[ "${MATRIX_ENV}" != 'clang'* ]]; then
|
|
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=$(cygpath -w "${specs}")"
|
|
fi
|
|
elif [ "${MATRIX_TEST}" = 'no-options' ]; then
|
|
options+=' -DLIBSSH2_NO_DEPRECATED=ON'
|
|
cflags+=' -DLIBSSH2_NO_AES_CBC -DLIBSSH2_NO_AES_CTR'
|
|
fi
|
|
if [[ "${MATRIX_TEST}" = *'unicode'* ]]; then
|
|
options+=' -DENABLE_UNICODE=ON'
|
|
fi
|
|
cmake -B bld -G Ninja ${options} \
|
|
-DCMAKE_C_FLAGS="${cflags}" \
|
|
-DCMAKE_UNITY_BUILD=ON \
|
|
-DENABLE_WERROR=ON \
|
|
-DENABLE_DEBUG_LOGGING=ON \
|
|
-DCRYPTO_BACKEND="${MATRIX_CRYPTO}" \
|
|
-DENABLE_ZLIB_COMPRESSION=ON \
|
|
-DRUN_DOCKER_TESTS=OFF \
|
|
-DRUN_SSHD_TESTS=OFF \
|
|
-DCMAKE_VERBOSE_MAKEFILE=ON
|
|
else
|
|
export CFLAGS
|
|
if [ "${MATRIX_CRYPTO}" = 'wincng' ] && [[ "${MATRIX_ENV}" = 'clang'* ]]; then
|
|
options=' --enable-ecdsa-wincng'
|
|
fi
|
|
if [[ "${MATRIX_TEST}" = *'unicode'* ]]; then
|
|
options+=' --enable-windows-unicode'
|
|
fi
|
|
CFLAGS+=" ${cflags}"
|
|
# sshd tests sometimes hang
|
|
mkdir bld && cd bld
|
|
../configure --enable-option-checking=fatal --enable-werror --enable-debug \
|
|
--with-crypto="${MATRIX_CRYPTO}" \
|
|
--disable-docker-tests \
|
|
--disable-sshd-tests \
|
|
${options} \
|
|
--disable-dependency-tracking --disable-examples-build
|
|
fi
|
|
|
|
- name: 'configure log'
|
|
if: ${{ !cancelled() }}
|
|
run: cat bld/config.log bld/CMakeFiles/CMakeConfigureLog.yaml 2>/dev/null || true
|
|
|
|
- name: 'libssh2_config.h'
|
|
run: |
|
|
echo '::group::raw'; cat bld/src/libssh2_config.h || true; echo '::endgroup::'
|
|
grep -F '#define' bld/src/libssh2_config.h | sort || true
|
|
|
|
- name: 'build'
|
|
run: |
|
|
if [ "${MATRIX_BUILD}" = 'CM' ]; then
|
|
cmake --build bld --verbose
|
|
else
|
|
make -C bld V=1
|
|
fi
|
|
|
|
- name: 'tests'
|
|
timeout-minutes: 10
|
|
run: |
|
|
if [ "${MATRIX_BUILD}" = 'CM' ]; then
|
|
if [ "${MATRIX_TEST}" != 'uwp' ]; then # UWP missing 'msvcr120_app.dll', fails with exit code 0xc0000135
|
|
cd bld && ctest --parallel 10 -VV --output-on-failure
|
|
fi
|
|
else
|
|
make -C bld check V=1 || { cat bld/tests/*.log; false; }
|
|
fi
|
|
|
|
- name: 'build examples'
|
|
run: |
|
|
if [ "${MATRIX_BUILD}" = 'CM' ]; then
|
|
cmake --build bld --target libssh2-examples-build
|
|
else
|
|
make -C bld examples
|
|
fi
|
|
|
|
build_msvc:
|
|
name: 'msvc'
|
|
runs-on: '${{ matrix.image }}'
|
|
timeout-minutes: 10
|
|
defaults:
|
|
run:
|
|
shell: bash
|
|
env:
|
|
MATRIX_TYPE: '${{ matrix.type }}'
|
|
VCPKG_DISABLE_METRICS: '1'
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
include:
|
|
- { image: 'windows-2022', arch: x64 , plat: windows, type: Debug , crypto: WinCNG , wincng_ecdsa: 'OFF', log: 'OFF', shared: 'OFF', zlib: 'OFF', unity: 'ON' }
|
|
- { image: 'windows-2025', arch: x64 , plat: windows, type: Debug , crypto: WinCNG , wincng_ecdsa: 'ON' , log: 'ON' , shared: 'ON' , zlib: 'OFF', unity: 'ON' }
|
|
- { image: 'windows-2022', arch: x64 , plat: windows, type: Release, crypto: OpenSSL, wincng_ecdsa: 'OFF', log: 'OFF', shared: 'ON' , zlib: 'OFF', unity: 'ON' }
|
|
- { image: 'windows-2022', arch: x64 , plat: uwp , type: Release, crypto: WinCNG , wincng_ecdsa: 'OFF', log: 'OFF', shared: 'ON' , zlib: 'OFF', unity: 'ON' }
|
|
- { image: 'windows-2022', arch: arm64, plat: windows, type: Release, crypto: WinCNG , wincng_ecdsa: 'ON' , log: 'OFF', shared: 'ON' , zlib: 'OFF', unity: 'ON' }
|
|
- { image: 'windows-2025', arch: arm64, plat: uwp , type: Debug , crypto: WinCNG , wincng_ecdsa: 'OFF', log: 'OFF', shared: 'ON' , zlib: 'OFF', unity: 'OFF' }
|
|
- { image: 'windows-2022', arch: x86 , plat: windows, type: Debug , crypto: WinCNG , wincng_ecdsa: 'OFF', log: 'OFF', shared: 'ON' , zlib: 'OFF', unity: 'ON' }
|
|
steps:
|
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
with:
|
|
persist-credentials: false
|
|
|
|
- name: 'configure'
|
|
env:
|
|
MATRIX_ARCH: '${{ matrix.arch }}'
|
|
MATRIX_CRYPTO: '${{ matrix.crypto }}'
|
|
MATRIX_PLAT: '${{ matrix.plat }}'
|
|
MATRIX_WINCND_ECDSA: '${{ matrix.wincng_ecdsa }}'
|
|
MATRIX_LOG: '${{ matrix.log }}'
|
|
MATRIX_SHARED: '${{ matrix.shared }}'
|
|
MATRIX_ZLIB: '${{ matrix.zlib }}'
|
|
MATRIX_UNITY: '${{ matrix.unity }}'
|
|
run: |
|
|
options=''
|
|
archgen="${MATRIX_ARCH}"; [ "${archgen}" = 'x86' ] && archgen='Win32'
|
|
if [ "${MATRIX_PLAT}" = 'uwp' ]; then
|
|
options+=' -DCMAKE_SYSTEM_NAME=WindowsStore -DCMAKE_SYSTEM_VERSION=10.0'
|
|
cflags+=' -DWINAPI_FAMILY=WINAPI_FAMILY_PC_APP'
|
|
ldflags+=' -OPT:NOREF -OPT:NOICF -APPCONTAINER:NO'
|
|
vsglobals=';AppxPackage=false;WindowsAppContainer=false'
|
|
fi
|
|
if [ "${MATRIX_CRYPTO}" = 'WinCNG' ]; then
|
|
options+=" -DENABLE_ECDSA_WINCNG=${MATRIX_WINCND_ECDSA}"
|
|
cflags+=' -DLIBSSH2_KEX_SHA1_ENABLE -DLIBSSH2_MD5_ENABLE -DLIBSSH2_MD5_PEM_ENABLE -DLIBSSH2_HMAC_SHA1_ENABLE'
|
|
cflags+=' -DLIBSSH2_RSA_SHA1_ENABLE -DLIBSSH2_BLOWFISH_ENABLE -DLIBSSH2_RC4_ENABLE -DLIBSSH2_3DES_ENABLE'
|
|
cflags+=' -DLIBSSH2_DSA_ENABLE'
|
|
fi
|
|
cmake -B bld ${options} \
|
|
-DCMAKE_C_FLAGS="${cflags}" \
|
|
-DCMAKE_EXE_LINKER_FLAGS="${ldflags}" \
|
|
-DCMAKE_SHARED_LINKER_FLAGS="${ldflags}" \
|
|
-DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake \
|
|
-DCMAKE_GENERATOR_PLATFORM=${archgen} \
|
|
-DVCPKG_TARGET_TRIPLET="${MATRIX_ARCH}-${MATRIX_PLAT}" \
|
|
-DVCPKG_APPLOCAL_DEPS=OFF \
|
|
-DCMAKE_VS_GLOBALS="TrackFileAccess=false${vsglobals}" \
|
|
-DCMAKE_UNITY_BUILD="${MATRIX_UNITY}" \
|
|
-DENABLE_WERROR=ON \
|
|
-DENABLE_DEBUG_LOGGING="${MATRIX_LOG}" \
|
|
-DBUILD_SHARED_LIBS="${MATRIX_SHARED}" \
|
|
-DCRYPTO_BACKEND="${MATRIX_CRYPTO}" \
|
|
-DENABLE_ZLIB_COMPRESSION="${MATRIX_ZLIB}" \
|
|
-DRUN_DOCKER_TESTS=OFF \
|
|
-DRUN_SSHD_TESTS=OFF
|
|
|
|
- name: 'configure log'
|
|
if: ${{ !cancelled() }}
|
|
run: cat bld/CMakeFiles/CMakeConfigureLog.yaml 2>/dev/null || true
|
|
|
|
- name: 'libssh2_config.h'
|
|
run: |
|
|
echo '::group::raw'; cat bld/src/libssh2_config.h || true; echo '::endgroup::'
|
|
grep -F '#define' bld/src/libssh2_config.h | sort || true
|
|
|
|
- name: 'build'
|
|
run: cmake --build bld --config "${MATRIX_TYPE}" --parallel 5 --target package
|
|
|
|
- name: 'tests'
|
|
# UWP binaries require a CRT DLL that is not found. Static CRT not supported.
|
|
if: ${{ matrix.arch != 'arm64' && matrix.plat != 'uwp' }}
|
|
timeout-minutes: 10
|
|
run: cd bld && ctest --parallel 10 -VV -C "${MATRIX_TYPE}" --output-on-failure
|
|
|
|
- name: 'build examples'
|
|
run: cmake --build bld --config "${MATRIX_TYPE}" --parallel 5 --target libssh2-examples-build
|
|
|
|
- name: 'disk space used'
|
|
run: du -sh .; echo; du -sh -t 250KB ./*; echo; du -h -t 250KB bld
|
|
|
|
build_macos:
|
|
name: 'macOS (${{ matrix.build }}, ${{ matrix.crypto.name }})'
|
|
runs-on: macos-latest
|
|
timeout-minutes: 10
|
|
env:
|
|
MAKEFLAGS: -j 4
|
|
MATRIX_BUILD: '${{ matrix.build }}'
|
|
MATRIX_INSTALL: '${{ matrix.crypto.install }}'
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
build: ['AM', 'CM']
|
|
crypto:
|
|
- name: 'Libgcrypt'
|
|
install: libgcrypt
|
|
configure: --with-crypto=libgcrypt --with-libgcrypt-prefix=/opt/homebrew
|
|
cmake: -DCRYPTO_BACKEND=Libgcrypt
|
|
- name: 'LibreSSL'
|
|
install: libressl
|
|
configure: --with-crypto=openssl --with-libssl-prefix=/opt/homebrew/opt/libressl
|
|
cmake: -DCRYPTO_BACKEND=OpenSSL -DOPENSSL_ROOT_DIR=/opt/homebrew/opt/libressl
|
|
- name: 'mbedTLS'
|
|
install: mbedtls@3
|
|
configure: --with-crypto=mbedtls --with-libmbedcrypto-prefix=/opt/homebrew
|
|
cmake: -DCRYPTO_BACKEND=mbedTLS
|
|
- name: 'OpenSSL 4'
|
|
install: openssl@4
|
|
configure: --with-crypto=openssl --with-libssl-prefix=/opt/homebrew/opt/openssl@4
|
|
cmake: -DCRYPTO_BACKEND=OpenSSL -DOPENSSL_ROOT_DIR=/opt/homebrew/opt/openssl@4
|
|
- name: 'OpenSSL 3'
|
|
install: openssl@3
|
|
configure: --with-crypto=openssl --with-libssl-prefix=/opt/homebrew/opt/openssl@3 CFLAGS=-std=c90
|
|
cmake: -DCRYPTO_BACKEND=OpenSSL -DOPENSSL_ROOT_DIR=/opt/homebrew/opt/openssl@3 -DCMAKE_C_STANDARD=90
|
|
- name: 'wolfSSL'
|
|
install: wolfssl
|
|
configure: --with-crypto=wolfssl --with-libwolfssl-prefix=/opt/homebrew
|
|
cmake: -DCRYPTO_BACKEND=wolfSSL
|
|
steps:
|
|
- name: 'install packages'
|
|
env:
|
|
INSTALL_PACKAGES: ${{ matrix.build == 'AM' && 'automake libtool' || '' }}
|
|
run: brew install ${INSTALL_PACKAGES} ${MATRIX_INSTALL}
|
|
|
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
with:
|
|
persist-credentials: false
|
|
|
|
- name: 'autoreconf'
|
|
if: ${{ matrix.build == 'AM' }}
|
|
run: autoreconf -fi
|
|
|
|
- name: 'configure'
|
|
env:
|
|
MATRIX_CONFIGURE: '${{ matrix.crypto.configure }}'
|
|
MATRIX_GENERATE: '${{ matrix.crypto.cmake }}'
|
|
run: |
|
|
if [ "${MATRIX_BUILD}" = 'CM' ]; then
|
|
if [ "${MATRIX_INSTALL}" = 'mbedtls@3' ]; then
|
|
export PKG_CONFIG_PATH; PKG_CONFIG_PATH="$(brew --prefix mbedtls@3)"/lib/pkgconfig
|
|
fi
|
|
cmake -B bld -G Ninja ${MATRIX_GENERATE} \
|
|
-DCMAKE_UNITY_BUILD=ON \
|
|
-DENABLE_WERROR=ON \
|
|
-DENABLE_DEBUG_LOGGING=ON \
|
|
-DENABLE_ZLIB_COMPRESSION=ON \
|
|
-DRUN_DOCKER_TESTS=OFF \
|
|
-DRUN_SSHD_TESTS=OFF
|
|
else
|
|
if [ "${MATRIX_INSTALL}" = 'mbedtls@3' ]; then
|
|
export CPPFLAGS; CPPFLAGS=-I"$(brew --prefix mbedtls@3)"/include
|
|
export LDFLAGS; LDFLAGS=-L"$(brew --prefix mbedtls@3)"/lib
|
|
fi
|
|
mkdir bld && cd bld
|
|
../configure --enable-option-checking=fatal --enable-werror --enable-debug \
|
|
--with-libz ${MATRIX_CONFIGURE} \
|
|
--disable-docker-tests \
|
|
--disable-sshd-tests \
|
|
--disable-dependency-tracking --disable-examples-build
|
|
fi
|
|
|
|
- name: 'configure log'
|
|
if: ${{ !cancelled() }}
|
|
run: cat bld/config.log bld/CMakeFiles/CMakeConfigureLog.yaml 2>/dev/null || true
|
|
|
|
- name: 'libssh2_config.h'
|
|
run: |
|
|
echo '::group::raw'; cat bld/src/libssh2_config.h || true; echo '::endgroup::'
|
|
grep -F '#define' bld/src/libssh2_config.h | sort || true
|
|
|
|
- name: 'build'
|
|
run: |
|
|
if [ "${MATRIX_BUILD}" = 'CM' ]; then
|
|
cmake --build bld --verbose
|
|
else
|
|
make -C bld -j4 V=1
|
|
fi
|
|
|
|
- name: 'tests'
|
|
timeout-minutes: 10
|
|
run: |
|
|
if [ "${MATRIX_BUILD}" = 'CM' ]; then
|
|
cd bld && ctest --parallel 8 -VV --output-on-failure
|
|
else
|
|
make -C bld check V=1 || { cat bld/tests/*.log; false; }
|
|
fi
|
|
|
|
- name: 'build examples'
|
|
run: |
|
|
if [ "${MATRIX_BUILD}" = 'CM' ]; then
|
|
cmake --build bld --verbose --target libssh2-examples-build
|
|
else
|
|
make -C bld V=1 examples
|
|
fi
|
|
|
|
cross:
|
|
name: "Cross ${{ matrix.os }} ${{ matrix.version }}, ${{ matrix.build }} ${{ matrix.cc }} ${{ matrix.desc }} ${{ matrix.arch }}"
|
|
runs-on: ubuntu-26.04
|
|
timeout-minutes: 10
|
|
defaults:
|
|
run:
|
|
shell: cpa.sh {0} # zizmor: ignore[misfeature]
|
|
env:
|
|
CC: '${{ matrix.cc }}'
|
|
MAKEFLAGS: -j 3
|
|
MATRIX_BUILD: '${{ matrix.build }}'
|
|
MATRIX_INSTALL: '${{ matrix.install }}'
|
|
MATRIX_OPTIONS: '${{ matrix.options }}'
|
|
MATRIX_OS: '${{ matrix.os }}'
|
|
strategy:
|
|
matrix:
|
|
include:
|
|
# https://github.com/DragonFlyBSD/DPorts
|
|
- { os: 'dragonflybsd', version: '6.4.2', build: 'AM', arch: 'x86_64', cc: 'gcc' , desc: 'libgcrypt skiprun',
|
|
install: 'autoconf automake libtool libgcrypt',
|
|
options: '--with-crypto=libgcrypt --with-libgcrypt-prefix=/usr/local' }
|
|
|
|
# https://ports.freebsd.org/
|
|
- { os: 'freebsd' , version: '15.1', build: 'AM', arch: 'x86_64', cc: 'clang', desc: 'openssl',
|
|
install: 'autoconf automake libtool gettext',
|
|
options: '--with-crypto=openssl' }
|
|
|
|
- { os: 'freebsd' , version: '14.5', build: 'CM', arch: 'arm64' , cc: 'clang', desc: 'openssl skiprun',
|
|
install: 'cmake-core ninja',
|
|
options: '-DCRYPTO_BACKEND=OpenSSL' }
|
|
|
|
# https://app.midnightbsd.org/
|
|
# https://man.midnightbsd.org/cgi-bin/man.cgi/mport
|
|
- { os: 'midnightbsd' , version: '4.0.4', build: 'CM', arch: 'x86_64', cc: 'clang', desc: 'gnutls skiprun',
|
|
install: 'cmake-core ninja',
|
|
options: '-DCRYPTO_BACKEND=OpenSSL' }
|
|
|
|
# https://pkgsrc.se/
|
|
- { os: 'netbsd' , version: '10.1' , build: 'CM', arch: 'x86_64', cc: 'gcc' , desc: 'openssl skiprun',
|
|
install: 'cmake ninja-build',
|
|
options: '-DCRYPTO_BACKEND=OpenSSL' }
|
|
|
|
- { os: 'netbsd' , version: '11.0' , build: 'CM', arch: 'arm64' , cc: 'gcc' , desc: 'openssl skiprun',
|
|
install: 'cmake ninja-build',
|
|
options: '-DCRYPTO_BACKEND=OpenSSL' }
|
|
|
|
# https://openbsd.app/
|
|
# https://www.openbsd.org/faq/faq15.html
|
|
- { os: 'openbsd' , version: '7.9' , build: 'CM', arch: 'x86_64', cc: 'clang', desc: 'libressl skiprun',
|
|
install: 'cmake ninja',
|
|
options: '-DCRYPTO_BACKEND=OpenSSL' }
|
|
|
|
fail-fast: false
|
|
steps:
|
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
with:
|
|
persist-credentials: false
|
|
|
|
- name: 'setup VM'
|
|
uses: cross-platform-actions/action@e0b9770014ba65d5e0815f15b74031c3a635f641 # v1.6.0
|
|
with:
|
|
environment_variables: 'CC CURL_CI CURL_TEST_MIN DO_NOT_TRACK MAKEFLAGS MATRIX_BUILD MATRIX_INSTALL MATRIX_OPTIONS MATRIX_OS'
|
|
operating_system: '${{ matrix.os }}'
|
|
version: '${{ matrix.version }}'
|
|
architecture: '${{ matrix.arch }}'
|
|
|
|
- name: 'install prereqs'
|
|
run: |
|
|
if [ "${MATRIX_OS}" = 'dragonflybsd' ]; then
|
|
sudo pkg install -y ${MATRIX_INSTALL}
|
|
elif [ "${MATRIX_OS}" = 'freebsd' ]; then
|
|
sudo pkg install -y ${MATRIX_INSTALL}
|
|
elif [ "${MATRIX_OS}" = 'midnightbsd' ]; then
|
|
sudo mport install ${MATRIX_INSTALL} | grep -v -E '(Downloading.+%|^/usr/local)' || true
|
|
if [ "${MATRIX_BUILD}" = 'CM' ]; then
|
|
command -v cmake >/dev/null 2>&1
|
|
else
|
|
command -v make >/dev/null 2>&1
|
|
fi
|
|
elif [ "${MATRIX_OS}" = 'netbsd' ]; then
|
|
sudo pkgin -y install ${MATRIX_INSTALL}
|
|
elif [ "${MATRIX_OS}" = 'openbsd' ]; then
|
|
sudo pkg_add -I ${MATRIX_INSTALL}
|
|
fi
|
|
|
|
- name: 'autoreconf'
|
|
if: ${{ matrix.build == 'AM' }}
|
|
run: autoreconf -fi
|
|
|
|
- name: 'configure'
|
|
run: |
|
|
if [ "${MATRIX_BUILD}" = 'CM' ]; then
|
|
cmake -B bld -G Ninja \
|
|
-DCMAKE_UNITY_BUILD=ON \
|
|
-DENABLE_WERROR=ON \
|
|
-DENABLE_DEBUG_LOGGING=ON \
|
|
-DBUILD_STATIC_LIBS=OFF \
|
|
-DRUN_DOCKER_TESTS=OFF \
|
|
-DRUN_SSHD_TESTS=OFF \
|
|
${MATRIX_OPTIONS}
|
|
else
|
|
mkdir bld && cd bld
|
|
../configure --enable-option-checking=fatal --enable-werror --enable-debug \
|
|
--disable-docker-tests \
|
|
--disable-dependency-tracking --disable-examples-build \
|
|
${MATRIX_OPTIONS}
|
|
fi
|
|
|
|
- name: 'configure log'
|
|
if: ${{ !cancelled() }}
|
|
run: cat bld/config.log bld/CMakeFiles/CMakeConfigureLog.yaml 2>/dev/null || true
|
|
|
|
- name: 'libssh2_config.h'
|
|
run: |
|
|
echo '::group::raw'; cat bld/src/libssh2_config.h || true; echo '::endgroup::'
|
|
grep -F '#define' bld/src/libssh2_config.h | sort || true
|
|
|
|
- name: 'build'
|
|
run: |
|
|
if [ "${MATRIX_BUILD}" = 'CM' ]; then
|
|
cmake --build bld
|
|
else
|
|
make -C bld
|
|
fi
|
|
|
|
- name: 'tests'
|
|
if: ${{ matrix.arch == 'x86_64' && !contains(matrix.desc, 'skiprun') }} # Slow on emulated CPU
|
|
run: |
|
|
if [ "${MATRIX_BUILD}" = 'CM' ]; then
|
|
cmake --build bld --verbose --target test-ci
|
|
else
|
|
make -C bld check V=1 || { cat bld/tests/*.log; false; }
|
|
fi
|
|
|
|
- name: 'build examples'
|
|
run: |
|
|
if [ "${MATRIX_BUILD}" = 'CM' ]; then
|
|
cmake --build bld --target libssh2-examples-build
|
|
else
|
|
make -C bld examples
|
|
fi
|
|
|
|
build_curl:
|
|
name: 'curl, CM ${{ matrix.arch }}-${{ matrix.plat }} ${{ matrix.name }}'
|
|
runs-on: '${{ matrix.image }}'
|
|
timeout-minutes: 10
|
|
cache-mode: write
|
|
defaults:
|
|
run:
|
|
shell: msys2 {0} # zizmor: ignore[misfeature]
|
|
env:
|
|
CURL_VERNUM: '8.22.0'
|
|
CURL_SHA256: f7ef3ae8a22e521f289803fe93543eb64c329b58aa73a9e224dfd915a2a5f4f7
|
|
OPENSSH_WINDOWS_VERSION: 10.0.0.0p2-Preview
|
|
OPENSSH_WINDOWS_SHA256_ARM64: 698c6aec31c1dd0fb996206e8741f4531a97355686b5431ef347d531b07fcd42
|
|
OPENSSH_WINDOWS_SHA256_WIN64: 23f50f3458c4c5d0b12217c6a5ddfde0137210a30fa870e98b29827f7b43aba5
|
|
MATRIX_ARCH: '${{ matrix.arch }}'
|
|
MATRIX_CRYPTO: '${{ matrix.crypto }}'
|
|
MATRIX_IMAGE: '${{ matrix.image }}'
|
|
MATRIX_OPENSSH: '${{ matrix.openssh }}'
|
|
MATRIX_TYPE: '${{ matrix.type }}'
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
include:
|
|
- { image: 'windows-2025' , arch: x64 , plat: windows, type: Debug , crypto: WinCNG , wincng_ecdsa: 'ON' , log: 'ON' , shared: 'OFF', zlib: 'OFF', unity: 'ON',
|
|
name: 'WinCNG ECDSA' }
|
|
- { image: 'windows-11-arm', arch: arm64, plat: windows, type: Debug , crypto: WinCNG , wincng_ecdsa: 'OFF', log: 'ON' , shared: 'OFF', zlib: 'OFF', unity: 'ON',
|
|
name: 'WinCNG !ECDSA', openssh: 'OpenSSH-Windows' }
|
|
steps:
|
|
- uses: msys2/setup-msys2@ec48f7c5447b3140e2b088413ae3a55687bccb6e # v2.33.0
|
|
with:
|
|
msystem: ${{ matrix.arch == 'arm64' && 'clangarm64' || 'ucrt64' }}
|
|
release: false
|
|
path-type: inherit
|
|
install: perl
|
|
|
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
with:
|
|
persist-credentials: false
|
|
|
|
- name: 'configure'
|
|
env:
|
|
MATRIX_PLAT: '${{ matrix.plat }}'
|
|
MATRIX_WINCND_ECDSA: '${{ matrix.wincng_ecdsa }}'
|
|
MATRIX_LOG: '${{ matrix.log }}'
|
|
MATRIX_SHARED: '${{ matrix.shared }}'
|
|
MATRIX_ZLIB: '${{ matrix.zlib }}'
|
|
MATRIX_UNITY: '${{ matrix.unity }}'
|
|
run: |
|
|
options=''
|
|
if [ "${MATRIX_CRYPTO}" = 'WinCNG' ]; then
|
|
options+=" -DENABLE_ECDSA_WINCNG=${MATRIX_WINCND_ECDSA}"
|
|
cflags+=' -DLIBSSH2_KEX_SHA1_ENABLE -DLIBSSH2_MD5_ENABLE -DLIBSSH2_MD5_PEM_ENABLE -DLIBSSH2_HMAC_SHA1_ENABLE'
|
|
cflags+=' -DLIBSSH2_RSA_SHA1_ENABLE -DLIBSSH2_BLOWFISH_ENABLE -DLIBSSH2_RC4_ENABLE -DLIBSSH2_3DES_ENABLE'
|
|
cflags+=' -DLIBSSH2_DSA_ENABLE'
|
|
fi
|
|
cmake -B bld ${options} \
|
|
-DCMAKE_INSTALL_PREFIX="$HOME"/libssh2-install \
|
|
-DCMAKE_C_FLAGS="${cflags}" \
|
|
-DCMAKE_GENERATOR_PLATFORM="${MATRIX_ARCH}" \
|
|
-DCMAKE_VS_GLOBALS=TrackFileAccess=false \
|
|
-DCMAKE_UNITY_BUILD="${MATRIX_UNITY}" \
|
|
-DENABLE_WERROR=ON \
|
|
-DENABLE_DEBUG_LOGGING="${MATRIX_LOG}" \
|
|
-DBUILD_SHARED_LIBS="${MATRIX_SHARED}" \
|
|
-DCRYPTO_BACKEND="${MATRIX_CRYPTO}" \
|
|
-DENABLE_ZLIB_COMPRESSION="${MATRIX_ZLIB}" \
|
|
-DLIBSSH2_BUILD_DOCS=OFF \
|
|
-DBUILD_EXAMPLES=OFF \
|
|
-DBUILD_TESTING=OFF
|
|
|
|
- name: 'configure log'
|
|
if: ${{ !cancelled() }}
|
|
run: cat bld/CMakeFiles/CMakeConfigureLog.yaml 2>/dev/null || true
|
|
|
|
- name: 'libssh2_config.h'
|
|
run: |
|
|
echo '::group::raw'; cat bld/src/libssh2_config.h || true; echo '::endgroup::'
|
|
grep -F '#define' bld/src/libssh2_config.h | sort || true
|
|
|
|
- name: 'build'
|
|
run: cmake --build bld --config "${MATRIX_TYPE}" --parallel 5
|
|
|
|
- name: 'install'
|
|
run: cmake --install bld --config "${MATRIX_TYPE}" --verbose
|
|
|
|
- name: 'install curl from source'
|
|
run: |
|
|
curl --disable --fail --silent --show-error --connect-timeout 15 --max-time 120 --retry 6 --retry-connrefused \
|
|
--location --proto-redir =https "https://github.com/curl/curl/releases/download/curl-${CURL_VERNUM//./_}/curl-${CURL_VERNUM}.tar.xz" --output pkg.bin
|
|
sha256sum pkg.bin && sha256sum pkg.bin | grep -qwF -- "${CURL_SHA256}" && tar -xJf pkg.bin && rm -f pkg.bin
|
|
cd "curl-${CURL_VERNUM}"
|
|
cmake -B bld -DBUILD_SHARED_LIBS=OFF -DCURL_USE_LIBPSL=OFF -DCURL_ENABLE_SSL=OFF -DENABLE_DEBUG=ON \
|
|
-DBUILD_LIBCURL_DOCS=OFF -DBUILD_MISC_DOCS=OFF -DENABLE_CURL_MANUAL=OFF -DCURL_DISABLE_TYPECHECK=ON \
|
|
-DCMAKE_GENERATOR_PLATFORM="${MATRIX_ARCH}" \
|
|
-DCMAKE_VS_GLOBALS=TrackFileAccess=false \
|
|
-DCMAKE_C_FLAGS=-DCURL_LIBSSH2_DEBUG \
|
|
-DCMAKE_UNITY_BUILD=ON -DCURL_DROP_UNUSED=ON -DCURL_WERROR=ON \
|
|
-DCURL_DISABLE_DICT=ON -DCURL_DISABLE_FILE=ON -DCURL_DISABLE_FTP=ON -DCURL_DISABLE_GOPHER=ON -DCURL_DISABLE_HTTP=ON -DCURL_DISABLE_IMAP=ON \
|
|
-DCURL_DISABLE_IPFS=ON -DCURL_DISABLE_LDAP=ON -DCURL_DISABLE_LDAPS=ON -DCURL_DISABLE_MQTT=ON -DCURL_DISABLE_POP3=ON \
|
|
-DCURL_DISABLE_RTSP=ON -DCURL_DISABLE_SMTP=ON -DCURL_DISABLE_TELNET=ON -DCURL_DISABLE_TFTP=ON -DCURL_DISABLE_WEBSOCKETS=ON \
|
|
-DLIBSSH2_INCLUDE_DIR="$(cygpath --mixed "$HOME"/libssh2-install/include)" \
|
|
-DLIBSSH2_LIBRARY="$(cygpath --mixed "$HOME"/libssh2-install/lib/libssh2.lib)"
|
|
grep -F '#define' bld/lib/curl_config.h | sort || true
|
|
cmake --build bld --config Debug --parallel 5
|
|
/usr/bin/find . \( -name '*.exe' -o -name '*.dll' -o -name '*.lib' -o -name '*.pdb' \) -print0 | grep -z curl | xargs -0 file --
|
|
/usr/bin/find . \( -name '*.exe' -o -name '*.dll' -o -name '*.lib' -o -name '*.pdb' \) -print0 | grep -z curl | xargs -0 stat -c '%10s bytes: %n' --
|
|
PATH="$PWD/bld/lib/Debug:$PATH"
|
|
bld/src/Debug/curl.exe --disable --version
|
|
cmake --build bld --config Debug --parallel 5 --target testdeps
|
|
|
|
- name: 'install test prereqs'
|
|
timeout-minutes: 2
|
|
run: |
|
|
if [ -z "${MATRIX_OPENSSH}" ]; then # MSYS2 openssh
|
|
/usr/bin/pacman --noconfirm --noprogressbar --sync --needed openssh
|
|
elif [ "${MATRIX_OPENSSH}" = 'OpenSSH-Windows-builtin' ]; then
|
|
# https://learn.microsoft.com/windows-server/administration/openssh/openssh_install_firstuse
|
|
if [[ "${MATRIX_IMAGE}" = *'windows-2025'* ]]; then
|
|
pwsh -Command 'Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0'
|
|
pwsh -Command 'Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0'
|
|
fi
|
|
else # OpenSSH-Windows
|
|
cd /c # no D: drive on windows-11-arm runners
|
|
if [[ "${MATRIX_IMAGE}" = *'-arm'* ]]; then
|
|
curl --disable --fail --silent --show-error --connect-timeout 15 --max-time 60 --retry 3 --retry-connrefused \
|
|
--location --proto-redir =https "https://github.com/PowerShell/Win32-OpenSSH/releases/download/${OPENSSH_WINDOWS_VERSION}/OpenSSH-ARM64.zip" --output pkg.bin
|
|
sha256sum pkg.bin && sha256sum pkg.bin | grep -qwF -- "${OPENSSH_WINDOWS_SHA256_ARM64}" && unzip pkg.bin && rm -f pkg.bin
|
|
else
|
|
curl --disable --fail --silent --show-error --connect-timeout 15 --max-time 60 --retry 3 --retry-connrefused \
|
|
--location --proto-redir =https "https://github.com/PowerShell/Win32-OpenSSH/releases/download/${OPENSSH_WINDOWS_VERSION}/OpenSSH-Win64.zip" --output pkg.bin
|
|
sha256sum pkg.bin && sha256sum pkg.bin | grep -qwF -- "${OPENSSH_WINDOWS_SHA256_WIN64}" && unzip pkg.bin && rm -f pkg.bin
|
|
fi
|
|
fi
|
|
|
|
- name: 'run tests'
|
|
timeout-minutes: 6
|
|
run: |
|
|
cd "curl-${CURL_VERNUM}"
|
|
export TFLAGS='-j8 SCP SFTP'
|
|
if [[ "${MATRIX_CRYPTO}" = *'WinCNG'* ]]; then
|
|
export CURL_TEST_SSH_ENABLE_KEX=diffie-hellman-group16-sha512
|
|
fi
|
|
if [ -n "${MATRIX_OPENSSH}" ]; then # OpenSSH-Windows
|
|
TFLAGS+=' ~601 ~603 ~617 ~619 ~621 ~641 ~665 ~2004' # SCP
|
|
TFLAGS+=' ~3022' # 'SCP correct sha256 host key' SCP, server sha256 key check
|
|
fi
|
|
if [ "${MATRIX_OPENSSH}" = 'OpenSSH-Windows' ]; then
|
|
if [[ "${MATRIX_IMAGE}" = *'-arm'* ]]; then
|
|
PATH="/c/OpenSSH-ARM64:$PATH"
|
|
else
|
|
PATH="/c/OpenSSH-Win64:$PATH"
|
|
fi
|
|
fi
|
|
PATH="$PWD/bld/lib/Debug:$PATH:/c/my-stunnel/bin"
|
|
cmake --build bld --config Debug --target test-ci
|