toxcore/CMakeLists.txt
iphydf 13ae9e9a93
Move logging to a callback.
This removes the global logger (which by the way was deleted when the first tox
was killed, so other toxes would then stop logging). Various bits of the code
now carry a logger or pass it around. It's a bit less transparent now, but now
there is no need to have a global logger, and clients can decide what to log and
where.
2016-08-27 01:16:14 +01:00

372 lines
9.9 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")
################################################################################
#
# :: Dependencies and configuration
#
################################################################################
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)
endif()
option(ASSOC_DHT "Enable module to store currently unused ID <=> IP associations" OFF)
if(ASSOC_DHT)
add_definitions(-DENABLE_ASSOC_DHT=1)
endif()
find_package(PkgConfig REQUIRED)
find_package(Threads REQUIRED)
find_library(UTIL_LIBRARIES util)
find_library(RT_LIBRARIES rt)
pkg_search_module(CHECK check)
pkg_search_module(LIBCONFIG libconfig)
pkg_search_module(LIBSODIUM REQUIRED libsodium)
pkg_search_module(OPUS REQUIRED opus)
pkg_search_module(VPX REQUIRED vpx)
if(CHECK_FOUND)
link_directories(${CHECK_LIBRARY_DIRS})
endif()
if(LIBCONFIG_FOUND)
link_directories(${LIBCONFIG_LIBRARY_DIRS})
endif()
link_directories(${LIBSODIUM_LIBRARY_DIRS})
link_directories(${OPUS_LIBRARY_DIRS})
link_directories(${VPX_LIBRARY_DIRS})
if(CHECK_FOUND)
include_directories(${CHECK_INCLUDE_DIRS})
endif()
if(LIBCONFIG_FOUND)
include_directories(${LIBCONFIG_INCLUDE_DIRS})
endif()
include_directories(${LIBSODIUM_INCLUDE_DIRS})
include_directories(${OPUS_INCLUDE_DIRS})
include_directories(${VPX_INCLUDE_DIRS})
if(CHECK_FOUND)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CHECK_CFLAGS_OTHER}")
endif()
if(LIBCONFIG_FOUND)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${LIBCONFIG_CFLAGS_OTHER}")
endif()
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${LIBSODIUM_CFLAGS_OTHER}")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OPUS_CFLAGS_OTHER}")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${VPX_CFLAGS_OTHER}")
# Users can call cmake -DLIBTYPE=STATIC or -DLIBTYPE=SHARED to override this.
if(NOT LIBTYPE)
if(WIN32)
# Our win32 builds are fully static, since we use the MXE cross compiling
# environment, which builds everything statically by default. Building
# shared libraries will result in multiple definition errors, since multiple
# tox libraries will link against libsodium and other libraries that are
# built statically in MXE.
set(LIBTYPE STATIC)
else()
set(LIBTYPE SHARED)
endif()
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_library(toxcrypto ${LIBTYPE}
toxcore/crypto_core.c)
target_link_libraries(toxcrypto ${LIBSODIUM_LIBRARIES})
# LAYER 2: Basic networking
# -------------------------
add_library(toxnetwork ${LIBTYPE}
toxcore/logger.c
toxcore/network.c
toxcore/util.c)
target_link_libraries(toxnetwork toxcrypto)
if(CMAKE_THREAD_LIBS_INIT)
target_link_libraries(toxnetwork ${CMAKE_THREAD_LIBS_INIT})
set(toxcore_PKGCONFIG_LIBS ${toxcore_PKGCONFIG_LIBS} "-l${CMAKE_THREAD_LIBS_INIT}")
endif()
if(RT_LIBRARIES)
target_link_libraries(toxnetwork ${RT_LIBRARIES})
set(toxcore_PKGCONFIG_LIBS ${toxcore_PKGCONFIG_LIBS} "-lrt")
endif()
if(WIN32)
target_link_libraries(toxnetwork ws2_32 iphlpapi)
set(toxcore_PKGCONFIG_LIBS ${toxcore_PKGCONFIG_LIBS} "-lws2_32 -liphlpapi")
endif()
# LAYER 3: Distributed Hash Table
# -------------------------------
add_library(toxdht ${LIBTYPE}
toxcore/DHT.c
toxcore/LAN_discovery.c
toxcore/assoc.c
toxcore/ping.c
toxcore/ping_array.c)
target_link_libraries(toxdht toxnetwork)
# LAYER 4: Onion routing, TCP connections, crypto connections
# -----------------------------------------------------------
add_library(toxnetcrypto ${LIBTYPE}
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_libraries(toxnetcrypto toxdht)
# LAYER 5: Friend requests and connections
# ----------------------------------------
add_library(toxfriends ${LIBTYPE}
toxcore/friend_connection.c
toxcore/friend_requests.c)
target_link_libraries(toxfriends toxnetcrypto)
# LAYER 6: Tox messenger
# ----------------------
add_library(toxmessenger ${LIBTYPE}
toxcore/Messenger.c)
target_link_libraries(toxmessenger toxfriends)
# LAYER 7: Group chats
# --------------------
add_library(toxgroup ${LIBTYPE}
toxcore/group.c)
target_link_libraries(toxgroup toxmessenger)
# LAYER 8: Public API
# -------------------
add_library(toxcore ${LIBTYPE}
toxcore/tox.c)
target_link_libraries(toxcore toxgroup)
################################################################################
#
# :: Audio/Video Library
#
################################################################################
add_library(toxav ${LIBTYPE}
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_libraries(toxav toxcore ${OPUS_LIBRARIES} ${VPX_LIBRARIES})
################################################################################
#
# :: ToxDNS and block encryption libraries
#
################################################################################
add_library(toxdns ${LIBTYPE}
toxdns/toxdns.c)
target_link_libraries(toxdns toxcore)
add_library(toxencryptsave ${LIBTYPE}
toxencryptsave/toxencryptsave.c)
target_link_libraries(toxencryptsave toxcore)
################################################################################
#
# :: Automated regression tests
#
################################################################################
add_test(format_test
${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_libraries(auto_${target}
toxcore
toxav
toxencryptsave
${CHECK_LIBRARIES})
add_test(${target} auto_${target})
endif()
endfunction()
auto_test(TCP_test)
auto_test(assoc_test)
auto_test(crypto_test)
auto_test(dht_test)
auto_test(encryptsave_test)
# This test doesn't link (missing symbol).
#auto_test(friends_test)
auto_test(messenger_test)
auto_test(network_test)
auto_test(onion_test)
auto_test(skeleton_test)
auto_test(tox_test)
auto_test(toxav_basic_test)
auto_test(toxav_many_test)
################################################################################
#
# :: Bootstrap daemon
#
################################################################################
add_executable(DHT_bootstrap
other/DHT_bootstrap.c
other/bootstrap_node_packets.c)
target_link_libraries(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_libraries(tox-bootstrapd toxnetcrypto ${LIBCONFIG_LIBRARIES})
endif()
################################################################################
#
# :: Test programs
#
################################################################################
if(NOT WIN32)
add_executable(nTox testing/nTox.c)
target_link_libraries(nTox toxcore ncurses)
endif()
add_executable(DHT_test testing/DHT_test.c)
target_link_libraries(DHT_test toxdht)
add_executable(Messenger_test testing/Messenger_test.c)
target_link_libraries(Messenger_test toxmessenger)
add_executable(dns3_test testing/dns3_test.c)
target_link_libraries(dns3_test toxdns)
if(NOT WIN32)
add_executable(tox_sync testing/tox_sync.c)
target_link_libraries(tox_sync toxcore)
endif()
if(UTIL_LIBRARIES)
add_executable(tox_shell testing/tox_shell.c)
target_link_libraries(tox_shell toxcore ${UTIL_LIBRARIES})
endif()
if(NOT WIN32)
add_executable(irc_syncbot testing/irc_syncbot.c)
target_link_libraries(irc_syncbot toxcore)
endif()
################################################################################
#
# :: Installation and pkg-config
#
################################################################################
configure_file(
"${CMAKE_SOURCE_DIR}/other/pkgconfig/toxav.pc.in"
"${CMAKE_BINARY_DIR}/toxav.pc"
@ONLY
)
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}/toxav.pc
${CMAKE_BINARY_DIR}/toxcore.pc
${CMAKE_BINARY_DIR}/toxdns.pc
${CMAKE_BINARY_DIR}/toxencryptsave.pc
DESTINATION "lib/pkgconfig")
install(TARGETS
toxav
toxcore
toxcrypto
toxdht
toxdns
toxencryptsave
toxfriends
toxgroup
toxmessenger
toxnetcrypto
toxnetwork
DESTINATION "lib")
install(FILES
toxav/toxav.h
toxcore/tox.h
toxcore/tox_old.h
toxdns/toxdns.h
toxencryptsave/toxencryptsave.h
DESTINATION "include/tox")