Blame CMakeLists.txt

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