Blame CMakeLists.txt

Packit 6c0a39
cmake_minimum_required(VERSION 3.3.0)
Packit 6c0a39
cmake_policy(SET CMP0048 NEW)
Packit 6c0a39
Packit 6c0a39
# Specify search path for CMake modules to be loaded by include() 
Packit 6c0a39
# and find_package()
Packit 6c0a39
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules")
Packit 6c0a39
Packit 6c0a39
# Add defaults for cmake
Packit 6c0a39
# Those need to be set before the project() call.
Packit 6c0a39
include(DefineCMakeDefaults)
Packit 6c0a39
include(DefineCompilerFlags)
Packit 6c0a39
Packit 6c0a39
project(libssh VERSION 0.9.0 LANGUAGES C)
Packit 6c0a39
Packit 6c0a39
# global needed variable
Packit 6c0a39
set(APPLICATION_NAME ${PROJECT_NAME})
Packit 6c0a39
Packit 6c0a39
# SOVERSION scheme: CURRENT.AGE.REVISION
Packit 6c0a39
#   If there was an incompatible interface change:
Packit 6c0a39
#     Increment CURRENT. Set AGE and REVISION to 0
Packit 6c0a39
#   If there was a compatible interface change:
Packit 6c0a39
#     Increment AGE. Set REVISION to 0
Packit 6c0a39
#   If the source code was changed, but there were no interface changes:
Packit 6c0a39
#     Increment REVISION.
Packit 6c0a39
set(LIBRARY_VERSION "4.8.1")
Packit 6c0a39
set(LIBRARY_SOVERSION "4")
Packit 6c0a39
Packit 6c0a39
# where to look first for cmake modules, before ${CMAKE_ROOT}/Modules/ is checked
Packit 6c0a39
Packit 6c0a39
# add definitions
Packit 6c0a39
include(DefinePlatformDefaults)
Packit 6c0a39
include(DefineInstallationPaths)
Packit 6c0a39
include(DefineOptions.cmake)
Packit 6c0a39
include(CPackConfig.cmake)
Packit 6c0a39
Packit 6c0a39
include(CompilerChecks.cmake)
Packit 6c0a39
Packit 6c0a39
# disallow in-source build
Packit 6c0a39
include(MacroEnsureOutOfSourceBuild)
Packit 6c0a39
macro_ensure_out_of_source_build("${PROJECT_NAME} requires an out of source build. Please create a separate build directory and run 'cmake /path/to/${PROJECT_NAME} [options]' there.")
Packit 6c0a39
Packit 6c0a39
# Copy library files to a lib sub-directory
Packit 6c0a39
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib")
Packit 6c0a39
Packit 6c0a39
# search for libraries
Packit 6c0a39
if (WITH_ZLIB)
Packit 6c0a39
    find_package(ZLIB REQUIRED)
Packit 6c0a39
endif (WITH_ZLIB)
Packit 6c0a39
Packit 6c0a39
if (WITH_GCRYPT)
Packit 6c0a39
  find_package(GCrypt 1.5.0 REQUIRED)
Packit 6c0a39
  if (NOT GCRYPT_FOUND)
Packit 6c0a39
    message(FATAL_ERROR "Could not find GCrypt")
Packit 6c0a39
  endif (NOT GCRYPT_FOUND)
Packit 6c0a39
elseif(WITH_MBEDTLS)
Packit 6c0a39
    find_package(MbedTLS REQUIRED)
Packit 6c0a39
    if (NOT MBEDTLS_FOUND)
Packit 6c0a39
      message(FATAL_ERROR "Could not find mbedTLS")
Packit 6c0a39
    endif (NOT MBEDTLS_FOUND)
Packit 6c0a39
else (WITH_GCRYPT)
Packit 6c0a39
  find_package(OpenSSL)
Packit 6c0a39
  if (NOT OPENSSL_FOUND)
Packit 6c0a39
    find_package(GCrypt)
Packit 6c0a39
    if (NOT GCRYPT_FOUND)
Packit 6c0a39
      find_package(MbedTLS)
Packit 6c0a39
      if (NOT MBEDTLS_FOUND)
Packit 6c0a39
        message(FATAL_ERROR "Could not find OpenSSL, GCrypt or mbedTLS")
Packit 6c0a39
      endif (NOT MBEDTLS_FOUND)
Packit 6c0a39
    endif (NOT GCRYPT_FOUND)
Packit 6c0a39
  endif (NOT OPENSSL_FOUND)
Packit 6c0a39
endif(WITH_GCRYPT)
Packit 6c0a39
Packit 6c0a39
if (UNIT_TESTING)
Packit 6c0a39
    find_package(CMocka REQUIRED)
Packit 6c0a39
endif ()
Packit 6c0a39
Packit 6c0a39
# Find out if we have threading available
Packit 6c0a39
set(CMAKE_THREAD_PREFER_PTHREADS ON)
Packit 6c0a39
set(THREADS_PREFER_PTHREAD_FLAG ON)
Packit 6c0a39
find_package(Threads)
Packit 6c0a39
Packit 6c0a39
if (WITH_GSSAPI)
Packit 6c0a39
    find_package(GSSAPI)
Packit 6c0a39
endif (WITH_GSSAPI)
Packit 6c0a39
Packit 6c0a39
if (WITH_NACL)
Packit 6c0a39
    find_package(NaCl)
Packit 6c0a39
    if (NOT NACL_FOUND)
Packit 6c0a39
        set(WITH_NACL OFF)
Packit 6c0a39
    endif (NOT NACL_FOUND)
Packit 6c0a39
endif (WITH_NACL)
Packit 6c0a39
Packit 6c0a39
if (BSD OR SOLARIS OR OSX)
Packit 6c0a39
    find_package(Argp)
Packit 6c0a39
endif (BSD OR SOLARIS OR OSX)
Packit 6c0a39
Packit 6c0a39
# Disable symbol versioning in non UNIX platforms
Packit 6c0a39
if (UNIX)
Packit 6c0a39
    find_package(ABIMap 0.3.1)
Packit 6c0a39
else (UNIX)
Packit 6c0a39
    set(WITH_SYMBOL_VERSIONING OFF)
Packit 6c0a39
endif (UNIX)
Packit 6c0a39
Packit 6c0a39
# config.h checks
Packit 6c0a39
include(ConfigureChecks.cmake)
Packit 6c0a39
configure_file(config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config.h)
Packit 6c0a39
Packit 6c0a39
# check subdirectories
Packit 6c0a39
add_subdirectory(doc)
Packit 6c0a39
add_subdirectory(include)
Packit 6c0a39
add_subdirectory(src)
Packit 6c0a39
Packit 6c0a39
# pkg-config file
Packit 6c0a39
if (UNIX)
Packit 6c0a39
configure_file(libssh.pc.cmake ${CMAKE_CURRENT_BINARY_DIR}/libssh.pc)
Packit 6c0a39
install(
Packit 6c0a39
  FILES
Packit 6c0a39
    ${CMAKE_CURRENT_BINARY_DIR}/libssh.pc
Packit 6c0a39
  DESTINATION
Packit 6c0a39
    ${LIB_INSTALL_DIR}/pkgconfig
Packit 6c0a39
  COMPONENT
Packit 6c0a39
    pkgconfig
Packit 6c0a39
)
Packit 6c0a39
endif (UNIX)
Packit 6c0a39
Packit 6c0a39
# CMake config files
Packit 6c0a39
include(CMakePackageConfigHelpers)
Packit 6c0a39
Packit 6c0a39
set(LIBSSH_LIBRARY_NAME ${CMAKE_SHARED_LIBRARY_PREFIX}ssh${CMAKE_SHARED_LIBRARY_SUFFIX})
Packit 6c0a39
Packit 6c0a39
# libssh-config-version.cmake
Packit 6c0a39
write_basic_package_version_file(libssh-config-version.cmake
Packit 6c0a39
                                 VERSION ${PROJECT_VERSION}
Packit 6c0a39
                                 COMPATIBILITY SameMajorVersion)
Packit 6c0a39
Packit 6c0a39
# libssh-config.cmake
Packit 6c0a39
configure_package_config_file(${PROJECT_NAME}-config.cmake.in
Packit 6c0a39
                              ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config.cmake
Packit 6c0a39
                              INSTALL_DESTINATION ${CMAKE_INSTALL_DIR}/${PROJECT_NAME}
Packit 6c0a39
                              PATH_VARS INCLUDE_INSTALL_DIR LIB_INSTALL_DIR)
Packit 6c0a39
Packit 6c0a39
install(
Packit 6c0a39
    FILES
Packit 6c0a39
        ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config.cmake
Packit 6c0a39
        ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake
Packit 6c0a39
    DESTINATION
Packit 6c0a39
        ${CMAKE_INSTALL_DIR}/${PROJECT_NAME}
Packit 6c0a39
    COMPONENT
Packit 6c0a39
        devel
Packit 6c0a39
)
Packit 6c0a39
Packit 6c0a39
if (WITH_EXAMPLES)
Packit 6c0a39
    add_subdirectory(examples)
Packit 6c0a39
endif (WITH_EXAMPLES)
Packit 6c0a39
Packit 6c0a39
if (UNIT_TESTING)
Packit 6c0a39
    include(AddCMockaTest)
Packit 6c0a39
    add_subdirectory(tests)
Packit 6c0a39
endif (UNIT_TESTING)
Packit 6c0a39
Packit 6c0a39
### SOURCE PACKAGE
Packit 6c0a39
if (WITH_SYMBOL_VERSIONING AND ABIMAP_FOUND)
Packit 6c0a39
    # Get the current ABI version from source
Packit 6c0a39
    get_filename_component(current_abi_path
Packit 6c0a39
                           "${CMAKE_SOURCE_DIR}/src/ABI/current"
Packit 6c0a39
                           ABSOLUTE)
Packit 6c0a39
Packit 6c0a39
    # Check if the ABI version should be updated
Packit 6c0a39
    file(READ ${current_abi_path} CURRENT_ABI_CONTENT)
Packit 6c0a39
    string(STRIP "${CURRENT_ABI_CONTENT}" CURRENT_ABI_VERSION)
Packit 6c0a39
Packit 6c0a39
    if (LIBRARY_VERSION VERSION_GREATER CURRENT_ABI_VERSION)
Packit 6c0a39
        set(UPDATE_ABI TRUE)
Packit 6c0a39
    endif ()
Packit 6c0a39
Packit 6c0a39
    if (UPDATE_ABI)
Packit 6c0a39
        message(STATUS "Library version bumped to ${LIBRARY_VERSION}: Updating ABI")
Packit 6c0a39
Packit 6c0a39
        # Get the list of header files
Packit 6c0a39
        get_file_list(${PROJECT_NAME}_header_list
Packit 6c0a39
                      DIRECTORIES "${CMAKE_SOURCE_DIR}/include/libssh"
Packit 6c0a39
                      FILES_PATTERNS "*.h")
Packit 6c0a39
Packit 6c0a39
        # Extract the symbols marked as "LIBSSH_API" from the header files
Packit 6c0a39
        extract_symbols(${PROJECT_NAME}.symbols
Packit 6c0a39
                        HEADERS_LIST ${PROJECT_NAME}_header_list
Packit 6c0a39
                        FILTER_PATTERN "LIBSSH_API"
Packit 6c0a39
                        COPY_TO "${CMAKE_SOURCE_DIR}/src/ABI/${PROJECT_NAME}-${LIBRARY_VERSION}.symbols")
Packit 6c0a39
Packit 6c0a39
        if (WITH_ABI_BREAK)
Packit 6c0a39
            set(ALLOW_ABI_BREAK "BREAK_ABI")
Packit 6c0a39
        endif()
Packit 6c0a39
Packit 6c0a39
        # Target we can depend on in 'make dist'
Packit 6c0a39
        set(_SYMBOL_TARGET "${PROJECT_NAME}.map")
Packit 6c0a39
Packit 6c0a39
        # Set the path to the current map file
Packit 6c0a39
        set(MAP_PATH "${CMAKE_SOURCE_DIR}/src/${_SYMBOL_TARGET}")
Packit 6c0a39
Packit 6c0a39
        # Generate the symbol version map file
Packit 6c0a39
        generate_map_file(${_SYMBOL_TARGET}
Packit 6c0a39
                          SYMBOLS ${PROJECT_NAME}.symbols
Packit 6c0a39
                          RELEASE_NAME_VERSION ${PROJECT_NAME}_${LIBRARY_VERSION}
Packit 6c0a39
                          CURRENT_MAP ${MAP_PATH}
Packit 6c0a39
                          COPY_TO ${MAP_PATH}
Packit 6c0a39
                          FINAL
Packit 6c0a39
                          ${ALLOW_ABI_BREAK})
Packit 6c0a39
Packit 6c0a39
        # Write the current version to the source
Packit 6c0a39
        file(WRITE ${current_abi_path} ${LIBRARY_VERSION})
Packit 6c0a39
    endif(UPDATE_ABI)
Packit 6c0a39
endif (WITH_SYMBOL_VERSIONING AND ABIMAP_FOUND)
Packit 6c0a39
Packit 6c0a39
add_custom_target(dist COMMAND ${CMAKE_MAKE_PROGRAM} package_source DEPENDS ${_SYMBOL_TARGET})
Packit 6c0a39
Packit 6c0a39
message(STATUS "********************************************")
Packit 6c0a39
message(STATUS "********** ${PROJECT_NAME} build options : **********")
Packit 6c0a39
Packit 6c0a39
message(STATUS "zlib support: ${WITH_ZLIB}")
Packit 6c0a39
message(STATUS "libgcrypt support: ${WITH_GCRYPT}")
Packit 6c0a39
message(STATUS "libmbedTLS support: ${WITH_MBEDTLS}")
Packit 6c0a39
message(STATUS "libnacl support: ${WITH_NACL}")
Packit 6c0a39
message(STATUS "SFTP support: ${WITH_SFTP}")
Packit 6c0a39
message(STATUS "Server support : ${WITH_SERVER}")
Packit 6c0a39
message(STATUS "GSSAPI support : ${WITH_GSSAPI}")
Packit 6c0a39
message(STATUS "GEX support : ${WITH_GEX}")
Packit 6c0a39
message(STATUS "Pcap debugging support : ${WITH_PCAP}")
Packit 6c0a39
message(STATUS "With static library: ${WITH_STATIC_LIB}")
Packit 6c0a39
message(STATUS "Unit testing: ${UNIT_TESTING}")
Packit 6c0a39
message(STATUS "Client code testing: ${CLIENT_TESTING}")
Packit 6c0a39
message(STATUS "Blowfish cipher support: ${WITH_BLOWFISH_CIPHER}")
Packit 6c0a39
set(_SERVER_TESTING OFF)
Packit 6c0a39
if (WITH_SERVER)
Packit 6c0a39
    set(_SERVER_TESTING ${SERVER_TESTING})
Packit 6c0a39
endif()
Packit 6c0a39
message(STATUS "Server code testing: ${_SERVER_TESTING}")
Packit 6c0a39
if (WITH_INTERNAL_DOC)
Packit 6c0a39
    message(STATUS "Internal documentation generation")
Packit 6c0a39
else (WITH_INTERNAL_DOC)
Packit 6c0a39
    message(STATUS "Public API documentation generation")
Packit 6c0a39
endif (WITH_INTERNAL_DOC)
Packit 6c0a39
message(STATUS "Benchmarks: ${WITH_BENCHMARKS}")
Packit 6c0a39
message(STATUS "Symbol versioning: ${WITH_SYMBOL_VERSIONING}")
Packit 6c0a39
message(STATUS "Allow ABI break: ${WITH_ABI_BREAK}")
Packit 6c0a39
message(STATUS "Release is final: ${WITH_FINAL}")
Packit 6c0a39
message(STATUS "Global client config: ${GLOBAL_CLIENT_CONFIG}")
Packit 6c0a39
if (WITH_SERVER)
Packit 6c0a39
message(STATUS "Global bind config: ${GLOBAL_BIND_CONFIG}")
Packit 6c0a39
endif()
Packit 6c0a39
message(STATUS "********************************************")
Packit 6c0a39