toxcore/CMakeLists.txt
iphydf 67ac9138ab
Add STRICT_ABI cmake flag to generate export lists.
Enabling this flag will generate and use an LD version script. It
ensures that the dynamic libraries (libtoxcore.so, libtoxav.so) only
export the symbols that are defined in their public API (tox.h and
toxav.h, respectively).
2016-09-19 19:42:12 +01:00

411 lines
11 KiB
CMake

cmake_minimum_required(VERSION 2.8.6)
project(toxcore)
include(CTest)
# This version is for the entire project. All libraries (core, av, ...) move in
# versions in a synchronised way.
set(PROJECT_VERSION "0.0.0")
set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
################################################################################
#
# :: Dependencies and configuration
#
################################################################################
include(CheckCCompilerFlag)
include(ModulePackage)
set(CMAKE_MACOSX_RPATH ON)
option(DEBUG "Enable assertions and other debugging facilities" OFF)
if(DEBUG)
add_definitions(-DTOX_DEBUG=1)
add_definitions(-DMIN_LOGGER_LEVEL=LOG_TRACE)
check_c_compiler_flag("-g3" HAVE_G3)
if(HAVE_G3)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g3")
endif()
endif()
option(ASSOC_DHT "Enable module to store currently unused ID <=> IP associations" OFF)
if(ASSOC_DHT)
add_definitions(-DENABLE_ASSOC_DHT=1)
endif()
option(ASAN "Enable address-sanitizer to detect invalid memory accesses" OFF)
if(ASAN)
set(SAFE_CMAKE_REQUIRED_LIBRARIES "${CMAKE_REQUIRED_LIBRARIES}")
set(CMAKE_REQUIRED_LIBRARIES "-fsanitize=address")
check_c_compiler_flag("-fsanitize=address" HAVE_ASAN)
if(HAVE_ASAN)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address")
endif()
set(CMAKE_REQUIRED_LIBRARIES "${SAFE_CMAKE_REQUIRED_LIBRARIES}")
endif()
find_package(Threads REQUIRED)
find_library(NCURSES_LIBRARIES ncurses )
find_library(UTIL_LIBRARIES util )
find_library(RT_LIBRARIES rt )
# For toxcore.
pkg_use_module(LIBSODIUM REQUIRED libsodium )
# For toxav.
pkg_use_module(OPUS opus )
pkg_use_module(VPX vpx )
# For tox-bootstrapd.
pkg_use_module(LIBCONFIG libconfig )
# For auto tests.
pkg_use_module(CHECK check )
# For av_test.
pkg_use_module(OPENCV opencv )
pkg_use_module(PORTAUDIO portaudio-2.0 )
pkg_use_module(SNDFILE sndfile )
if(OPUS_FOUND AND VPX_FOUND)
set(BUILD_TOXAV TRUE)
else()
set(BUILD_TOXAV FALSE)
endif()
################################################################################
#
# :: Tox Core Library
#
################################################################################
# toxcore_PKGCONFIG_LIBS is what's added to the Libs: line in toxcore.pc. It
# needs to contain all the libraries a program using toxcore should link against
# if it's statically linked. If it's dynamically linked, there is no need to
# explicitly link against all the dependencies, but it doesn't harm much(*)
# either.
#
# (*) It allows client code to use symbols from our dependencies without
# explicitly linking against them.
set(toxcore_PKGCONFIG_LIBS)
# LAYER 1: Crypto core
# --------------------
add_module(toxcrypto
toxcore/crypto_core.c)
target_link_modules(toxcrypto ${LIBSODIUM_LIBRARIES})
if(WIN32)
target_link_modules(toxcrypto ws2_32) # for htonl
endif()
# LAYER 2: Basic networking
# -------------------------
add_module(toxnetwork
toxcore/logger.c
toxcore/network.c
toxcore/util.c)
target_link_modules(toxnetwork toxcrypto)
if(CMAKE_THREAD_LIBS_INIT)
target_link_modules(toxnetwork ${CMAKE_THREAD_LIBS_INIT})
set(toxcore_PKGCONFIG_LIBS ${toxcore_PKGCONFIG_LIBS} "-l${CMAKE_THREAD_LIBS_INIT}")
endif()
if(RT_LIBRARIES)
target_link_modules(toxnetwork ${RT_LIBRARIES})
set(toxcore_PKGCONFIG_LIBS ${toxcore_PKGCONFIG_LIBS} "-lrt")
endif()
if(WIN32)
target_link_modules(toxnetwork ws2_32 iphlpapi)
set(toxcore_PKGCONFIG_LIBS ${toxcore_PKGCONFIG_LIBS} "-lws2_32 -liphlpapi")
endif()
# LAYER 3: Distributed Hash Table
# -------------------------------
add_module(toxdht
toxcore/DHT.c
toxcore/LAN_discovery.c
toxcore/assoc.c
toxcore/ping.c
toxcore/ping_array.c)
target_link_modules(toxdht toxnetwork)
# LAYER 4: Onion routing, TCP connections, crypto connections
# -----------------------------------------------------------
add_module(toxnetcrypto
toxcore/TCP_client.c
toxcore/TCP_connection.c
toxcore/TCP_server.c
toxcore/list.c
toxcore/net_crypto.c
toxcore/onion.c
toxcore/onion_announce.c
toxcore/onion_client.c)
target_link_modules(toxnetcrypto toxdht)
# LAYER 5: Friend requests and connections
# ----------------------------------------
add_module(toxfriends
toxcore/friend_connection.c
toxcore/friend_requests.c)
target_link_modules(toxfriends toxnetcrypto)
# LAYER 6: Tox messenger
# ----------------------
add_module(toxmessenger
toxcore/Messenger.c)
target_link_modules(toxmessenger toxfriends)
# LAYER 7: Group chats
# --------------------
add_module(toxgroup
toxcore/group.c)
target_link_modules(toxgroup toxmessenger)
# LAYER 8: Public API
# -------------------
add_module(toxcore
toxcore/tox.c)
target_link_modules(toxcore toxgroup)
################################################################################
#
# :: Audio/Video Library
#
################################################################################
if(BUILD_TOXAV)
add_module(toxav
toxav/audio.c
toxav/bwcontroller.c
toxav/group.c
toxav/msi.c
toxav/rtp.c
toxav/toxav.c
toxav/toxav_old.c
toxav/video.c)
target_link_modules(toxav toxcore ${OPUS_LIBRARIES} ${VPX_LIBRARIES})
endif()
################################################################################
#
# :: ToxDNS and block encryption libraries
#
################################################################################
add_module(toxdns
toxdns/toxdns.c)
target_link_modules(toxdns toxcore)
add_module(toxencryptsave
toxencryptsave/toxencryptsave.c)
target_link_modules(toxencryptsave toxcore)
################################################################################
#
# :: Automated regression tests
#
################################################################################
add_test(
NAME format_test
COMMAND ${CMAKE_SOURCE_DIR}/other/astyle/format-source "${CMAKE_SOURCE_DIR}")
function(auto_test target)
if(CHECK_FOUND)
add_executable(auto_${target} auto_tests/${target}.c)
target_link_modules(auto_${target}
toxcore
toxencryptsave
${CHECK_LIBRARIES})
if(BUILD_TOXAV)
target_link_modules(auto_${target} toxav)
endif()
add_test(NAME ${target} COMMAND auto_${target})
endif()
endfunction()
auto_test(TCP_test)
auto_test(assoc_test)
auto_test(crypto_test)
auto_test(dht_test)
auto_test(encryptsave_test)
auto_test(messenger_test)
auto_test(network_test)
auto_test(onion_test)
auto_test(skeleton_test)
auto_test(tox_test)
if(BUILD_TOXAV)
auto_test(toxav_basic_test)
auto_test(toxav_many_test)
endif()
################################################################################
#
# :: Bootstrap daemon
#
################################################################################
add_executable(DHT_bootstrap
other/DHT_bootstrap.c
other/bootstrap_node_packets.c)
target_link_modules(DHT_bootstrap toxnetcrypto)
if(LIBCONFIG_FOUND)
add_executable(tox-bootstrapd
other/bootstrap_daemon/src/command_line_arguments.c
other/bootstrap_daemon/src/command_line_arguments.h
other/bootstrap_daemon/src/config.c
other/bootstrap_daemon/src/config_defaults.h
other/bootstrap_daemon/src/config.h
other/bootstrap_daemon/src/log.c
other/bootstrap_daemon/src/log.h
other/bootstrap_daemon/src/tox-bootstrapd.c
other/bootstrap_daemon/src/global.h
other/bootstrap_node_packets.c
other/bootstrap_node_packets.h)
target_link_modules(tox-bootstrapd toxnetcrypto ${LIBCONFIG_LIBRARIES})
endif()
################################################################################
#
# :: Test programs
#
################################################################################
if(NOT WIN32 AND BUILD_TOXAV AND SNDFILE_FOUND AND PORTAUDIO_FOUND AND OPENCV_FOUND)
add_executable(av_test testing/av_test.c)
target_link_modules(av_test
toxav
${OPENCV_LIBRARIES}
${PORTAUDIO_LIBRARIES}
${SNDFILE_LIBRARIES})
endif()
if(NOT WIN32)
add_executable(nTox testing/nTox.c)
target_link_modules(nTox toxcore ${NCURSES_LIBRARIES})
endif()
add_executable(DHT_test testing/DHT_test.c)
target_link_modules(DHT_test toxdht)
add_executable(Messenger_test testing/Messenger_test.c)
target_link_modules(Messenger_test toxmessenger)
add_executable(dns3_test testing/dns3_test.c)
target_link_modules(dns3_test toxdns)
if(NOT WIN32)
add_executable(tox_sync testing/tox_sync.c)
target_link_modules(tox_sync toxcore)
endif()
if(UTIL_LIBRARIES)
add_executable(tox_shell testing/tox_shell.c)
target_link_modules(tox_shell toxcore ${UTIL_LIBRARIES})
endif()
if(NOT WIN32)
add_executable(irc_syncbot testing/irc_syncbot.c)
target_link_modules(irc_syncbot toxcore)
endif()
################################################################################
#
# :: Installation and pkg-config
#
################################################################################
if(BUILD_TOXAV)
configure_file(
"${CMAKE_SOURCE_DIR}/other/pkgconfig/toxav.pc.in"
"${CMAKE_BINARY_DIR}/toxav.pc"
@ONLY
)
endif()
configure_file(
"${CMAKE_SOURCE_DIR}/other/pkgconfig/toxcore.pc.in"
"${CMAKE_BINARY_DIR}/toxcore.pc"
@ONLY
)
configure_file(
"${CMAKE_SOURCE_DIR}/other/pkgconfig/toxdns.pc.in"
"${CMAKE_BINARY_DIR}/toxdns.pc"
@ONLY
)
configure_file(
"${CMAKE_SOURCE_DIR}/other/pkgconfig/toxencryptsave.pc.in"
"${CMAKE_BINARY_DIR}/toxencryptsave.pc"
@ONLY
)
install(FILES
${CMAKE_BINARY_DIR}/toxcore.pc
${CMAKE_BINARY_DIR}/toxdns.pc
${CMAKE_BINARY_DIR}/toxencryptsave.pc
DESTINATION "lib/pkgconfig")
install(FILES
toxcore/tox.h
toxdns/toxdns.h
toxencryptsave/toxencryptsave.h
DESTINATION "include/tox")
if(BUILD_TOXAV)
install(FILES
${CMAKE_BINARY_DIR}/toxav.pc
DESTINATION "lib/pkgconfig")
install(FILES
toxav/toxav.h
DESTINATION "include/tox")
endif()
################################################################################
#
# :: Strict ABI
#
################################################################################
function(make_version_script header ns lib)
execute_process(
COMMAND sh -c "egrep '^\\w' ${header} | grep '${ns}_[a-z_]*(' | grep -v '^typedef' | grep -o '${ns}_[a-z_]*(' | egrep -o '\\w+' | sort -u"
OUTPUT_VARIABLE ${lib}_SYMS
OUTPUT_STRIP_TRAILING_WHITESPACE)
string(REPLACE "\n" ";" ${lib}_SYMS ${${lib}_SYMS})
set(${lib}_VERSION_SCRIPT "${CMAKE_BINARY_DIR}/${lib}.ld")
file(WRITE ${${lib}_VERSION_SCRIPT}
"{ global:\n")
foreach(sym ${${lib}_SYMS})
file(APPEND ${${lib}_VERSION_SCRIPT}
"${sym};\n")
endforeach(sym)
file(APPEND ${${lib}_VERSION_SCRIPT}
"local: *; };\n")
set_target_properties(${lib}_shared PROPERTIES
LINK_FLAGS -Wl,--version-script,${${lib}_VERSION_SCRIPT})
endfunction()
option(STRICT_ABI "Enforce strict ABI export in dynamic libraries" OFF)
if(STRICT_ABI)
if(BUILD_TOXAV)
make_version_script(${CMAKE_SOURCE_DIR}/toxav/toxav.h toxav toxav)
endif()
make_version_script(${CMAKE_SOURCE_DIR}/toxcore/tox.h tox toxcore)
endif()