blob: a35f8329594c25c0eefd7a0c2e62f1a5118909b8 [file] [log] [blame]
cmake_minimum_required(VERSION 3.16)
project(jami-core
VERSION 15.2.0
LANGUAGES C CXX)
set(PACKAGE_NAME "Jami Daemon")
set (CMAKE_CXX_STANDARD 17)
set(PROJECT_LABEL "libjami")
################################################################################
# Build options
################################################################################
option(JAMI_NATPMP "Build with NAT-PMP" ON)
option(JAMI_PUPNP "Build with PUPNP" ON)
option(JAMI_PLUGIN "Build with plugin support" ON)
option(JAMI_JNI "Build the JNI binding" OFF)
option(JAMI_DBUS "Build the DBUS binding" OFF)
option(JAMI_VIDEO "Build with video support" ON)
option(JAMI_VIDEO_ACCEL "Build video hardware acceleration support" ON)
option(BUILD_CONTRIB "Build contrib to CONTRIB_PATH" ON)
option(BUILD_EXTRA_TOOLS "Build extra tools" OFF)
option(ENABLE_ASAN "Enable address sanitization" OFF)
if(ENABLE_ASAN AND NOT MSVC)
message(STATUS "Address sanitization enabled for daemon")
# Add AddressSanitizer flags for both compiler and linker
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -fno-omit-frame-pointer")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address")
endif()
include(CTest)
if(NOT MSVC)
################################################################################
# Contrib
################################################################################
# Android target mapping for contrib
if (ANDROID_ABI STREQUAL "x86")
set(TARGET i686-linux-android)
elseif (ANDROID_ABI STREQUAL "x86_64")
set(TARGET x86_64-linux-android)
elseif (ANDROID_ABI STREQUAL "arm64-v8a")
set(TARGET aarch64-linux-android)
elseif (ANDROID_ABI STREQUAL "armeabi-v7a")
set(TARGET armv7a-linux-androideabi)
else()
set(TARGET ${CMAKE_LIBRARY_ARCHITECTURE})
if (NOT TARGET)
execute_process(COMMAND gcc -dumpmachine COMMAND tr -d '\n' OUTPUT_VARIABLE TARGET)
endif()
endif()
set(CONTRIB_PATH ${CMAKE_CURRENT_SOURCE_DIR}/contrib/${TARGET})
include(ProcessorCount)
ProcessorCount(NPROC)
if(NOT NPROC EQUAL 0)
set(CONTRIB_BUILD_FLAGS -j${NPROC})
endif()
if (BUILD_EXTRA_TOOLS)
set(ENV{PATH} "${CMAKE_CURRENT_SOURCE_DIR}/extras/tools/build/bin:$ENV{PATH}")
execute_process(
COMMAND ./bootstrap
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/extras/tools)
execute_process(
COMMAND make ${CONTRIB_BUILD_FLAGS}
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/extras/tools)
execute_process(
COMMAND make .pkg-config
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/extras/tools)
execute_process(
COMMAND make .gas
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/extras/tools)
endif()
if (JAMI_JNI)
# Generate swig binding
add_custom_command(
OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/bin/jni/jami_wrapper.cpp
COMMAND env PACKAGEDIR=${JAMI_JNI_PACKAGEDIR} "./make-swig.sh"
DEPENDS
${CMAKE_CURRENT_SOURCE_DIR}/bin/jni/make-swig.sh
${CMAKE_CURRENT_SOURCE_DIR}/bin/jni/jni_interface.i
${CMAKE_CURRENT_SOURCE_DIR}/bin/jni/callmanager.i
${CMAKE_CURRENT_SOURCE_DIR}/bin/jni/configurationmanager.i
${CMAKE_CURRENT_SOURCE_DIR}/bin/jni/conversation.i
${CMAKE_CURRENT_SOURCE_DIR}/bin/jni/managerimpl.i
${CMAKE_CURRENT_SOURCE_DIR}/bin/jni/data_view.i
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bin/jni
)
endif()
endif()
if (BUILD_CONTRIB)
if (NOT MSVC)
set(CONTRIB_BUILD_PATH ${CMAKE_CURRENT_SOURCE_DIR}/contrib/native-${TARGET})
file(MAKE_DIRECTORY ${CONTRIB_BUILD_PATH})
file(MAKE_DIRECTORY ${CONTRIB_PATH})
if (ANDROID)
# See https://developer.android.com/ndk/guides/other_build_systems
set(ENV{ANDROID_NDK} ${ANDROID_NDK})
set(ENV{ANDROID_ABI} ${ANDROID_ABI})
set(ENV{ANDROID_API} ${ANDROID_PLATFORM})
set(ENV{TOOLCHAIN} ${ANDROID_TOOLCHAIN_ROOT})
set(ENV{TARGET} ${TARGET})
set(ENV{API} ${ANDROID_PLATFORM_LEVEL})
set(ENV{CC} $ENV{TOOLCHAIN}/bin/${TARGET}$ENV{API}-clang)
set(ENV{CXX} $ENV{TOOLCHAIN}/bin/${TARGET}$ENV{API}-clang++)
set(ENV{AS} "$ENV{CC} -c")
set(ENV{AR} ${CMAKE_AR})
set(ENV{RANLIB} ${CMAKE_RANLIB})
set(ENV{STRIP} ${CMAKE_STRIP})
set(ENV{LD} $ENV{TOOLCHAIN}/bin/ld)
endif()
execute_process(
COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/contrib/bootstrap --host=${TARGET}
WORKING_DIRECTORY ${CONTRIB_BUILD_PATH})
execute_process(COMMAND make list
WORKING_DIRECTORY ${CONTRIB_BUILD_PATH})
execute_process(COMMAND make ${CONTRIB_BUILD_FLAGS}
WORKING_DIRECTORY ${CONTRIB_BUILD_PATH})
else()
set(SCRIPTS_DIR ${CMAKE_CURRENT_SOURCE_DIR}/extras/scripts)
execute_process(
COMMAND python ${SCRIPTS_DIR}/winmake.py
WORKING_DIRECTORY ${SCRIPTS_DIR}
RESULT_VARIABLE BUILD_RESULT
)
if (BUILD_RESULT)
message(FATAL_ERROR "Contrib build failed.")
else()
message(STATUS "Contrib build successful.")
endif()
endif()
endif()
################################################################################
# Check dependencies
################################################################################
if(NOT MSVC)
include(FindPkgConfig)
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
pkg_search_module (udev REQUIRED IMPORTED_TARGET libudev)
pkg_search_module (pulseaudio REQUIRED IMPORTED_TARGET libpulse)
endif()
endif()
################################################################################
# Source groups
################################################################################
# compat, src source group
if(MSVC)
add_subdirectory("compat")
endif()
add_subdirectory("src")
source_group("Source Files" FILES ${Source_Files})
source_group("Source Files\\client" FILES ${Source_Files__client})
source_group("Source Files\\config" FILES ${Source_Files__config})
source_group("Source Files\\connectivity" FILES ${Source_Files__connectivity})
source_group("Source Files\\connectivity\\security" FILES ${Source_Files__security})
source_group("Source Files\\connectivity\\sip" FILES ${Source_Files__sip})
source_group("Source Files\\jami" FILES ${Source_Files__jami})
source_group("Source Files\\hooks" FILES ${Source_Files__hooks})
source_group("Source Files\\im" FILES ${Source_Files__im})
source_group("Source Files\\jamidht" FILES ${Source_Files__jamidht})
source_group("Source Files\\jamidht\\eth\\libdevcore" FILES ${Source_Files__jamidht__eth__libdevcore})
source_group("Source Files\\jamidht\\eth\\libdevcrypto" FILES ${Source_Files__jamidht__eth__libdevcrypto})
source_group("Source Files\\jamidht\\swarm" FILES ${Source_Files__jamidht__swarm})
source_group("Source Files\\media" FILES ${Source_Files__media})
source_group("Source Files\\media\\audio" FILES ${Source_Files__media__audio})
source_group("Source Files\\media\\audio\\audio-processing" FILES ${Source_Files__media__audio__audio_processing})
source_group("Source Files\\media\\audio\\audio-processing" FILES ${Source_Files__media__audio__webrtc})
source_group("Source Files\\media\\audio\\audio-processing" FILES ${Source_Files__media__audio__speexdsp})
source_group("Source Files\\media\\audio\\sound" FILES ${Source_Files__media__audio__sound})
source_group("Source Files\\media\\video" FILES ${Source_Files__media__video})
source_group("Source Files\\plugin" FILES ${Source_Files__plugin})
if(MSVC)
source_group("Source Files\\media\\audio\\portaudio" FILES ${Source_Files__media__audio__portaudio})
source_group("Source Files\\media\\video\\winvideo" FILES ${Source_Files__media__video__winvideo})
endif()
list (APPEND ALL_FILES
${Source_Files}
${Source_Files__client}
${Source_Files__config}
${Source_Files__connectivity}
${Source_Files__jami}
${Source_Files__hooks}
${Source_Files__im}
${Source_Files__jamidht}
${Source_Files__jamidht__eth__libdevcore}
${Source_Files__jamidht__eth__libdevcrypto}
${Source_Files__jamidht__swarm}
${Source_Files__media}
${Source_Files__media__audio}
${Source_Files__media__audio__sound}
${Source_Files__media__audio__audio_processing}
${Source_Files__media__video}
${Source_Files__security}
${Source_Files__sip}
)
if (JAMI_PLUGIN)
list (APPEND ALL_FILES ${Source_Files__plugin})
endif()
if (ANDROID)
list (APPEND ALL_FILES ${ALL_FILES}
${CMAKE_CURRENT_SOURCE_DIR}/src/media/video/androidvideo/video_device_impl.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/media/video/androidvideo/video_device_monitor_impl.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/media/audio/opensl/audio_player.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/media/audio/opensl/audio_recorder.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/media/audio/opensl/opensllayer.cpp
)
elseif (CMAKE_SYSTEM_NAME STREQUAL "Linux")
if (JAMI_VIDEO)
list (APPEND ALL_FILES ${ALL_FILES}
${CMAKE_CURRENT_SOURCE_DIR}/src/media/video/v4l2/video_device_impl.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/media/video/v4l2/video_device_monitor_impl.cpp
)
endif()
list (APPEND ALL_FILES ${ALL_FILES}
${CMAKE_CURRENT_SOURCE_DIR}/src/media/audio/pulseaudio/audiostream.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/media/audio/pulseaudio/pulselayer.cpp
)
elseif (APPLE)
if (IOS)
list (APPEND ALL_FILES ${ALL_FILES}
${CMAKE_CURRENT_SOURCE_DIR}/src/media/video/iosvideo/video_device_impl.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/media/video/iosvideo/video_device_monitor_impl.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/media/audio/coreaudio/ios/corelayer.mm
)
else()
list (APPEND ALL_FILES ${ALL_FILES}
${CMAKE_CURRENT_SOURCE_DIR}/src/media/video/osxvideo/video_device_impl.mm
${CMAKE_CURRENT_SOURCE_DIR}/src/media/video/osxvideo/video_device_monitor_impl.mm
${CMAKE_CURRENT_SOURCE_DIR}/src/media/audio/coreaudio/osx/corelayer.mm
${CMAKE_CURRENT_SOURCE_DIR}/src/media/audio/coreaudio/osx/audiodevice.cpp
)
endif()
elseif(MSVC)
list (APPEND ALL_FILES ${ALL_FILES}
"${Source_Files__media__audio__portaudio}"
"${Source_Files__media__video__uwpvideo}"
"${Source_Files__media__video__winvideo}"
"${Source_Files__media__audio__webrtc}"
"${Source_Files__media__audio__speexdsp}"
)
endif()
add_library(${PROJECT_NAME} STATIC ${ALL_FILES})
set_target_properties(${PROJECT_NAME} PROPERTIES FOLDER "daemon")
target_compile_definitions(${PROJECT_NAME} PRIVATE
PACKAGE_NAME="${PACKAGE_NAME}"
PACKAGE_VERSION="${PROJECT_VERSION}"
PACKAGE="jami"
LIBJAMI_BUILD
HAVE_RINGNS
ASIO_STANDALONE
MSGPACK_NO_BOOST
)
target_compile_definitions(${PROJECT_NAME} PUBLIC
ASIO_STANDALONE
MSGPACK_NO_BOOST
)
if (JAMI_VIDEO)
target_compile_definitions(${PROJECT_NAME} PRIVATE ENABLE_VIDEO)
if (JAMI_VIDEO_ACCEL)
target_compile_definitions(${PROJECT_NAME} PRIVATE RING_ACCEL)
endif()
endif()
if (JAMI_PLUGIN)
target_compile_definitions(${PROJECT_NAME} PRIVATE ENABLE_PLUGIN)
endif()
if (JAMI_NATPMP)
target_compile_definitions(${PROJECT_NAME} PRIVATE HAVE_LIBNATPMP)
endif()
if (ANDROID)
target_compile_definitions(${PROJECT_NAME} PRIVATE HAVE_OPENSL)
endif()
target_include_directories(${PROJECT_NAME} PRIVATE
"${CMAKE_CURRENT_SOURCE_DIR}/.;"
"${CMAKE_CURRENT_SOURCE_DIR}/src/config;"
"${CMAKE_CURRENT_SOURCE_DIR}/src/connectivity;"
"${CMAKE_CURRENT_SOURCE_DIR}/src/connectivity/security;"
"${CMAKE_CURRENT_SOURCE_DIR}/src/connectivity/sip;"
"${CMAKE_CURRENT_SOURCE_DIR}/src/client;"
"${CMAKE_CURRENT_SOURCE_DIR}/src/hooks;"
"${CMAKE_CURRENT_SOURCE_DIR}/src/im;"
"${CMAKE_CURRENT_SOURCE_DIR}/src/media;"
"${CMAKE_CURRENT_SOURCE_DIR}/src/jamidht;"
"${CMAKE_CURRENT_SOURCE_DIR}/src/jamidht/eth;"
PUBLIC
"${CMAKE_CURRENT_SOURCE_DIR}/src;"
"${CMAKE_CURRENT_SOURCE_DIR}/src/jami;"
)
if(MSVC)
################################################################################
# Target
################################################################################
include("CMake/Utils.cmake")
use_props(${PROJECT_NAME} "${CMAKE_CONFIGURATION_TYPES}" "${DEFAULT_CXX_PROPS}")
################################################################################
# Include necessary .cmake file (need to init use_props first)
################################################################################
include("CMake/Default.cmake")
include("CMake/DefaultCXX.cmake")
# Supress generation of ZERO_CHECK
set(CMAKE_SUPPRESS_REGENERATION true)
set(ROOT_NAMESPACE ringdaemon)
################################################################################
# Output directory
################################################################################
if("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x64")
set_target_properties(${PROJECT_NAME} PROPERTIES
OUTPUT_DIRECTORY_RELEASE "${CMAKE_CURRENT_SOURCE_DIR}/build/lib"
)
endif()
if("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x64")
set_target_properties(${PROJECT_NAME} PROPERTIES
INTERPROCEDURAL_OPTIMIZATION_RELEASE "FALSE"
)
endif()
################################################################################
# Include directories
################################################################################
if("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x64")
target_include_directories(${PROJECT_NAME} PUBLIC
"${CMAKE_CURRENT_SOURCE_DIR}/compat/msvc;"
"${CMAKE_CURRENT_SOURCE_DIR}/contrib/msvc;"
"${CMAKE_CURRENT_SOURCE_DIR}/contrib/msvc/include;"
"${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/ffmpeg/Build/win32/x64/include;"
"${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/sndfile/src;"
"${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/openssl/include;"
"${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/asio/asio/include;"
"${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/restinio/dev;"
"${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/fmt/include;"
"${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/http_parser;"
"${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/natpmp/include;"
"${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/msgpack-c/include;"
"${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/opendht/include;"
"${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/libarchive/libarchive;"
"${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/jsoncpp/include;"
"${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/yaml-cpp/include;"
"${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/pjproject/pjlib/include;"
"${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/pjproject/pjnath/include;"
"${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/pjproject/pjlib-util/include;"
"${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/pjproject/pjsip/include;"
"${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/pjproject/third_party;"
"${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/speexdsp/include;"
"${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/webrtc-audio-processing;"
"${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/portaudio/include;"
"${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/pjproject/pjmedia/include;"
"${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/libgit2/include;"
"${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/dhtnet/include;"
)
endif()
################################################################################
# Compile definitions
################################################################################
if("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x64")
target_compile_definitions(${PROJECT_NAME} PRIVATE
"_WIN32_WINNT=0x0A00;"
"STATIC_GETOPT;"
"LIBARCHIVE_STATIC;"
"OPENDHT_PROXY_CLIENT;"
"OPENDHT_PROXY_SERVER;"
"OPENDHT_PUSH_NOTIFICATIONS;"
"NATPMP_STATICLIB;"
"NDEBUG;"
"_USE_MATH_DEFINES;"
"_SCL_SECURE_NO_WARNINGS;"
"_CRT_SECURE_NO_WARNINGS;"
"NOMINMAX;"
"HAVE_CONFIG_H;"
"WIN32_LEAN_AND_MEAN;"
"WEBRTC_WIN;"
"WEBRTC_AUDIO_PROCESSING_ONLY_BUILD;"
"WEBRTC_NS_FLOAT;"
)
endif()
################################################################################
# Compile and link options
################################################################################
if("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x64")
target_compile_options(${PROJECT_NAME} PRIVATE
/O2;
/Oi;
${DEFAULT_CXX_RUNTIME_LIBRARY};
/Gy;
/MP;
/Oy-;
/sdl-;
/W0;
/FC;
/FS
/nologo;
/Zi;
/wd4996;
/wd4503;
/wd4180;
/wd4244;
/wd4267;
/Zc:__cplusplus;
${DEFAULT_CXX_EXCEPTION_HANDLING}
)
endif()
if("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x64")
target_link_options(${PROJECT_NAME} PRIVATE
/MACHINE:X64;
/OPT:REF;
/OPT:ICF
/VERBOSE:LIB;
/NODEFAULTLIB:libcmtd;
/NODEFAULTLIB:libcmt;
/OPT:NOLBR;
/OPT:NOICF;
/LTCG
)
endif()
################################################################################
# Dependencies
################################################################################
set(libAdditionalDependencies "${CMAKE_STATIC_LINKER_FLAGS} /LTCG
ws2_32.lib
advapi32.lib
Secur32.lib
${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/ffmpeg/Build/win32/x64/lib/libavcodec.lib
${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/ffmpeg/Build/win32/x64/lib/libavdevice.lib
${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/ffmpeg/Build/win32/x64/lib/libavfilter.lib
${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/ffmpeg/Build/win32/x64/lib/libavformat.lib
${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/ffmpeg/Build/win32/x64/lib/libavutil.lib
${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/ffmpeg/Build/win32/x64/lib/libswresample.lib
${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/ffmpeg/Build/win32/x64/lib/libswscale.lib
${CMAKE_CURRENT_SOURCE_DIR}/contrib/msvc/lib/x64/libx264.lib
${CMAKE_CURRENT_SOURCE_DIR}/contrib/msvc/lib/x64/libvpx.lib
${CMAKE_CURRENT_SOURCE_DIR}/contrib/msvc/lib/x64/libopus.lib
${CMAKE_CURRENT_SOURCE_DIR}/contrib/msvc/lib/x64/libmfx.lib
${CMAKE_CURRENT_SOURCE_DIR}/contrib/msvc/lib/x64/libgnutls.lib
${CMAKE_CURRENT_SOURCE_DIR}/contrib/msvc/lib/x64/lib_json.lib
${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/opendht/build/Release/libopendht.lib
${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/argon2/vs2015/Argon2Ref/vs2015/build/Argon2Ref.lib
${CMAKE_CURRENT_SOURCE_DIR}/contrib/msvc/lib/x64/secp256k1.lib
${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/yaml-cpp/build/Release/libyaml-cppmd.lib
${CMAKE_CURRENT_SOURCE_DIR}/contrib/msvc/lib/x64/libupnp.lib
${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/natpmp/build/Release/natpmp.lib
${CMAKE_CURRENT_SOURCE_DIR}/contrib/msvc/lib/x64/archive_static.lib
${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/pjproject/pjsip/lib/pjsip-core-x86_64-x64-vc15-Release.lib
${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/pjproject/pjsip/lib/pjsip-simple-x86_64-x64-vc15-Release.lib
${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/pjproject/pjsip/lib/pjsua2-lib-x86_64-x64-vc15-Release.lib
${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/pjproject/pjsip/lib/pjsua-lib-x86_64-x64-vc15-Release.lib
${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/pjproject/pjsip/lib/pjsip-ua-x86_64-x64-vc15-Release.lib
${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/pjproject/pjmedia/lib/pjmedia-x86_64-x64-vc15-Release.lib
${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/pjproject/pjlib-util/lib/pjlib-util-x86_64-x64-vc15-Release.lib
${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/pjproject/pjlib/lib/pjlib-x86_64-x64-vc15-Release.lib
${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/pjproject/pjnath/lib/pjnath-x86_64-x64-vc15-Release.lib
${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/fmt/msvc/Release/fmt.lib
${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/http_parser/x64/Release/http-parser.lib
${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/openssl/libcrypto.lib
${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/openssl/libssl.lib
${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/speexdsp/lib/libspeexdsp.lib
${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/webrtc-audio-processing/build/Release/webrtc-audio-processing.lib
${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/portaudio/build/Release/portaudio_static_x64.lib
${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/libgit2/build/Release/git2.lib
${CMAKE_CURRENT_SOURCE_DIR}/contrib/build/dhtnet/build/Release/dhtnet.lib
/ignore:4006"
)
set ( CMAKE_STATIC_LINKER_FLAGS ${libAdditionalDependencies} )
else()
include (GNUInstallDirs)
message("Contrib path: ${CONTRIB_PATH}")
list(APPEND CMAKE_FIND_ROOT_PATH ${CONTRIB_PATH})
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE BOTH)
list(APPEND CMAKE_PREFIX_PATH ${CONTRIB_PATH})
find_package (yaml-cpp CONFIG REQUIRED)
pkg_search_module (jsoncpp REQUIRED IMPORTED_TARGET jsoncpp)
pkg_search_module (fmt REQUIRED IMPORTED_TARGET fmt)
pkg_search_module (webrtcap IMPORTED_TARGET webrtc-audio-processing)
pkg_search_module (gnutls REQUIRED IMPORTED_TARGET gnutls)
pkg_search_module (opendht REQUIRED IMPORTED_TARGET opendht)
pkg_search_module (dhtnet REQUIRED IMPORTED_TARGET dhtnet)
pkg_search_module (git2 REQUIRED IMPORTED_TARGET libgit2)
pkg_search_module (secp256k1 REQUIRED IMPORTED_TARGET libsecp256k1)
pkg_search_module (pjproject REQUIRED IMPORTED_TARGET libpjproject)
pkg_search_module (avformat REQUIRED IMPORTED_TARGET libavformat)
pkg_search_module (avdevice REQUIRED IMPORTED_TARGET libavdevice)
pkg_search_module (avfilter REQUIRED IMPORTED_TARGET libavfilter)
pkg_search_module (avcodec REQUIRED IMPORTED_TARGET libavcodec)
pkg_search_module (swresample REQUIRED IMPORTED_TARGET libswresample)
pkg_search_module (swscale REQUIRED IMPORTED_TARGET libswscale)
pkg_search_module (avutil REQUIRED IMPORTED_TARGET libavutil)
pkg_search_module (speexdsp REQUIRED IMPORTED_TARGET speexdsp)
if (JAMI_PLUGIN)
if (APPLE)
pkg_search_module (archive REQUIRED IMPORTED_TARGET minizip)
else()
pkg_search_module (archive REQUIRED IMPORTED_TARGET libarchive)
endif()
endif()
target_link_libraries(${PROJECT_NAME} PRIVATE
PkgConfig::dhtnet
PkgConfig::opendht
PkgConfig::pjproject
PkgConfig::git2
PkgConfig::gnutls
PkgConfig::avformat
PkgConfig::avdevice
PkgConfig::avfilter
PkgConfig::avcodec
PkgConfig::swresample
PkgConfig::swscale
PkgConfig::jsoncpp
yaml-cpp
PkgConfig::secp256k1
PUBLIC
PkgConfig::fmt
PkgConfig::avutil
)
target_compile_options(${PROJECT_NAME} PRIVATE
-fvisibility=hidden
-Wall -Wextra
-Wnon-virtual-dtor
-Wno-deprecated
-Wno-deprecated-declarations
-Wno-unknown-pragmas
)
target_compile_definitions(${PROJECT_NAME} PRIVATE
JAMI_DATADIR="${JAMI_DATADIR}"
PJ_AUTOCONF=1
)
if (ANDROID)
target_link_libraries(${PROJECT_NAME} PRIVATE OpenSLES log)
elseif (CMAKE_SYSTEM_NAME STREQUAL "Linux")
target_link_libraries(${PROJECT_NAME} PRIVATE
PkgConfig::udev
PkgConfig::pulseaudio
)
elseif (APPLE)
target_link_libraries(${PROJECT_NAME} PRIVATE resolv)
target_compile_definitions(${PROJECT_NAME} PRIVATE HAVE_COREAUDIO)
endif()
if (JAMI_PLUGIN)
target_link_libraries(${PROJECT_NAME} PRIVATE PkgConfig::archive)
endif()
if (webrtcap_FOUND)
target_sources(${PROJECT_NAME} PRIVATE ${Source_Files__media__audio__webrtc} )
target_link_libraries(${PROJECT_NAME} PRIVATE PkgConfig::webrtcap)
target_compile_definitions(${PROJECT_NAME} PRIVATE HAVE_WEBRTC_AP)
endif()
if (speexdsp_FOUND)
target_sources(${PROJECT_NAME} PRIVATE ${Source_Files__media__audio__speexdsp} )
target_link_libraries(${PROJECT_NAME} PRIVATE PkgConfig::speexdsp)
target_compile_definitions(${PROJECT_NAME} PRIVATE HAVE_SPEEXDSP)
endif()
install (TARGETS ${PROJECT_NAME})
if (JAMI_JNI)
# Build jni binding
add_library(${PROJECT_NAME}-jni SHARED ${CMAKE_CURRENT_SOURCE_DIR}/bin/jni/jami_wrapper.cpp)
target_link_directories(${PROJECT_NAME}-jni PRIVATE ${CONTRIB_PATH}/lib)
target_link_libraries(${PROJECT_NAME}-jni ${PROJECT_NAME} android log)
target_compile_options(${PROJECT_NAME}-jni PRIVATE
-fvisibility=hidden
-Wall -Wextra
-Wnon-virtual-dtor
-Wno-deprecated
-Wno-deprecated-declarations
-Wno-unknown-pragmas
-Wno-unused-function
-Wno-unused-parameter
)
target_link_options(${PROJECT_NAME}-jni PRIVATE
-Wl,-Bsymbolic
-Wall -Wextra
)
endif()
if (JAMI_DBUS)
find_program(DBusXml2Cpp sdbus-c++-xml2cpp REQUIRED)
pkg_search_module (DBusCpp REQUIRED IMPORTED_TARGET sdbus-c++)
configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/bin/dbus/net.jami.daemon.service.in
${CMAKE_CURRENT_SOURCE_DIR}/bin/dbus/cx.ring.Ring.service
@ONLY)
set(DBUS_XML_FILES
${CMAKE_CURRENT_SOURCE_DIR}/bin/dbus/cx.ring.Ring.CallManager.xml
${CMAKE_CURRENT_SOURCE_DIR}/bin/dbus/cx.ring.Ring.ConfigurationManager.xml
${CMAKE_CURRENT_SOURCE_DIR}/bin/dbus/cx.ring.Ring.Instance.xml
${CMAKE_CURRENT_SOURCE_DIR}/bin/dbus/cx.ring.Ring.PresenceManager.xml
${CMAKE_CURRENT_SOURCE_DIR}/bin/dbus/cx.ring.Ring.VideoManager.xml
${CMAKE_CURRENT_SOURCE_DIR}/bin/dbus/cx.ring.Ring.PluginManagerInterface.xml
)
set(DBUS_ADAPTOR_FILES
${CMAKE_CURRENT_SOURCE_DIR}/bin/dbus/dbuscallmanager.adaptor.h
${CMAKE_CURRENT_SOURCE_DIR}/bin/dbus/dbusconfigurationmanager.adaptor.h
${CMAKE_CURRENT_SOURCE_DIR}/bin/dbus/dbusinstance.adaptor.h
${CMAKE_CURRENT_SOURCE_DIR}/bin/dbus/dbuspresencemanager.adaptor.h
${CMAKE_CURRENT_SOURCE_DIR}/bin/dbus/dbusvideomanager.adaptor.h
${CMAKE_CURRENT_SOURCE_DIR}/bin/dbus/dbuspluginmanagerinterface.adaptor.h
)
set(DBUS_FILES
${CMAKE_CURRENT_SOURCE_DIR}/bin/dbus/main.cpp
)
# XML adaptors
foreach(DBUS_XML_FILE ${DBUS_XML_FILES})
list(FIND DBUS_XML_FILES ${DBUS_XML_FILE} DBUS_XML_FILE_INDEX)
list(GET DBUS_ADAPTOR_FILES ${DBUS_XML_FILE_INDEX} DBUS_ADAPTOR_FILE)
add_custom_command(
OUTPUT ${DBUS_ADAPTOR_FILE}
COMMAND ${DBusXml2Cpp} ${DBUS_XML_FILE} --adaptor=${DBUS_ADAPTOR_FILE}
DEPENDS ${DBUS_XML_FILE}
)
endforeach()
# Jamid
add_executable(jamid
${DBUS_FILES}
${DBUS_ADAPTOR_FILES}
)
target_link_libraries(jamid ${PROJECT_NAME} PkgConfig::DBusCpp)
install (TARGETS jamid DESTINATION ${CMAKE_INSTALL_LIBEXECDIR})
endif()
if (BUILD_TESTING)
pkg_search_module(Cppunit REQUIRED IMPORTED_TARGET cppunit)
file(COPY test/unitTest/actors DESTINATION ${CMAKE_BINARY_DIR})
add_library(ut_library STATIC test/unitTest/common.cpp)
target_link_libraries(ut_library
PUBLIC
${PROJECT_NAME}
${CMAKE_THREAD_LIBS_INIT}
PkgConfig::Cppunit
PkgConfig::opendht
PkgConfig::pjproject
PkgConfig::git2
PkgConfig::archive
PkgConfig::gnutls
PkgConfig::avformat
PkgConfig::avdevice
PkgConfig::avfilter
PkgConfig::avcodec
PkgConfig::swresample
PkgConfig::swscale
PkgConfig::jsoncpp
yaml-cpp
PkgConfig::fmt
PkgConfig::secp256k1
)
target_include_directories(ut_library PUBLIC
"${CMAKE_CURRENT_SOURCE_DIR}/test;"
"${CMAKE_CURRENT_SOURCE_DIR}/test/unitTest;"
)
target_compile_options(ut_library PUBLIC
-fvisibility=hidden
-Wall -Wextra
-Wnon-virtual-dtor
-Wno-deprecated
-Wno-deprecated-declarations
-Wno-unknown-pragmas
)
target_compile_definitions(ut_library PUBLIC
JAMI_DATADIR="${JAMI_DATADIR}"
PJ_AUTOCONF=1
HAVE_RINGNS
ASIO_STANDALONE
MSGPACK_NO_BOOST
)
if (JAMI_PLUGIN)
target_compile_definitions(ut_library PUBLIC ENABLE_PLUGIN)
endif()
if (JAMI_VIDEO)
target_compile_definitions(ut_library PUBLIC ENABLE_VIDEO)
endif()
add_executable(ut_bootstrap test/unitTest/swarm/bootstrap.cpp)
target_link_libraries(ut_bootstrap ut_library)
add_test(NAME bootstrap COMMAND ut_bootstrap)
add_executable(ut_conversationRepository test/unitTest/conversationRepository/conversationRepository.cpp)
target_link_libraries(ut_conversationRepository ut_library)
add_test(NAME conversationRepository COMMAND ut_conversationRepository)
add_executable(ut_revoke test/unitTest/revoke/revoke.cpp)
target_link_libraries(ut_revoke ut_library)
add_test(NAME revoke COMMAND ut_revoke)
add_executable(ut_syncHistory test/unitTest/syncHistory/syncHistory.cpp)
target_link_libraries(ut_syncHistory ut_library)
add_test(NAME syncHistory COMMAND ut_syncHistory)
add_executable(ut_base64 test/unitTest/base64/base64.cpp)
target_link_libraries(ut_base64 ut_library)
add_test(NAME base64 COMMAND ut_base64)
add_executable(ut_ice test/unitTest/ice/ice.cpp)
target_link_libraries(ut_ice ut_library)
add_test(NAME ice COMMAND ut_ice)
add_executable(ut_ice_sdp_parser test/unitTest/ice/ice_sdp_parser.cpp)
target_link_libraries(ut_ice_sdp_parser ut_library)
add_test(NAME ice_sdp_parser COMMAND ut_ice_sdp_parser)
add_executable(ut_scheduler test/unitTest/scheduler.cpp)
target_link_libraries(ut_scheduler ut_library)
add_test(NAME scheduler COMMAND ut_scheduler)
add_executable(ut_testAccount_factory test/unitTest/account_factory/testAccount_factory.cpp)
target_link_libraries(ut_testAccount_factory ut_library)
add_test(NAME testAccount_factory COMMAND ut_testAccount_factory)
add_executable(ut_call test/unitTest/call/call.cpp)
target_link_libraries(ut_call ut_library)
add_test(NAME call COMMAND ut_call)
add_executable(ut_conference test/unitTest/call/conference.cpp)
target_link_libraries(ut_conference ut_library)
add_test(NAME conference COMMAND ut_conference)
add_executable(ut_recorder test/unitTest/call/recorder.cpp)
target_link_libraries(ut_recorder ut_library)
add_test(NAME recorder COMMAND ut_recorder)
add_executable(ut_migration test/unitTest/account_archive/migration.cpp)
target_link_libraries(ut_migration ut_library)
add_test(NAME migration COMMAND ut_migration)
add_executable(ut_accountArchive test/unitTest/account_archive/account_archive.cpp)
target_link_libraries(ut_accountArchive ut_library)
add_test(NAME accountArchive COMMAND ut_accountArchive)
add_executable(ut_mapUtils test/unitTest/map_utils/testMap_utils.cpp)
target_link_libraries(ut_mapUtils ut_library)
add_test(NAME mapUtils COMMAND ut_mapUtils)
add_executable(ut_sipBasicCalls test/unitTest/sip_account/sip_basic_calls.cpp)
target_link_libraries(ut_sipBasicCalls ut_library)
add_test(NAME sipBasicCalls COMMAND ut_sipBasicCalls)
add_executable(ut_sipSrtp test/unitTest/sip_account/sip_srtp.cpp)
target_link_libraries(ut_sipSrtp ut_library)
add_test(NAME sipSrtp COMMAND ut_sipSrtp)
add_executable(ut_fileTransfer test/unitTest/fileTransfer/fileTransfer.cpp)
target_link_libraries(ut_fileTransfer ut_library)
add_test(NAME fileTransfer COMMAND ut_fileTransfer)
add_executable(ut_fileutils test/unitTest/fileutils/testFileutils.cpp)
target_link_libraries(ut_fileutils ut_library)
add_test(NAME fileutils COMMAND ut_fileutils)
add_executable(ut_holdResume test/unitTest/media_negotiation/hold_resume.cpp)
target_link_libraries(ut_holdResume ut_library)
add_test(NAME holdResume COMMAND ut_holdResume)
add_executable(ut_autoAnswer test/unitTest/media_negotiation/auto_answer.cpp)
target_link_libraries(ut_autoAnswer ut_library)
add_test(NAME autoAnswer COMMAND ut_autoAnswer)
add_executable(ut_mediaNegotiation test/unitTest/media_negotiation/media_negotiation.cpp)
target_link_libraries(ut_mediaNegotiation ut_library)
add_test(NAME mediaNegotiation COMMAND ut_mediaNegotiation)
add_executable(ut_stringUtils test/unitTest/string_utils/testString_utils.cpp)
target_link_libraries(ut_stringUtils ut_library)
add_test(NAME stringUtils COMMAND ut_stringUtils)
add_executable(ut_utf8_utils test/unitTest/utf8_utils/testUtf8_utils.cpp)
target_link_libraries(ut_utf8_utils ut_library)
add_test(NAME utf8_utils COMMAND ut_utf8_utils)
add_executable(ut_certstore test/unitTest/certstore.cpp)
target_link_libraries(ut_certstore ut_library)
add_test(NAME certstore COMMAND ut_certstore)
add_executable(ut_presence test/unitTest/presence/presence.cpp)
target_link_libraries(ut_presence ut_library)
add_test(NAME presence COMMAND ut_presence)
add_executable(ut_typers test/unitTest/conversation/typers.cpp test/unitTest/conversation/conversationcommon.cpp)
target_link_libraries(ut_typers ut_library)
add_test(NAME typers COMMAND ut_typers)
add_executable(ut_conversationCall test/unitTest/conversation/call.cpp test/unitTest/conversation/conversationcommon.cpp)
target_link_libraries(ut_conversationCall ut_library)
add_test(NAME conversationCall COMMAND ut_conversationCall)
add_executable(ut_conversation test/unitTest/conversation/conversation.cpp test/unitTest/conversation/conversationcommon.cpp)
target_link_libraries(ut_conversation ut_library)
add_test(NAME conversation COMMAND ut_conversation)
add_executable(ut_conversationRequest test/unitTest/conversation/conversationRequest.cpp test/unitTest/conversation/conversationcommon.cpp)
target_link_libraries(ut_conversationRequest ut_library)
add_test(NAME conversationRequest COMMAND ut_conversationRequest)
add_executable(ut_conversationMembersEvent test/unitTest/conversation/conversationMembersEvent.cpp test/unitTest/conversation/conversationcommon.cpp)
target_link_libraries(ut_conversationMembersEvent ut_library)
add_test(NAME conversationMembersEvent COMMAND ut_conversationMembersEvent)
add_executable(ut_test_media_frame test/unitTest/media/test_media_frame.cpp)
target_link_libraries(ut_test_media_frame ut_library)
add_test(NAME test_media_frame COMMAND ut_test_media_frame)
add_executable(ut_test_video_scaler test/unitTest/media/video/test_video_scaler.cpp)
target_link_libraries(ut_test_video_scaler ut_library)
add_test(NAME test_video_scaler COMMAND ut_test_video_scaler)
add_executable(ut_testVideo_input test/unitTest/media/video/testVideo_input.cpp)
target_link_libraries(ut_testVideo_input ut_library)
add_test(NAME testVideo_input COMMAND ut_testVideo_input)
add_executable(ut_test_media_encoder test/unitTest/media/test_media_encoder.cpp)
target_link_libraries(ut_test_media_encoder ut_library)
add_test(NAME test_media_encoder COMMAND ut_test_media_encoder)
add_executable(ut_test_media_decoder test/unitTest/media/test_media_decoder.cpp)
target_link_libraries(ut_test_media_decoder ut_library)
add_test(NAME test_media_decoder COMMAND ut_test_media_decoder)
add_executable(ut_test_resampler test/unitTest/media/audio/test_resampler.cpp)
target_link_libraries(ut_test_resampler ut_library)
add_test(NAME test_resampler COMMAND ut_test_resampler)
add_executable(ut_test_audio_frame_resizer test/unitTest/media/audio/test_audio_frame_resizer.cpp)
target_link_libraries(ut_test_audio_frame_resizer ut_library)
add_test(NAME test_audio_frame_resizer COMMAND ut_test_audio_frame_resizer)
add_executable(ut_test_media_filter test/unitTest/media/test_media_filter.cpp)
target_link_libraries(ut_test_media_filter ut_library)
add_test(NAME test_media_filter COMMAND ut_test_media_filter)
add_executable(ut_test_media_player test/unitTest/media/test_media_player.cpp)
target_link_libraries(ut_test_media_player ut_library)
add_test(NAME test_media_player COMMAND ut_test_media_player)
if (JAMI_PLUGIN)
add_executable(ut_plugins test/unitTest/plugins/plugins.cpp)
target_link_libraries(ut_plugins ut_library)
add_test(NAME plugins COMMAND ut_plugins)
endif()
endif()
endif()