mirror of
https://git.libssh.org/projects/libssh.git
synced 2026-02-06 10:27:22 +09:00
This adds a cmake module, FindABIMap, which looks for abimap and provides functions to generate a symbol version linker script. The module can be included using find_package(ABIMap). This also adds the option to compile with symbol versioning. The symbol list is obtained from the header files by filtering those marked with the LIBSSH_API modifier. Such symbols are used as input to generate the version script used by the linker. The version script is automatically updated as new symbols marked with LIBSSH_API are added to the header files. If any symbol is removed, the build will fail due to break in the ABI. Symbol versioning is enabled by default if abimap has been found. It is disabled in non-UNIX platforms. It can be disabled by passing "-DWITH_SYMBOL_VERSIONING=OFF" option to cmake. Pair-Programmed-With: Andreas Schneider <asn@cryptomilk.org> Signed-off-by: Anderson Toshiyuki Sasaki <ansasaki@redhat.com> Signed-off-by: Andreas Schneider <asn@cryptomilk.org>
227 lines
7.2 KiB
CMake
227 lines
7.2 KiB
CMake
cmake_minimum_required(VERSION 3.2.0)
|
|
cmake_policy(SET CMP0048 NEW)
|
|
|
|
project(libssh VERSION 0.8.0 DESCRIPTION "The SSH library" LANGUAGES C)
|
|
|
|
# global needed variable
|
|
set(APPLICATION_NAME ${PROJECT_NAME})
|
|
|
|
# SOVERSION scheme: CURRENT.AGE.REVISION
|
|
# If there was an incompatible interface change:
|
|
# Increment CURRENT. Set AGE and REVISION to 0
|
|
# If there was a compatible interface change:
|
|
# Increment AGE. Set REVISION to 0
|
|
# If the source code was changed, but there were no interface changes:
|
|
# Increment REVISION.
|
|
set(LIBRARY_VERSION "4.5.0")
|
|
set(LIBRARY_SOVERSION "4")
|
|
|
|
# where to look first for cmake modules, before ${CMAKE_ROOT}/Modules/ is checked
|
|
set(CMAKE_MODULE_PATH
|
|
${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules
|
|
)
|
|
|
|
# add definitions
|
|
include(DefineCMakeDefaults)
|
|
include(DefinePlatformDefaults)
|
|
include(DefineCompilerFlags)
|
|
include(DefineInstallationPaths)
|
|
include(DefineOptions.cmake)
|
|
include(CPackConfig.cmake)
|
|
|
|
# disallow in-source build
|
|
include(MacroEnsureOutOfSourceBuild)
|
|
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.")
|
|
|
|
# search for libraries
|
|
if (WITH_ZLIB)
|
|
find_package(ZLIB REQUIRED)
|
|
endif (WITH_ZLIB)
|
|
|
|
if (WITH_GCRYPT)
|
|
find_package(GCrypt 1.5.0 REQUIRED)
|
|
if (NOT GCRYPT_FOUND)
|
|
message(FATAL_ERROR "Could not find GCrypt")
|
|
endif (NOT GCRYPT_FOUND)
|
|
elseif(WITH_MBEDTLS)
|
|
find_package(MbedTLS REQUIRED)
|
|
if (NOT MBEDTLS_FOUND)
|
|
message(FATAL_ERROR "Could not find mbedTLS")
|
|
endif (NOT MBEDTLS_FOUND)
|
|
else (WITH_GCRYPT)
|
|
find_package(OpenSSL)
|
|
if (NOT OPENSSL_FOUND)
|
|
find_package(GCrypt)
|
|
if (NOT GCRYPT_FOUND)
|
|
find_package(MbedTLS)
|
|
if (NOT MBEDTLS_FOUND)
|
|
message(FATAL_ERROR "Could not find OpenSSL, GCrypt or mbedTLS")
|
|
endif (NOT MBEDTLS_FOUND)
|
|
endif (NOT GCRYPT_FOUND)
|
|
endif (NOT OPENSSL_FOUND)
|
|
endif(WITH_GCRYPT)
|
|
|
|
# Find out if we have threading available
|
|
set(CMAKE_THREAD_PREFER_PTHREADS ON)
|
|
set(THREADS_PREFER_PTHREAD_FLAG ON)
|
|
find_package(Threads)
|
|
|
|
if (WITH_GSSAPI)
|
|
find_package(GSSAPI)
|
|
endif (WITH_GSSAPI)
|
|
|
|
if (WITH_NACL)
|
|
find_package(NaCl)
|
|
if (NOT NACL_FOUND)
|
|
set(WITH_NACL OFF)
|
|
endif (NOT NACL_FOUND)
|
|
endif (WITH_NACL)
|
|
|
|
if (BSD OR SOLARIS OR OSX)
|
|
find_package(Argp)
|
|
endif (BSD OR SOLARIS OR OSX)
|
|
|
|
# Disable symbol versioning in non UNIX platforms
|
|
if (UNIX)
|
|
find_package(ABIMap)
|
|
else (UNIX)
|
|
set(WITH_SYMBOL_VERSIONING OFF)
|
|
endif (UNIX)
|
|
|
|
# config.h checks
|
|
include(ConfigureChecks.cmake)
|
|
configure_file(config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config.h)
|
|
|
|
# check subdirectories
|
|
add_subdirectory(doc)
|
|
add_subdirectory(include)
|
|
add_subdirectory(src)
|
|
|
|
# pkg-config file
|
|
if (UNIX)
|
|
configure_file(libssh.pc.cmake ${CMAKE_CURRENT_BINARY_DIR}/libssh.pc)
|
|
install(
|
|
FILES
|
|
${CMAKE_CURRENT_BINARY_DIR}/libssh.pc
|
|
DESTINATION
|
|
${LIB_INSTALL_DIR}/pkgconfig
|
|
COMPONENT
|
|
pkgconfig
|
|
)
|
|
endif (UNIX)
|
|
|
|
# cmake config files
|
|
set(LIBSSH_LIBRARY_NAME ${CMAKE_SHARED_LIBRARY_PREFIX}ssh${CMAKE_SHARED_LIBRARY_SUFFIX})
|
|
|
|
configure_file(${PROJECT_NAME}-config.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config.cmake @ONLY)
|
|
configure_file(${PROJECT_NAME}-config-version.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake @ONLY)
|
|
install(
|
|
FILES
|
|
${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config.cmake
|
|
${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake
|
|
DESTINATION
|
|
${CMAKE_INSTALL_DIR}/${PROJECT_NAME}
|
|
COMPONENT
|
|
devel
|
|
)
|
|
|
|
|
|
# in tree build settings
|
|
configure_file(libssh-build-tree-settings.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/libssh-build-tree-settings.cmake @ONLY)
|
|
|
|
if (WITH_EXAMPLES)
|
|
add_subdirectory(examples)
|
|
endif (WITH_EXAMPLES)
|
|
|
|
if (UNIT_TESTING)
|
|
find_package(CMocka REQUIRED)
|
|
include(AddCMockaTest)
|
|
add_subdirectory(tests)
|
|
endif (UNIT_TESTING)
|
|
|
|
### SOURCE PACKAGE
|
|
if (WITH_SYMBOL_VERSIONING AND ABIMAP_FOUND)
|
|
# Get the current ABI version from source
|
|
get_filename_component(current_abi_path
|
|
"${CMAKE_SOURCE_DIR}/src/ABI/current"
|
|
ABSOLUTE)
|
|
|
|
# Check if the ABI version should be updated
|
|
file(READ ${current_abi_path} CURRENT_ABI_CONTENT)
|
|
string(STRIP "${CURRENT_ABI_CONTENT}" CURRENT_ABI_VERSION)
|
|
|
|
if (LIBRARY_VERSION VERSION_GREATER CURRENT_ABI_VERSION)
|
|
set(UPDATE_ABI TRUE)
|
|
endif ()
|
|
|
|
if (UPDATE_ABI)
|
|
message(STATUS "Library version bumped to ${LIBRARY_VERSION}: Updating ABI")
|
|
|
|
# Get the list of header files
|
|
get_file_list("${PROJECT_NAME}_header_list"
|
|
DIRECTORIES "${CMAKE_SOURCE_DIR}/include/libssh"
|
|
FILES_PATTERNS "*.h")
|
|
|
|
# Extract the symbols marked as "LIBSSH_API" from the header files
|
|
extract_symbols(${PROJECT_NAME}.symbols
|
|
HEADERS_LIST_FILE "${PROJECT_NAME}_header_list"
|
|
FILTER_PATTERN "LIBSSH_API"
|
|
COPY_TO "${CMAKE_SOURCE_DIR}/src/ABI/${PROJECT_NAME}-${LIBRARY_VERSION}.symbols")
|
|
|
|
if (WITH_ABI_BREAK)
|
|
set(ALLOW_ABI_BREAK "BREAK_ABI")
|
|
endif()
|
|
|
|
# Target we can depend on in 'make dist'
|
|
set(_SYMBOL_TARGET "${PROJECT_NAME}.map")
|
|
|
|
# Set the path to the current map file
|
|
set(MAP_PATH "${CMAKE_SOURCE_DIR}/src/${_SYMBOL_TARGET}")
|
|
|
|
# Generate the symbol version map file
|
|
generate_map_file(${_SYMBOL_TARGET}
|
|
SYMBOLS "${PROJECT_NAME}.symbols"
|
|
RELEASE_NAME_VERSION ${PROJECT_NAME}_${LIBRARY_VERSION}
|
|
CURRENT_MAP ${MAP_PATH}
|
|
COPY_TO ${MAP_PATH}
|
|
FINAL
|
|
${ALLOW_ABI_BREAK})
|
|
|
|
# Write the current version to the source
|
|
file(WRITE ${current_abi_path} ${LIBRARY_VERSION})
|
|
endif(UPDATE_ABI)
|
|
endif (WITH_SYMBOL_VERSIONING AND ABIMAP_FOUND)
|
|
|
|
add_custom_target(dist COMMAND ${CMAKE_MAKE_PROGRAM} package_source DEPENDS ${_SYMBOL_TARGET})
|
|
|
|
message(STATUS "********************************************")
|
|
message(STATUS "********** ${PROJECT_NAME} build options : **********")
|
|
|
|
message(STATUS "zlib support: ${WITH_ZLIB}")
|
|
message(STATUS "libgcrypt support: ${WITH_GCRYPT}")
|
|
message(STATUS "libmbedTLS support: ${WITH_MBEDTLS}")
|
|
message(STATUS "libnacl support: ${WITH_NACL}")
|
|
message(STATUS "SFTP support: ${WITH_SFTP}")
|
|
message(STATUS "Server support : ${WITH_SERVER}")
|
|
message(STATUS "GSSAPI support : ${WITH_GSSAPI}")
|
|
message(STATUS "Pcap debugging support : ${WITH_PCAP}")
|
|
message(STATUS "With static library: ${WITH_STATIC_LIB}")
|
|
message(STATUS "Unit testing: ${UNIT_TESTING}")
|
|
message(STATUS "Client code testing: ${CLIENT_TESTING}")
|
|
set(_SERVER_TESTING OFF)
|
|
if (WITH_SERVER)
|
|
set(_SERVER_TESTING ${SERVER_TESTING})
|
|
endif()
|
|
message(STATUS "Server code testing: ${_SERVER_TESTING}")
|
|
if (WITH_INTERNAL_DOC)
|
|
message(STATUS "Internal documentation generation")
|
|
else (WITH_INTERNAL_DOC)
|
|
message(STATUS "Public API documentation generation")
|
|
endif (WITH_INTERNAL_DOC)
|
|
message(STATUS "Benchmarks: ${WITH_BENCHMARKS}")
|
|
message(STATUS "Symbol versioning: ${WITH_SYMBOL_VERSIONING}")
|
|
message(STATUS "Allow ABI break: ${WITH_ABI_BREAK}")
|
|
message(STATUS "Release is final: ${WITH_FINAL}")
|
|
message(STATUS "********************************************")
|
|
|