310 lines
12 KiB
CMake
310 lines
12 KiB
CMake
############################################################################
|
|
# CMakeLists.txt
|
|
# Copyright (C) 2010-2024 Belledonne Communications, Grenoble France
|
|
#
|
|
############################################################################
|
|
#
|
|
# This program is free software; you can redistribute it and/or
|
|
# modify it under the terms of the GNU General Public License
|
|
# as published by the Free Software Foundation; either version 2
|
|
# of the License, or (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write to the Free Software
|
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
#
|
|
############################################################################
|
|
|
|
cmake_minimum_required(VERSION 3.22)
|
|
|
|
# CMP0076 is required to use relative path in target_sources.
|
|
cmake_policy(SET CMP0076 NEW)
|
|
# CMP0077 is required to correctly force the value of subprojects' cache variables.
|
|
cmake_policy(SET CMP0077 NEW)
|
|
|
|
# Require C++17
|
|
set(CMAKE_CXX_STANDARD 17)
|
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
|
|
|
# -O0 disables optimizations. Any level of optimization (higher than 0) will throw off debuggers while stepping through source code.
|
|
# With sanitizers enabled, fortifying source requires some optimizations. This is unwanted in Debug builds.
|
|
set(CMAKE_C_FLAGS_DEBUG_INIT "-g -O0 -U_FORTIFY_SOURCE -fdiagnostics-color=always")
|
|
set(CMAKE_CXX_FLAGS_DEBUG_INIT ${CMAKE_C_FLAGS_DEBUG_INIT})
|
|
|
|
include("./linphone-sdk/bctoolbox/cmake/BCToolboxCMakeUtils.cmake")
|
|
if(FLEXISIP_VERSION)
|
|
message(WARNING "Ignoring git version, using provided \"${FLEXISIP_VERSION}\" instead")
|
|
set(FLEXISIP_FULL_VERSION ${FLEXISIP_VERSION})
|
|
else()
|
|
# Set project version by using the Git describe
|
|
bc_compute_full_version(FLEXISIP_FULL_VERSION)
|
|
endif()
|
|
bc_parse_full_version("${FLEXISIP_FULL_VERSION}" major minor patch)
|
|
project(flexisip VERSION "${major}.${minor}.${patch}" LANGUAGES C CXX)
|
|
unset(major)
|
|
unset(minor)
|
|
unset(patch)
|
|
|
|
include(CMakePushCheckState)
|
|
include(CMakeDependentOption)
|
|
include(CheckSymbolExists)
|
|
include(CheckFunctionExists)
|
|
include(FeatureSummary)
|
|
include(CheckCXXSourceCompiles)
|
|
include(GNUInstallDirs)
|
|
include("cmake/FlexisipUtils.cmake")
|
|
|
|
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
|
|
set(IS_DEBUG TRUE)
|
|
else()
|
|
set(IS_DEBUG FALSE)
|
|
endif()
|
|
|
|
option(ENABLE_SANITIZERS "Turn on sanitizers, like the LSAN memory leak detector" ${IS_DEBUG})
|
|
option(ENABLE_STRICT "Pass strict flags to the compiler" ON)
|
|
option(ENABLE_STRICT_LINPHONESDK "Pass strict flags to the compiler for all Linphone SDK submodules" OFF)
|
|
option(ENABLE_DATEHANDLER "Build DateHandler module" OFF)
|
|
option(ENABLE_PDFDOC "Build PDF documentation" OFF)
|
|
option(ENABLE_MONOTONIC_CLOCK_REGISTRATIONS "Enable monotonic clock for registrations" OFF)
|
|
option(ENABLE_PRESENCE "Build with presence server support" ON)
|
|
option(ENABLE_REDIS "Build with Redis support" ON)
|
|
option(ENABLE_SNMP "Build with SNMP support" ON)
|
|
option(ENABLE_SOCI "Build with SOCI support" ON)
|
|
option(ENABLE_TRANSCODER "Build with transcoder support" ON)
|
|
option(ENABLE_MDNS "Build with multicast DNS support" OFF)
|
|
option(ENABLE_EXTERNAL_AUTH_PLUGIN "Enable ExternalAuth plugin support" ON)
|
|
option(ENABLE_JWE_AUTH_PLUGIN "[Deprecated] Enable JweAuth plugin support" ON)
|
|
option(ENABLE_UNIT_TESTS "Enable Flexisip unit tests (low level tests)" OFF)
|
|
add_ccache_option(ON)
|
|
option(ENABLE_COVERAGE "Enable flexisip clang test coverage reports (add instrumentation)" OFF)
|
|
option(ENABLE_MSGPACK "[Deprecated] Build with support for MessagePack for Record serializing" OFF)
|
|
option(ENABLE_FLEXIAPI "Support for sending usage statistics (messages, calls, conferences) to the Flexisip Account Manager" ON)
|
|
option(INTERNAL_LIBSRTP2 "Build SRTP2 source code present as linphone-sdk submodule instead of searching it in system libraries" ON)
|
|
option(INTERNAL_JSONCPP "Build and use vendored Jsoncpp source code instead of searching for it in system libraries" OFF)
|
|
|
|
cmake_dependent_option(INTERNAL_LIBHIREDIS "Build libhiredis source code present as Flexisip submodule instead of searching it in system libraries" OFF "ENABLE_REDIS" OFF)
|
|
cmake_dependent_option(ENABLE_CONFERENCE "Build conference support" ON "ENABLE_SOCI" OFF)
|
|
cmake_dependent_option(ENABLE_SOCI_POSTGRESQL_BACKEND "Build with SOCI Postgre sql backend support" ON "ENABLE_SOCI" OFF)
|
|
cmake_dependent_option(ENABLE_B2BUA "Enable Back2back user agent support" ON "ENABLE_SOCI" OFF)
|
|
cmake_dependent_option(ENABLE_UNIT_TESTS_NGHTTP2ASIO "Enable unit tests requiring libnghttp2_asio" ON "ENABLE_UNIT_TESTS" ON)
|
|
cmake_dependent_option(ENABLE_SPECIFIC_FEATURES "Enable media relay specific features" OFF "ENABLE_TRANSCODER" OFF)
|
|
|
|
set(CPACK_GENERATOR "" CACHE STRING "Generator to use for making package. Supported values: 'RPM', 'DEB'")
|
|
set(SYSCONF_INSTALL_DIR "" CACHE STRING
|
|
"Configuration directory, the place where Flexisip expects its flexisip.conf file to reside. Always equal to '${CMAKE_INSTALL_FULL_SYSCONFDIR}' if empty."
|
|
)
|
|
set(FLEXISIP_SYSTEMD_INSTALL_DIR "" CACHE STRING
|
|
"Where to install the SystemD units. Always equal to '${CMAKE_INSTALL_FULL_DATAROOTDIR}/systemd/system' if empty."
|
|
)
|
|
|
|
if(ENABLE_CONFERENCE OR ENABLE_B2BUA)
|
|
set(LIBLINPHONE_REQUIRED ON)
|
|
set(HAVE_LIBLINPHONE YES)
|
|
set(HAVE_LIBLINPHONECXX YES)
|
|
elseif(ENABLE_UNIT_TESTS)
|
|
set(LIBLINPHONE_REQUIRED ON)
|
|
else()
|
|
set(LIBLINPHONE_REQUIRED OFF)
|
|
endif()
|
|
|
|
if(ENABLE_SOCI OR LIBLINPHONE_REQUIRED)
|
|
set(SOCI_REQUIRED ON)
|
|
else()
|
|
set(SOCI_REQUIRED OFF)
|
|
endif()
|
|
|
|
# It seems -fsanitize=address and -Wuninitialized don't play well together
|
|
if(CMAKE_BUILD_TYPE STREQUAL "Sanitizer"
|
|
AND CMAKE_CXX_COMPILER_ID STREQUAL "GNU"
|
|
)
|
|
# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105616
|
|
if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 13 AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS_EQUAL 13.2.1)
|
|
set(HAS_GCC_BUG_105616 ON)
|
|
# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105562
|
|
elseif(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 12 AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS_EQUAL 12.3.0)
|
|
set(HAS_GCC_BUG_105562 ON)
|
|
endif()
|
|
endif()
|
|
|
|
# Place the built libraries and executables in top level directories 'lib' and 'bin' in the build tree.
|
|
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib" CACHE PATH "Archive output dir.")
|
|
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib" CACHE PATH "Library output dir.")
|
|
set(CMAKE_PDB_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin" CACHE PATH "PDB (MSVC debug symbol)output dir.")
|
|
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin" CACHE PATH "Executable/dll output dir.")
|
|
|
|
# Advanced options (i.e. hidden to the user by default)
|
|
option(ENABLE_LIBLINPHONE_TESTER "Build liblinphone_tester executable." OFF)
|
|
mark_as_advanced(ENABLE_LIBLINPHONE_TESTER)
|
|
|
|
# Handle the default value of installation paths. That ensures that they are
|
|
# always relative to the install prefix when the user hasn't set them explicitly.
|
|
if(SYSCONF_INSTALL_DIR STREQUAL "")
|
|
set(SYSCONF_INSTALL_DIR "${CMAKE_INSTALL_FULL_SYSCONFDIR}")
|
|
endif()
|
|
if(FLEXISIP_SYSTEMD_INSTALL_DIR STREQUAL "")
|
|
set(FLEXISIP_SYSTEMD_INSTALL_DIR "${CMAKE_INSTALL_FULL_DATAROOTDIR}/systemd/system")
|
|
endif()
|
|
|
|
# Build libflexisip and all its dependencies as shared libraries
|
|
set(BUILD_SHARED_LIBS ON)
|
|
|
|
if(NOT CMAKE_INSTALL_RPATH AND CMAKE_INSTALL_PREFIX)
|
|
set(CMAKE_INSTALL_RPATH ${CMAKE_INSTALL_FULL_LIBDIR})
|
|
message(STATUS "Setting install rpath to ${CMAKE_INSTALL_RPATH}")
|
|
endif()
|
|
|
|
set(CONFIG_DIR "${SYSCONF_INSTALL_DIR}/flexisip")
|
|
message(STATUS "Config dir: ${CONFIG_DIR}")
|
|
|
|
set(INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX})
|
|
|
|
function(FIND_PROGRAM_REQUIRED varname progname)
|
|
find_program(${varname} NAMES "${progname}")
|
|
if(NOT ${varname})
|
|
message(FATAL_ERROR "Program '${progname}' is required but could not be found")
|
|
endif()
|
|
endfunction()
|
|
|
|
|
|
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
|
|
|
|
set(INTERNAL_MBEDTLS ON)
|
|
include("cmake/ExternalDependencies.cmake")
|
|
include("cmake/LinphoneSDK.cmake")
|
|
|
|
# Required packages
|
|
|
|
find_package(LibNgHttp2 REQUIRED)
|
|
find_package(Threads)
|
|
find_package(XercesC)
|
|
|
|
# Dummy executable used by the type-safe abstractions over POSIX processes
|
|
find_program(DUMMY_EXEC NAMES true REQUIRED)
|
|
|
|
check_function_exists(arc4random HAVE_ARC4RANDOM)
|
|
find_file(HAVE_SYS_PRCTL_H NAMES sys/prctl.h)
|
|
|
|
set(CMAKE_REQUIRED_LIBRARIES)
|
|
|
|
# Enable std::filesystem on old implementations (GNU <9.1, LLVM <9.0)
|
|
link_libraries("stdc++fs")
|
|
|
|
# Options
|
|
if(ENABLE_SNMP)
|
|
# todo: Not quite ready
|
|
FIND_PROGRAM_REQUIRED(NET_SNMP_PROG net-snmp-config)
|
|
find_path(NET_SNMP_INCLUDE_DIRS NAMES net-snmp/net-snmp-config.h)
|
|
if(NOT NET_SNMP_INCLUDE_DIRS)
|
|
message(FATAL_ERROR "SNMP header files not found")
|
|
endif()
|
|
|
|
execute_process(COMMAND "${NET_SNMP_PROG}" "--agent-libs" OUTPUT_VARIABLE NET_SNMP_LIBRARIES OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
endif()
|
|
|
|
if(ENABLE_SPECIFIC_FEATURES)
|
|
set(MEDIARELAY_SPECIFIC_FEATURES_ENABLED ON)
|
|
endif()
|
|
|
|
|
|
if(ENABLE_MONOTONIC_CLOCK_REGISTRATIONS)
|
|
set(MONOTONIC_CLOCK_REGISTRATIONS ON)
|
|
endif()
|
|
|
|
if(ENABLE_DATEHANDLER)
|
|
set(HAVE_DATEHANDLER ON)
|
|
endif()
|
|
|
|
if(ENABLE_REDIS AND NOT INTERNAL_LIBHIREDIS)
|
|
find_package(Hiredis 0.14 REQUIRED)
|
|
endif()
|
|
|
|
if(ENABLE_PDFDOC)
|
|
FIND_PROGRAM_REQUIRED(PDFLATEX_PROG pdflatex)
|
|
endif()
|
|
|
|
if(ENABLE_MSGPACK)
|
|
find_path(MSGPACK_INCLUDE_DIRS NAMES msgpack.hpp HINTS /usr/local/include REQUIRED)
|
|
add_definitions("-DENABLE_MSGPACK")
|
|
endif()
|
|
|
|
# Allow to use SLOGD and LOGD macros.
|
|
add_definitions("-DBCTBX_DEBUG_MODE")
|
|
|
|
|
|
find_package(OpenSSL 0.9.8 REQUIRED)
|
|
|
|
feature_summary(WHAT ALL INCLUDE_QUIET_PACKAGES FATAL_ON_MISSING_REQUIRED_PACKAGES)
|
|
|
|
include_directories(
|
|
"include"
|
|
"src"
|
|
"src/plugin"
|
|
"src/presence"
|
|
"${CMAKE_CURRENT_BINARY_DIR}"
|
|
"${CMAKE_CURRENT_BINARY_DIR}/include"
|
|
"${CMAKE_CURRENT_BINARY_DIR}/src"
|
|
)
|
|
|
|
set(BELR_GRAMMARS_DIR "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_DATADIR}/belr/grammars")
|
|
|
|
configure_file(cmake/flexisip-config.h.in flexisip-config.h)
|
|
set_source_files_properties(${PROJECT_BINARY_DIR}/flexisip-config.h PROPERTIES GENERATED ON)
|
|
add_compile_definitions("HAVE_CONFIG_H")
|
|
|
|
# Compute and set compilation options
|
|
bc_init_compilation_flags(CPP_BUILD_FLAGS C_BUILD_FLAGS CXX_BUILD_FLAGS ENABLE_STRICT)
|
|
|
|
if(ENABLE_SANITIZERS)
|
|
set(SANITIZERS_FLAG "-fsanitize=address,undefined")
|
|
add_compile_options(
|
|
${SANITIZERS_FLAG}
|
|
"-fno-omit-frame-pointer"
|
|
"-fno-optimize-sibling-calls"
|
|
)
|
|
add_link_options(${SANITIZERS_FLAG})
|
|
endif()
|
|
|
|
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
|
|
if(ENABLE_STRICT)
|
|
list(APPEND CXX_BUILD_FLAGS
|
|
"-Werror=unused-result" # Packaging (on Ubuntu) has this on, so better catch it sooner
|
|
"-Werror=maybe-uninitialized" # GCC on CentOS 7 treats this as an error
|
|
)
|
|
endif()
|
|
# -Werror=varargs seems to do false positives with GCC 4.9.x
|
|
if(CMAKE_CXX_COMPILER_VERSION MATCHES "^4\\.9\\.[0-9]+$")
|
|
list(APPEND CXX_BUILD_FLAGS "-Wno-error=varargs")
|
|
endif()
|
|
if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 7)
|
|
# Old compiler (gcc6 on Debian 9 Stretch) are giving us some toubles...
|
|
list(APPEND CXX_BUILD_FLAGS "-Wno-error=unused-variable" "-Wno-error=attributes")
|
|
else()
|
|
# GCC on CentOS 7 treats this as an error
|
|
list(APPEND CXX_BUILD_FLAGS "-Werror=format-truncation=1")
|
|
endif()
|
|
|
|
endif()
|
|
if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
|
|
# Old compiler (clang3 on Debian 9 Stretch) are giving us some toubles...
|
|
if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4)
|
|
list(APPEND CXX_BUILD_FLAGS "-Wno-error=unused-variable" "-Wno-error=unknown-attributes")
|
|
endif()
|
|
endif()
|
|
add_compile_options(${CPP_BUILD_FLAGS} ${CXX_BUILD_FLAGS})
|
|
|
|
add_subdirectory(include)
|
|
add_subdirectory(src)
|
|
add_subdirectory(scripts)
|
|
add_subdirectory(share)
|
|
|
|
if(ENABLE_UNIT_TESTS)
|
|
add_subdirectory(tester)
|
|
endif()
|
|
|
|
# Packaging
|
|
add_subdirectory(packaging)
|