flexisip/CMakeLists.txt
2025-06-16 13:54:12 +07:00

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)