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

cmake: misc improvements, add LIBSSH2_USE_PKGCONFIG option

- show platform flags (via curl).
- add `LIBSSH2_USE_PKGCONFIG` option to control whether to use
  `pkg-config` to find dependencies.
- set `.pc` names withing the Find modules.
- add `mbedcrypto` to `libssh2.pc` only when detected via `pkg-config`.
  Workaround for older mbedtls versions and non-CMake mbedTLS builds
  (as of mbedTLS 3.6.2) that don't emit an `mbedcrypto.pc` file.
- set header paths relative to the project root (tidy-up).
- use `-isystem` for crypto backend and zlib header paths.
  To match autotools.
- sync header path order with autotools.
- rename local variables to underscore-lowercase.
- minor tidy-ups.

Cherry-picked from #1484
Closes #1525
This commit is contained in:
Viktor Szakats
2024-11-02 16:54:53 +01:00
parent 854cfa8292
commit a3aa6b4ca8
7 changed files with 95 additions and 31 deletions

View File

@ -61,6 +61,54 @@ function(libssh2_dumpvars) # Dump all defined variables with their values
message("::endgroup::")
endfunction()
set(_target_flags "")
if(APPLE)
set(_target_flags "${_target_flags} APPLE")
endif()
if(UNIX)
set(_target_flags "${_target_flags} UNIX")
endif()
if(BSD)
set(_target_flags "${_target_flags} BSD")
endif()
if(ANDROID)
set(_target_flags "${_target_flags} ANDROID-${ANDROID_PLATFORM_LEVEL}")
endif()
if(WIN32)
set(_target_flags "${_target_flags} WIN32")
endif()
if(WINDOWS_STORE)
set(_target_flags "${_target_flags} UWP")
endif()
if(CYGWIN)
set(_target_flags "${_target_flags} CYGWIN")
endif()
if(MSYS)
set(_target_flags "${_target_flags} MSYS")
endif()
if(DOS)
set(_target_flags "${_target_flags} DOS")
endif()
if(AMIGA)
set(_target_flags "${_target_flags} AMIGA")
endif()
if(CMAKE_COMPILER_IS_GNUCC)
set(_target_flags "${_target_flags} GCC")
endif()
if(MINGW)
set(_target_flags "${_target_flags} MINGW")
endif()
if(MSVC)
set(_target_flags "${_target_flags} MSVC-${MSVC_VERSION}")
endif()
if(VCPKG_TOOLCHAIN)
set(_target_flags "${_target_flags} VCPKG")
endif()
if(CMAKE_CROSSCOMPILING)
set(_target_flags "${_target_flags} CROSS")
endif()
message(STATUS "CMake platform flags:${_target_flags}")
if(NOT DEFINED CMAKE_UNITY_BUILD_BATCH_SIZE)
set(CMAKE_UNITY_BUILD_BATCH_SIZE 0)
endif()
@ -139,6 +187,16 @@ else()
set(LIB_SELECTED ${LIB_STATIC})
endif()
# Override to force-disable or force-enable the use of pkg-config.
if((UNIX AND NOT ANDROID AND (NOT APPLE OR CMAKE_SYSTEM_NAME MATCHES "Darwin")) OR
VCPKG_TOOLCHAIN OR
(MINGW AND NOT CMAKE_CROSSCOMPILING))
set(_libssh2_use_pkgconfig_default ON)
else()
set(_libssh2_use_pkgconfig_default OFF)
endif()
option(LIBSSH2_USE_PKGCONFIG "Enable pkg-config to detect dependencies" ${_libssh2_use_pkgconfig_default})
# Symbol hiding
option(HIDE_SYMBOLS "Hide all libssh2 symbols that are not officially external" ON)
@ -357,7 +415,7 @@ if(CRYPTO_BACKEND STREQUAL "wolfSSL" OR NOT CRYPTO_BACKEND)
set(CRYPTO_BACKEND_INCLUDE_DIR ${WOLFSSL_INCLUDE_DIRS})
list(APPEND LIBSSH2_LIBS ${WOLFSSL_LIBRARIES})
list(APPEND LIBSSH2_LIBDIRS ${WOLFSSL_LIBRARY_DIRS})
list(APPEND LIBSSH2_PC_REQUIRES_PRIVATE "wolfssl")
list(APPEND LIBSSH2_PC_REQUIRES_PRIVATE ${WOLFSSL_PC_REQUIRES})
link_directories(${WOLFSSL_LIBRARY_DIRS})
if(WOLFSSL_CFLAGS)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${WOLFSSL_CFLAGS}")
@ -386,7 +444,7 @@ if(CRYPTO_BACKEND STREQUAL "Libgcrypt" OR NOT CRYPTO_BACKEND)
set(CRYPTO_BACKEND_INCLUDE_DIR ${LIBGCRYPT_INCLUDE_DIRS})
list(APPEND LIBSSH2_LIBS ${LIBGCRYPT_LIBRARIES})
list(APPEND LIBSSH2_LIBDIRS ${LIBGCRYPT_LIBRARY_DIRS})
list(APPEND LIBSSH2_PC_REQUIRES_PRIVATE "libgcrypt")
list(APPEND LIBSSH2_PC_REQUIRES_PRIVATE ${LIBGCRYPT_PC_REQUIRES})
link_directories(${LIBGCRYPT_LIBRARY_DIRS})
if(LIBGCRYPT_CFLAGS)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${LIBGCRYPT_CFLAGS}")
@ -404,7 +462,7 @@ if(CRYPTO_BACKEND STREQUAL "mbedTLS" OR NOT CRYPTO_BACKEND)
set(CRYPTO_BACKEND_INCLUDE_DIR ${MBEDTLS_INCLUDE_DIRS})
list(APPEND LIBSSH2_LIBS ${MBEDTLS_LIBRARIES})
list(APPEND LIBSSH2_LIBDIRS ${MBEDTLS_LIBRARY_DIRS})
list(APPEND LIBSSH2_PC_REQUIRES_PRIVATE "mbedcrypto")
list(APPEND LIBSSH2_PC_REQUIRES_PRIVATE ${MBEDTLS_PC_REQUIRES})
link_directories(${MBEDTLS_LIBRARY_DIRS})
if(MBEDTLS_CFLAGS)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${MBEDTLS_CFLAGS}")

View File

@ -15,14 +15,17 @@
# - `LIBGCRYPT_INCLUDE_DIRS`: The Libgcrypt include directories.
# - `LIBGCRYPT_LIBRARIES`: The Libgcrypt library names.
# - `LIBGCRYPT_LIBRARY_DIRS`: The Libgcrypt library directories.
# - `LIBGCRYPT_PC_REQUIRES`: The Libgcrypt pkg-config packages.
# - `LIBGCRYPT_CFLAGS`: Required compiler flags.
# - `LIBGCRYPT_VERSION`: Version of Libgcrypt.
if((UNIX OR VCPKG_TOOLCHAIN OR (MINGW AND NOT CMAKE_CROSSCOMPILING)) AND
set(LIBGCRYPT_PC_REQUIRES "libgcrypt")
if(LIBSSH2_USE_PKGCONFIG AND
NOT DEFINED LIBGCRYPT_INCLUDE_DIR AND
NOT DEFINED LIBGCRYPT_LIBRARY)
find_package(PkgConfig QUIET)
pkg_check_modules(LIBGCRYPT "libgcrypt")
pkg_check_modules(LIBGCRYPT ${LIBGCRYPT_PC_REQUIRES})
endif()
if(LIBGCRYPT_FOUND)

View File

@ -15,20 +15,25 @@
# - `MBEDTLS_INCLUDE_DIRS`: The mbedTLS include directories.
# - `MBEDTLS_LIBRARIES`: The mbedTLS library names.
# - `MBEDTLS_LIBRARY_DIRS`: The mbedTLS library directories.
# - `MBEDTLS_PC_REQUIRES`: The mbedTLS pkg-config packages.
# - `MBEDTLS_CFLAGS`: Required compiler flags.
# - `MBEDTLS_VERSION`: Version of mbedTLS.
if((UNIX OR VCPKG_TOOLCHAIN OR (MINGW AND NOT CMAKE_CROSSCOMPILING)) AND
set(MBEDTLS_PC_REQUIRES "mbedcrypto")
if(LIBSSH2_USE_PKGCONFIG AND
NOT DEFINED MBEDTLS_INCLUDE_DIR AND
NOT DEFINED MBEDCRYPTO_LIBRARY)
find_package(PkgConfig QUIET)
pkg_check_modules(MBEDTLS "mbedcrypto")
pkg_check_modules(MBEDTLS ${MBEDTLS_PC_REQUIRES})
endif()
if(MBEDTLS_FOUND)
string(REPLACE ";" " " MBEDTLS_CFLAGS "${MBEDTLS_CFLAGS}")
message(STATUS "Found MbedTLS (via pkg-config): ${MBEDTLS_INCLUDE_DIRS} (found version \"${MBEDTLS_VERSION}\")")
else()
set(MBEDTLS_PC_REQUIRES "")
find_path(MBEDTLS_INCLUDE_DIR NAMES "mbedtls/version.h")
find_library(MBEDCRYPTO_LIBRARY NAMES "mbedcrypto" "libmbedcrypto")

View File

@ -15,14 +15,17 @@
# - `WOLFSSL_INCLUDE_DIRS`: The wolfSSL include directories.
# - `WOLFSSL_LIBRARIES`: The wolfSSL library names.
# - `WOLFSSL_LIBRARY_DIRS`: The wolfSSL library directories.
# - `WOLFSSL_PC_REQUIRES`: The wolfSSL pkg-config packages.
# - `WOLFSSL_CFLAGS`: Required compiler flags.
# - `WOLFSSL_VERSION`: Version of wolfSSL.
if((UNIX OR VCPKG_TOOLCHAIN OR (MINGW AND NOT CMAKE_CROSSCOMPILING)) AND
set(WOLFSSL_PC_REQUIRES "wolfssl")
if(LIBSSH2_USE_PKGCONFIG AND
NOT DEFINED WOLFSSL_INCLUDE_DIR AND
NOT DEFINED WOLFSSL_LIBRARY)
find_package(PkgConfig QUIET)
pkg_check_modules(WOLFSSL "wolfssl")
pkg_check_modules(WOLFSSL ${WOLFSSL_PC_REQUIRES})
endif()
if(WOLFSSL_FOUND)

View File

@ -49,8 +49,8 @@ foreach(_example IN LISTS noinst_PROGRAMS)
list(APPEND _example_targets ${_example})
# to find generated header
target_include_directories(${_example} PRIVATE
"${CMAKE_CURRENT_BINARY_DIR}/../src"
"../src")
"${PROJECT_BINARY_DIR}/src"
"${PROJECT_SOURCE_DIR}/src")
target_link_libraries(${_example} ${LIB_SELECTED} ${LIBSSH2_LIBS})
set_target_properties(${_example} PROPERTIES UNITY_BUILD OFF)
endforeach()

View File

@ -40,8 +40,6 @@ set(_libssh2_soversion 1)
set(_libssh2_libversion 1.0.1)
if(CRYPTO_BACKEND)
list(APPEND PRIVATE_COMPILE_DEFINITIONS ${CRYPTO_BACKEND_DEFINE})
list(APPEND PRIVATE_INCLUDE_DIRECTORIES ${CRYPTO_BACKEND_INCLUDE_DIR})
add_feature_info("Crypto backend" ON "${CRYPTO_BACKEND}")
else()
message(FATAL_ERROR "No suitable cryptography backend found.")
@ -62,18 +60,17 @@ add_feature_info(Compression ENABLE_ZLIB_COMPRESSION
if(ENABLE_ZLIB_COMPRESSION)
find_package(ZLIB REQUIRED)
list(APPEND libssh2_INCLUDE_DIRS ${ZLIB_INCLUDE_DIRS})
list(APPEND LIBSSH2_LIBS ${ZLIB_LIBRARIES})
list(APPEND LIBSSH2_PC_REQUIRES_PRIVATE "zlib")
include_directories(SYSTEM ${ZLIB_INCLUDE_DIRS})
if(ZLIB_FOUND)
list(APPEND _libssh2_definitions "LIBSSH2_HAVE_ZLIB")
endif()
endif()
list(APPEND LIBSSH2_LIBS ${LIBSSH2_LIBS_SOCKET})
include_directories(SYSTEM ${CRYPTO_BACKEND_INCLUDE_DIR})
# to find generated header
list(APPEND libssh2_INCLUDE_DIRS ${CMAKE_CURRENT_BINARY_DIR})
list(APPEND LIBSSH2_LIBS ${LIBSSH2_LIBS_SOCKET})
if(MSVC)
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Zi -Od")
@ -109,7 +106,7 @@ if(BUILD_STATIC_LIBS OR BUILD_STATIC_FOR_TESTS)
endif()
add_library(${LIB_STATIC} STATIC ${_sources})
add_library(${PROJECT_NAME}::${LIB_STATIC} ALIAS ${LIB_STATIC})
target_compile_definitions(${LIB_STATIC} PRIVATE ${PRIVATE_COMPILE_DEFINITIONS} ${_libssh2_definitions})
target_compile_definitions(${LIB_STATIC} PRIVATE ${CRYPTO_BACKEND_DEFINE} ${_libssh2_definitions})
target_link_libraries(${LIB_STATIC} PRIVATE ${LIBSSH2_LIBS})
set_target_properties(${LIB_STATIC} PROPERTIES
PREFIX "" OUTPUT_NAME "libssh2" SOVERSION "${_libssh2_soversion}" VERSION "${_libssh2_libversion}"
@ -117,9 +114,8 @@ if(BUILD_STATIC_LIBS OR BUILD_STATIC_FOR_TESTS)
target_include_directories(${LIB_STATIC}
PRIVATE
"${CMAKE_CURRENT_BINARY_DIR}" # to find generated header
"${PROJECT_SOURCE_DIR}/include"
${libssh2_INCLUDE_DIRS}
${PRIVATE_INCLUDE_DIRECTORIES}
PUBLIC
"$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>"
"$<INSTALL_INTERFACE:$<INSTALL_PREFIX>/${CMAKE_INSTALL_INCLUDEDIR}>")
@ -131,7 +127,7 @@ if(BUILD_SHARED_LIBS)
if(WIN32)
set_property(TARGET ${LIB_SHARED} APPEND PROPERTY SOURCES "libssh2.rc")
endif()
target_compile_definitions(${LIB_SHARED} PRIVATE ${PRIVATE_COMPILE_DEFINITIONS} ${_libssh2_definitions} ${LIB_SHARED_DEFINITIONS})
target_compile_definitions(${LIB_SHARED} PRIVATE ${CRYPTO_BACKEND_DEFINE} ${_libssh2_definitions} ${LIB_SHARED_DEFINITIONS})
target_compile_options(${LIB_SHARED} PRIVATE ${LIB_SHARED_C_FLAGS})
target_link_libraries(${LIB_SHARED} PRIVATE ${LIBSSH2_LIBS})
set_target_properties(${LIB_SHARED} PROPERTIES
@ -141,9 +137,8 @@ if(BUILD_SHARED_LIBS)
target_include_directories(${LIB_SHARED}
PRIVATE
"${CMAKE_CURRENT_BINARY_DIR}" # to find generated header
"${PROJECT_SOURCE_DIR}/include"
${libssh2_INCLUDE_DIRS}
${PRIVATE_INCLUDE_DIRECTORIES}
PUBLIC
"$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>"
"$<INSTALL_INTERFACE:$<INSTALL_PREFIX>/${CMAKE_INSTALL_INCLUDEDIR}>")

View File

@ -38,6 +38,8 @@
include(CopyRuntimeDependencies)
include_directories(SYSTEM ${CRYPTO_BACKEND_INCLUDE_DIR})
list(APPEND LIBSSH2_LIBS ${LIBSSH2_LIBS_SOCKET})
transform_makefile_inc("Makefile.inc" "${CMAKE_CURRENT_BINARY_DIR}/Makefile.inc.cmake")
@ -73,10 +75,9 @@ endif()
add_library(runner STATIC ${librunner_la_SOURCES})
target_compile_definitions(runner PRIVATE "${CRYPTO_BACKEND_DEFINE}")
target_include_directories(runner PRIVATE
"${CMAKE_CURRENT_BINARY_DIR}/../src"
"../src"
"../include"
"${CRYPTO_BACKEND_INCLUDE_DIR}")
"${PROJECT_BINARY_DIR}/src"
"${PROJECT_SOURCE_DIR}/src"
"${PROJECT_SOURCE_DIR}/include")
target_link_libraries(runner PRIVATE libssh2)
foreach(_test IN LISTS DOCKER_TESTS STANDALONE_TESTS SSHD_TESTS)
@ -95,10 +96,9 @@ foreach(_test IN LISTS DOCKER_TESTS STANDALONE_TESTS SSHD_TESTS)
add_executable(${_test} "${_test}.c")
target_compile_definitions(${_test} PRIVATE "${CRYPTO_BACKEND_DEFINE}")
target_include_directories(${_test} PRIVATE
"${CMAKE_CURRENT_BINARY_DIR}/../src"
"../src"
"../include"
"${CRYPTO_BACKEND_INCLUDE_DIR}")
"${PROJECT_BINARY_DIR}/src"
"${PROJECT_SOURCE_DIR}/src"
"${PROJECT_SOURCE_DIR}/include")
set_target_properties(${_test} PROPERTIES UNITY_BUILD OFF)
# build a single test with gcov