1
0
mirror of https://github.com/libssh2/libssh2.git synced 2025-08-08 19:02:07 +03:00

cmake: IMPORTED target improvements and fixes

- fix `add_subdirectory` builds for old CMake versions.
- libssh2-config.cmake: fix to set CMP0099 for CMake 3.17+ only.
- libssh2-config.cmake: generalize code to support any number of deps.
  (mainly to sync with curl.)
- libssh2-config.cmake: bind dependencies to the static libssh2 only.

Follow-up to a0d8529b08 #1571
Follow-up to df0563a857 #1535

Closes #1581
This commit is contained in:
Viktor Szakats
2025-04-21 02:55:53 +02:00
parent a8dd5090d6
commit ac80041852
2 changed files with 41 additions and 15 deletions

View File

@@ -6,18 +6,18 @@ option(LIBSSH2_USE_PKGCONFIG "Enable pkg-config to detect @PROJECT_NAME@ depende
include(CMakeFindDependencyMacro)
set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR} ${CMAKE_MODULE_PATH})
set(_lib "")
set(_libs "")
if("@CRYPTO_BACKEND@" STREQUAL "OpenSSL")
find_dependency(OpenSSL)
elseif("@CRYPTO_BACKEND@" STREQUAL "wolfSSL")
find_dependency(WolfSSL)
set(_lib libssh2::wolfssl)
list(APPEND _libs libssh2::wolfssl)
elseif("@CRYPTO_BACKEND@" STREQUAL "Libgcrypt")
find_dependency(Libgcrypt)
set(_lib libssh2::libgcrypt)
list(APPEND _libs libssh2::libgcrypt)
elseif("@CRYPTO_BACKEND@" STREQUAL "mbedTLS")
find_dependency(MbedTLS)
set(_lib libssh2::mbedcrypto)
list(APPEND _libs libssh2::mbedcrypto)
endif()
if(@ZLIB_FOUND@)
@@ -40,18 +40,23 @@ if(NOT TARGET Libssh2::@LIB_NAME@)
add_library(Libssh2::@LIB_NAME@ ALIAS @PROJECT_NAME@::@LIB_SELECTED@)
endif()
cmake_policy(GET CMP0099 _has_CMP0099) # https://cmake.org/cmake/help/latest/policy/CMP0099.html
if(NOT _has_CMP0099 AND _lib)
message(STATUS "libssh2: CMP0099 not detected, resorting to workaround.")
# CMake before CMP0099 (CMake 3.17 2020-03-20) did not endorse the concept of libdirs and lib names.
# It expected libs to have an absolute filename. As a workaround, manually apply dependency libdirs
# to the libssh2 target, for CMake consumers without this policy set.
get_target_property(_libdirs "${_lib}" INTERFACE_LINK_DIRECTORIES)
if(_libdirs)
foreach(_target IN ITEMS @PROJECT_NAME@::@LIB_SHARED@ @PROJECT_NAME@::@LIB_STATIC@)
if(TARGET "${_target}")
target_link_directories("${_target}" INTERFACE ${_libdirs})
if(TARGET @PROJECT_NAME@::@LIB_STATIC@)
# CMake before CMP0099 (CMake 3.17 2020-03-20) did not propagate libdirs to
# targets. It expected libs to have an absolute filename. As a workaround,
# manually apply dependency libdirs, for CMake consumers without this policy.
if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.17)
cmake_policy(GET CMP0099 _has_CMP0099) # https://cmake.org/cmake/help/latest/policy/CMP0099.html
endif()
if(NOT _has_CMP0099 AND CMAKE_VERSION VERSION_GREATER_EQUAL 3.13 AND _libs)
set(_libdirs "")
foreach(_lib IN LISTS _libs)
get_target_property(_libdir "${_lib}" INTERFACE_LINK_DIRECTORIES)
if(_libdir)
list(APPEND _libdirs "${_libdir}")
endif()
endforeach()
if(_libdirs)
target_link_directories(@PROJECT_NAME@::@LIB_STATIC@ INTERFACE ${_libdirs})
endif()
endif()
endif()