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:
@ -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}")
|
||||
|
@ -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)
|
||||
|
@ -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")
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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()
|
||||
|
@ -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}>")
|
||||
|
@ -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
|
||||
|
Reference in New Issue
Block a user