toxcore/CMakeLists.txt
iphydf b044cfbf15
Fix windows build.
The threading networking functions (on windows: winsock and friends) need to be
linked into the toxnetwork library, not the toxcore library, anymore. On Linux
and OSX, there is no winsock. On OSX, there is no need to link against threading
libraries, and on Linux, toxnetwork can have unresolved symbols when linking, so
this failure wasn't caught before.

Tested by building on the iphydf/windows-x86-qt5 docker image.
2016-08-21 14:21:57 +01:00

376 lines
10 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(LOGGING "Enable internal library logging" OFF)
if(LOGGING)
add_definitions(
-DTOX_LOGGER=1
-DLOGGER_LEVEL=LOG_DEBUG
-DLOGGER_OUTPUT_FILE="libtoxcore.log")
endif()
option(DEBUG "Enable assertions and other debugging facilities" OFF)
if(DEBUG)
add_definitions(-DTOX_DEBUG=1)
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
#
################################################################################
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")