diff --git a/CMakeLists.txt b/CMakeLists.txt index 7ad75ece..ac2ae892 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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}") diff --git a/cmake/FindLibgcrypt.cmake b/cmake/FindLibgcrypt.cmake index f6fc5f7a..2ec3cfa2 100644 --- a/cmake/FindLibgcrypt.cmake +++ b/cmake/FindLibgcrypt.cmake @@ -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) diff --git a/cmake/FindMbedTLS.cmake b/cmake/FindMbedTLS.cmake index ac105019..edfcec1f 100644 --- a/cmake/FindMbedTLS.cmake +++ b/cmake/FindMbedTLS.cmake @@ -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") diff --git a/cmake/FindWolfSSL.cmake b/cmake/FindWolfSSL.cmake index 31ddd303..9791b62c 100644 --- a/cmake/FindWolfSSL.cmake +++ b/cmake/FindWolfSSL.cmake @@ -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) diff --git a/example/CMakeLists.txt b/example/CMakeLists.txt index a5b0980c..a35699fb 100644 --- a/example/CMakeLists.txt +++ b/example/CMakeLists.txt @@ -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() diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 16de683a..0d3c5be2 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -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 "$" "$/${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 "$" "$/${CMAKE_INSTALL_INCLUDEDIR}>") diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 80c942e2..e0be403a 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -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