mirror of
https://github.com/libssh2/libssh2.git
synced 2025-08-05 20:55:47 +03:00
cmake: extend integration tests
- ci/GHA: add cmake integration tests for Windows. - ci/GHA: test `add_subdirectory` with Libgcrypt. - make them run faster with prefill, unity, Ninja, omitting curl tool. - add support for any build configuration. - add old-cmake support with auto-detection. - auto-detect Ninja. - run consumer test apps to see if they work. Also show the cryptography backend. - add support for Windows. - make it more verbose. - re-add `ExternalProject` cmake consumer test. It's broken. - tidy up terminology. Cherry-picked from #1581 Closes #1589
This commit is contained in:
35
.github/workflows/ci.yml
vendored
35
.github/workflows/ci.yml
vendored
@@ -53,15 +53,29 @@ jobs:
|
|||||||
name: 'integration on ${{ matrix.image }}'
|
name: 'integration on ${{ matrix.image }}'
|
||||||
runs-on: ${{ matrix.image }}
|
runs-on: ${{ matrix.image }}
|
||||||
timeout-minutes: 5
|
timeout-minutes: 5
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
shell: ${{ contains(matrix.image, 'windows') && 'msys2 {0}' || 'bash' }}
|
||||||
env:
|
env:
|
||||||
CC: clang
|
CC: ${{ !contains(matrix.image, 'windows') && 'clang' || '' }}
|
||||||
CMAKE_GENERATOR: Ninja
|
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
image: [ubuntu-latest, macos-latest]
|
image: [ubuntu-latest, macos-latest, windows-latest]
|
||||||
steps:
|
steps:
|
||||||
|
- uses: msys2/setup-msys2@d44ca8e88d8b43d56cf5670f91747359d5537f97 # v2
|
||||||
|
if: ${{ contains(matrix.image, 'windows') }}
|
||||||
|
with:
|
||||||
|
msystem: mingw64
|
||||||
|
release: false
|
||||||
|
update: false
|
||||||
|
cache: false
|
||||||
|
path-type: inherit
|
||||||
|
install: >-
|
||||||
|
mingw-w64-x86_64-zlib mingw-w64-x86_64-libgcrypt mingw-w64-x86_64-openssl mingw-w64-x86_64-mbedtls
|
||||||
|
|
||||||
- name: 'install packages'
|
- name: 'install packages'
|
||||||
|
if: ${{ !contains(matrix.image, 'windows') }}
|
||||||
run: |
|
run: |
|
||||||
if [[ '${{ matrix.image }}' = *'ubuntu'* ]]; then
|
if [[ '${{ matrix.image }}' = *'ubuntu'* ]]; then
|
||||||
sudo rm -f /var/lib/man-db/auto-update
|
sudo rm -f /var/lib/man-db/auto-update
|
||||||
@@ -75,16 +89,19 @@ jobs:
|
|||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
- name: 'via FetchContent'
|
- name: 'via FetchContent'
|
||||||
run: ./tests/cmake/test.sh FetchContent
|
run: ./tests/cmake/test.sh FetchContent
|
||||||
- name: 'via add_subdirectory'
|
- name: 'via add_subdirectory OpenSSL'
|
||||||
run: ./tests/cmake/test.sh add_subdirectory
|
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'
|
- name: 'via find_package OpenSSL'
|
||||||
run: ./tests/cmake/test.sh find_package OpenSSL
|
run: ./tests/cmake/test.sh find_package -DCRYPTO_BACKEND=OpenSSL
|
||||||
- name: 'via find_package Libgcrypt'
|
- name: 'via find_package Libgcrypt'
|
||||||
run: ./tests/cmake/test.sh find_package Libgcrypt
|
run: ./tests/cmake/test.sh find_package -DCRYPTO_BACKEND=Libgcrypt
|
||||||
- name: 'via find_package mbedTLS'
|
- name: 'via find_package mbedTLS'
|
||||||
run: ./tests/cmake/test.sh find_package mbedTLS
|
run: ./tests/cmake/test.sh find_package -DCRYPTO_BACKEND=mbedTLS
|
||||||
- name: 'via find_package wolfSSL'
|
- name: 'via find_package wolfSSL'
|
||||||
run: ./tests/cmake/test.sh 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
|
||||||
|
|
||||||
build_linux:
|
build_linux:
|
||||||
name: 'linux'
|
name: 'linux'
|
||||||
|
@@ -4,7 +4,7 @@
|
|||||||
cmake_minimum_required(VERSION 3.7...3.16 FATAL_ERROR)
|
cmake_minimum_required(VERSION 3.7...3.16 FATAL_ERROR)
|
||||||
message(STATUS "Using CMake version ${CMAKE_VERSION}")
|
message(STATUS "Using CMake version ${CMAKE_VERSION}")
|
||||||
|
|
||||||
project(test-dependent C)
|
project(test-consumer C)
|
||||||
|
|
||||||
option(TEST_INTEGRATION_MODE "Integration mode" "find_package")
|
option(TEST_INTEGRATION_MODE "Integration mode" "find_package")
|
||||||
|
|
||||||
@@ -14,7 +14,16 @@ if(TEST_INTEGRATION_MODE STREQUAL "FetchContent" AND CMAKE_VERSION VERSION_LESS
|
|||||||
message(FATAL_ERROR "This test requires CMake 3.14 or upper")
|
message(FATAL_ERROR "This test requires CMake 3.14 or upper")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(TEST_INTEGRATION_MODE STREQUAL "find_package")
|
if(TEST_INTEGRATION_MODE STREQUAL "ExternalProject") # Broken
|
||||||
|
include(ExternalProject)
|
||||||
|
ExternalProject_Add(libssh2
|
||||||
|
URL "${FROM_ARCHIVE}" URL_HASH "SHA256=${FROM_HASH}"
|
||||||
|
INSTALL_COMMAND ""
|
||||||
|
DOWNLOAD_EXTRACT_TIMESTAMP ON)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(TEST_INTEGRATION_MODE STREQUAL "find_package" OR
|
||||||
|
TEST_INTEGRATION_MODE STREQUAL "ExternalProject")
|
||||||
find_package(libssh2 REQUIRED CONFIG)
|
find_package(libssh2 REQUIRED CONFIG)
|
||||||
find_package(libssh2 REQUIRED CONFIG) # Double-inclusion test
|
find_package(libssh2 REQUIRED CONFIG) # Double-inclusion test
|
||||||
foreach(result_var IN ITEMS
|
foreach(result_var IN ITEMS
|
||||||
@@ -50,31 +59,32 @@ elseif(TEST_INTEGRATION_MODE STREQUAL "FetchContent")
|
|||||||
FetchContent_MakeAvailable(libssh2) # Requires CMake 3.14
|
FetchContent_MakeAvailable(libssh2) # Requires CMake 3.14
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
add_executable(test-dependent-static-ns "test.c")
|
add_executable(test-consumer-static-ns "test.c")
|
||||||
target_link_libraries(test-dependent-static-ns PRIVATE "libssh2::libssh2_static")
|
target_link_libraries(test-consumer-static-ns PRIVATE "libssh2::libssh2_static")
|
||||||
|
|
||||||
add_executable(test-dependent-shared-ns "test.c")
|
add_executable(test-consumer-shared-ns "test.c")
|
||||||
target_link_libraries(test-dependent-shared-ns PRIVATE "libssh2::libssh2_shared")
|
target_link_libraries(test-consumer-shared-ns PRIVATE "libssh2::libssh2_shared")
|
||||||
|
|
||||||
# Alias for either shared or static library
|
# Alias for either shared or static library
|
||||||
add_executable(test-dependent-selected-ns "test.c")
|
add_executable(test-consumer-selected-ns "test.c")
|
||||||
target_link_libraries(test-dependent-selected-ns PRIVATE "libssh2::libssh2")
|
target_link_libraries(test-consumer-selected-ns PRIVATE "libssh2::libssh2")
|
||||||
|
|
||||||
if(TEST_INTEGRATION_MODE STREQUAL "find_package")
|
if(TEST_INTEGRATION_MODE STREQUAL "find_package" OR
|
||||||
|
TEST_INTEGRATION_MODE STREQUAL "ExternalProject")
|
||||||
|
|
||||||
# Compatibility alias
|
# Compatibility alias
|
||||||
add_executable(test-dependent-compat "test.c")
|
add_executable(test-consumer-compat "test.c")
|
||||||
target_link_libraries(test-dependent-compat PRIVATE "Libssh2::libssh2")
|
target_link_libraries(test-consumer-compat PRIVATE "Libssh2::libssh2")
|
||||||
|
|
||||||
elseif(TEST_INTEGRATION_MODE STREQUAL "add_subdirectory" OR
|
elseif(TEST_INTEGRATION_MODE STREQUAL "add_subdirectory" OR
|
||||||
TEST_INTEGRATION_MODE STREQUAL "FetchContent")
|
TEST_INTEGRATION_MODE STREQUAL "FetchContent")
|
||||||
|
|
||||||
add_executable(test-dependent-static-bare "test.c")
|
add_executable(test-consumer-static-bare "test.c")
|
||||||
target_link_libraries(test-dependent-static-bare PRIVATE "libssh2_static")
|
target_link_libraries(test-consumer-static-bare PRIVATE "libssh2_static")
|
||||||
|
|
||||||
add_executable(test-dependent-shared-bare "test.c")
|
add_executable(test-consumer-shared-bare "test.c")
|
||||||
target_link_libraries(test-dependent-shared-bare PRIVATE "libssh2_shared")
|
target_link_libraries(test-consumer-shared-bare PRIVATE "libssh2_shared")
|
||||||
|
|
||||||
add_executable(test-dependent-selected-bare "test.c")
|
add_executable(test-consumer-selected-bare "test.c")
|
||||||
target_link_libraries(test-dependent-selected-bare PRIVATE "libssh2")
|
target_link_libraries(test-consumer-selected-bare PRIVATE "libssh2")
|
||||||
endif()
|
endif()
|
||||||
|
@@ -6,8 +6,34 @@
|
|||||||
#include "libssh2.h"
|
#include "libssh2.h"
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
int main(void)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
printf("libssh2_version(0): |%s|\n", libssh2_version(0));
|
const char *crypto_str;
|
||||||
|
|
||||||
|
(void)argc;
|
||||||
|
|
||||||
|
switch(libssh2_crypto_engine()) {
|
||||||
|
case libssh2_gcrypt:
|
||||||
|
crypto_str = "libgcrypt";
|
||||||
|
break;
|
||||||
|
case libssh2_mbedtls:
|
||||||
|
crypto_str = "mbedTLS";
|
||||||
|
break;
|
||||||
|
case libssh2_openssl:
|
||||||
|
crypto_str = "openssl compatible";
|
||||||
|
break;
|
||||||
|
case libssh2_os400qc3:
|
||||||
|
crypto_str = "OS400QC3";
|
||||||
|
break;
|
||||||
|
case libssh2_wincng:
|
||||||
|
crypto_str = "WinCNG";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
crypto_str = "(unrecognized)";
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("libssh2 test: |%s|%s|%s|\n", argv[0],
|
||||||
|
libssh2_version(0), crypto_str);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@@ -1,44 +1,130 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh -x
|
||||||
#
|
#
|
||||||
# Copyright (C) Viktor Szakats
|
# Copyright (C) Viktor Szakats
|
||||||
# SPDX-License-Identifier: BSD-3-Clause
|
# SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
|
||||||
|
# shellcheck disable=SC2086
|
||||||
|
|
||||||
set -eu
|
set -eu
|
||||||
|
|
||||||
cd "$(dirname "$0")"
|
cd "$(dirname "$0")"
|
||||||
|
|
||||||
mode="${1:-all}"
|
command -v ninja >/dev/null && export CMAKE_GENERATOR=Ninja # 3.17+
|
||||||
|
|
||||||
if [ "${mode}" = 'all' ] || [ "${mode}" = 'FetchContent' ]; then
|
mode="${1:-all}"; shift
|
||||||
rm -rf bld-fetchcontent
|
|
||||||
cmake -B bld-fetchcontent \
|
cmake_consumer="${CMAKE_CONSUMER:-cmake}"
|
||||||
|
cmake_provider="${CMAKE_PROVIDER:-${cmake_consumer}}"
|
||||||
|
|
||||||
|
# 'modern': supports -S/-B (3.13+), --install (3.15+)
|
||||||
|
"${cmake_consumer}" --help | grep -q -- '--install' && cmake_consumer_modern=1
|
||||||
|
"${cmake_provider}" --help | grep -q -- '--install' && cmake_provider_modern=1
|
||||||
|
|
||||||
|
cmake_opts='-DBUILD_EXAMPLES=OFF -DBUILD_TESTING=OFF -DENABLE_ZLIB_COMPRESSION=ON'
|
||||||
|
|
||||||
|
src='../..'
|
||||||
|
|
||||||
|
runresults() {
|
||||||
|
set +x
|
||||||
|
for bin in "$1"/test-consumer*; do
|
||||||
|
file "${bin}" || true
|
||||||
|
${LIBSSH2_TEST_EXE_RUNNER:-} "${bin}" || true
|
||||||
|
done
|
||||||
|
set -x
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ "${mode}" = 'ExternalProject' ]; then # Broken
|
||||||
|
(cd "${src}"; git archive --format=tar HEAD) | gzip > source.tar.gz
|
||||||
|
src="${PWD}/source.tar.gz"
|
||||||
|
sha="$(openssl dgst -sha256 "${src}" | grep -a -i -o -E '[0-9a-f]{64}$')"
|
||||||
|
bldc='bld-externalproject'
|
||||||
|
rm -rf "${bldc}"
|
||||||
|
if [ -n "${cmake_consumer_modern:-}" ]; then # 3.15+
|
||||||
|
"${cmake_consumer}" -B "${bldc}" ${cmake_opts} -DCMAKE_UNITY_BUILD=ON "$@" \
|
||||||
|
-DTEST_INTEGRATION_MODE=ExternalProject \
|
||||||
|
-DFROM_ARCHIVE="${src}" -DFROM_HASH="${sha}"
|
||||||
|
"${cmake_consumer}" --build "${bldc}" --verbose
|
||||||
|
else
|
||||||
|
mkdir "${bldc}"; cd "${bldc}"
|
||||||
|
"${cmake_consumer}" .. ${cmake_opts} "$@" \
|
||||||
|
-DTEST_INTEGRATION_MODE=ExternalProject \
|
||||||
|
-DFROM_ARCHIVE="${src}" -DFROM_HASH="${sha}"
|
||||||
|
VERBOSE=1 "${cmake_consumer}" --build .
|
||||||
|
cd ..
|
||||||
|
fi
|
||||||
|
runresults "${bldc}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "${mode}" = 'all' ] || [ "${mode}" = 'FetchContent' ]; then # 3.14+
|
||||||
|
src="${PWD}/${src}"
|
||||||
|
bldc='bld-fetchcontent'
|
||||||
|
rm -rf "${bldc}"
|
||||||
|
"${cmake_consumer}" -B "${bldc}" ${cmake_opts} -DCMAKE_UNITY_BUILD=ON "$@" \
|
||||||
-DTEST_INTEGRATION_MODE=FetchContent \
|
-DTEST_INTEGRATION_MODE=FetchContent \
|
||||||
-DFROM_GIT_REPO="${PWD}/../.." \
|
-DFROM_GIT_REPO="${src}" \
|
||||||
-DFROM_GIT_TAG="$(git rev-parse HEAD)"
|
-DFROM_GIT_TAG="$(git rev-parse HEAD)"
|
||||||
cmake --build bld-fetchcontent
|
"${cmake_consumer}" --build "${bldc}" --verbose
|
||||||
|
PATH="${bldc}/_deps/libssh2-build/lib:${PATH}"
|
||||||
|
runresults "${bldc}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "${mode}" = 'all' ] || [ "${mode}" = 'add_subdirectory' ]; then
|
if [ "${mode}" = 'all' ] || [ "${mode}" = 'add_subdirectory' ]; then
|
||||||
rm -rf libssh2; ln -s ../.. libssh2
|
rm -rf libssh2
|
||||||
rm -rf bld-add_subdirectory
|
if ! ln -s "${src}" libssh2; then
|
||||||
cmake -B bld-add_subdirectory \
|
rm -rf libssh2; mkdir libssh2; (cd "${src}"; git archive --format=tar HEAD) | tar -x --directory=libssh2 # for MSYS2/Cygwin
|
||||||
-DTEST_INTEGRATION_MODE=add_subdirectory
|
fi
|
||||||
cmake --build bld-add_subdirectory
|
bldc='bld-add_subdirectory'
|
||||||
|
rm -rf "${bldc}"
|
||||||
|
if [ -n "${cmake_consumer_modern:-}" ]; then # 3.15+
|
||||||
|
"${cmake_consumer}" -B "${bldc}" ${cmake_opts} -DCMAKE_UNITY_BUILD=ON "$@" \
|
||||||
|
-DTEST_INTEGRATION_MODE=add_subdirectory
|
||||||
|
"${cmake_consumer}" --build "${bldc}" --verbose
|
||||||
|
else
|
||||||
|
mkdir "${bldc}"; cd "${bldc}"
|
||||||
|
# Disable `pkg-config` for CMake <= 3.12. These versions cannot propagate
|
||||||
|
# library directories to the consumer project.
|
||||||
|
"${cmake_consumer}" .. ${cmake_opts} -DCURL_USE_PKGCONFIG=OFF "$@" \
|
||||||
|
-DTEST_INTEGRATION_MODE=add_subdirectory
|
||||||
|
VERBOSE=1 "${cmake_consumer}" --build .
|
||||||
|
cd ..
|
||||||
|
fi
|
||||||
|
PATH="${bldc}/libssh2/src:${PATH}"
|
||||||
|
runresults "${bldc}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "${mode}" = 'all' ] || [ "${mode}" = 'find_package' ]; then
|
if [ "${mode}" = 'all' ] || [ "${mode}" = 'find_package' ]; then
|
||||||
crypto="${2:-OpenSSL}"
|
src="${PWD}/${src}"
|
||||||
bld="bld-libssh2-${crypto}"
|
bldp='bld-libssh2'
|
||||||
rm -rf "${bld}"
|
prefix="${PWD}/${bldp}/_pkg"
|
||||||
cmake ../.. -B "${bld}" -DCMAKE_INSTALL_PREFIX="${PWD}/${bld}/_pkg" \
|
rm -rf "${bldp}"
|
||||||
-DBUILD_EXAMPLES=OFF -DBUILD_TESTING=OFF \
|
if [ -n "${cmake_provider_modern:-}" ]; then # 3.15+
|
||||||
-DENABLE_ZLIB_COMPRESSION=ON \
|
"${cmake_provider}" -B "${bldp}" -S "${src}" ${cmake_opts} -DCMAKE_UNITY_BUILD=ON "$@" \
|
||||||
-DCRYPTO_BACKEND="${crypto}"
|
-DCMAKE_INSTALL_PREFIX="${prefix}"
|
||||||
cmake --build "${bld}"
|
"${cmake_provider}" --build "${bldp}"
|
||||||
cmake --install "${bld}"
|
"${cmake_provider}" --install "${bldp}"
|
||||||
rm -rf bld-find_package
|
else
|
||||||
cmake -B bld-find_package \
|
mkdir "${bldp}"; cd "${bldp}"
|
||||||
-DTEST_INTEGRATION_MODE=find_package \
|
"${cmake_provider}" "${src}" ${cmake_opts} "$@" \
|
||||||
-DCMAKE_PREFIX_PATH="${PWD}/${bld}/_pkg/lib/cmake/libssh2"
|
-DCMAKE_INSTALL_PREFIX="${prefix}"
|
||||||
cmake --build bld-find_package --verbose
|
"${cmake_provider}" --build .
|
||||||
|
make install
|
||||||
|
cd ..
|
||||||
|
fi
|
||||||
|
bldc='bld-find_package'
|
||||||
|
rm -rf "${bldc}"
|
||||||
|
if [ -n "${cmake_consumer_modern:-}" ]; then # 3.15+
|
||||||
|
"${cmake_consumer}" -B "${bldc}" \
|
||||||
|
-DTEST_INTEGRATION_MODE=find_package \
|
||||||
|
-DCMAKE_PREFIX_PATH="${prefix}/lib/cmake/libssh2"
|
||||||
|
"${cmake_consumer}" --build "${bldc}" --verbose
|
||||||
|
else
|
||||||
|
mkdir "${bldc}"; cd "${bldc}"
|
||||||
|
"${cmake_consumer}" .. \
|
||||||
|
-DTEST_INTEGRATION_MODE=find_package \
|
||||||
|
-DCMAKE_PREFIX_PATH="${prefix}/lib/cmake/libssh2"
|
||||||
|
VERBOSE=1 "${cmake_consumer}" --build .
|
||||||
|
cd ..
|
||||||
|
fi
|
||||||
|
PATH="${prefix}/bin:${PATH}"
|
||||||
|
runresults "${bldc}"
|
||||||
fi
|
fi
|
||||||
|
Reference in New Issue
Block a user