CMakeLists.txt 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. cmake_minimum_required (VERSION 3.7)
  2. project (libdatachannel
  3. DESCRIPTION "WebRTC DataChannels Library"
  4. VERSION 0.4.9
  5. LANGUAGES CXX)
  6. option(USE_GNUTLS "Use GnuTLS instead of OpenSSL" OFF)
  7. option(USE_JUICE "Use libjuice instead of libnice" OFF)
  8. if(USE_GNUTLS)
  9. option(USE_NETTLE "Use Nettle instead of OpenSSL in libjuice" ON)
  10. else()
  11. option(USE_NETTLE "Use Nettle instead of OpenSSL in libjuice" OFF)
  12. endif()
  13. set(CMAKE_POSITION_INDEPENDENT_CODE ON)
  14. set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake/Modules)
  15. if(WIN32)
  16. add_definitions(-DWIN32_LEAN_AND_MEAN)
  17. if (MSVC)
  18. add_definitions(-DNOMINMAX)
  19. endif()
  20. endif()
  21. set(LIBDATACHANNEL_SOURCES
  22. ${CMAKE_CURRENT_SOURCE_DIR}/src/candidate.cpp
  23. ${CMAKE_CURRENT_SOURCE_DIR}/src/certificate.cpp
  24. ${CMAKE_CURRENT_SOURCE_DIR}/src/channel.cpp
  25. ${CMAKE_CURRENT_SOURCE_DIR}/src/configuration.cpp
  26. ${CMAKE_CURRENT_SOURCE_DIR}/src/datachannel.cpp
  27. ${CMAKE_CURRENT_SOURCE_DIR}/src/description.cpp
  28. ${CMAKE_CURRENT_SOURCE_DIR}/src/dtlstransport.cpp
  29. ${CMAKE_CURRENT_SOURCE_DIR}/src/icetransport.cpp
  30. ${CMAKE_CURRENT_SOURCE_DIR}/src/init.cpp
  31. ${CMAKE_CURRENT_SOURCE_DIR}/src/log.cpp
  32. ${CMAKE_CURRENT_SOURCE_DIR}/src/peerconnection.cpp
  33. ${CMAKE_CURRENT_SOURCE_DIR}/src/rtc.cpp
  34. ${CMAKE_CURRENT_SOURCE_DIR}/src/sctptransport.cpp
  35. )
  36. set(LIBDATACHANNEL_HEADERS
  37. ${CMAKE_CURRENT_SOURCE_DIR}/include/rtc/candidate.hpp
  38. ${CMAKE_CURRENT_SOURCE_DIR}/include/rtc/channel.hpp
  39. ${CMAKE_CURRENT_SOURCE_DIR}/include/rtc/configuration.hpp
  40. ${CMAKE_CURRENT_SOURCE_DIR}/include/rtc/configuration.hpp
  41. ${CMAKE_CURRENT_SOURCE_DIR}/include/rtc/datachannel.hpp
  42. ${CMAKE_CURRENT_SOURCE_DIR}/include/rtc/description.hpp
  43. ${CMAKE_CURRENT_SOURCE_DIR}/include/rtc/include.hpp
  44. ${CMAKE_CURRENT_SOURCE_DIR}/include/rtc/init.hpp
  45. ${CMAKE_CURRENT_SOURCE_DIR}/include/rtc/log.hpp
  46. ${CMAKE_CURRENT_SOURCE_DIR}/include/rtc/message.hpp
  47. ${CMAKE_CURRENT_SOURCE_DIR}/include/rtc/peerconnection.hpp
  48. ${CMAKE_CURRENT_SOURCE_DIR}/include/rtc/queue.hpp
  49. ${CMAKE_CURRENT_SOURCE_DIR}/include/rtc/reliability.hpp
  50. ${CMAKE_CURRENT_SOURCE_DIR}/include/rtc/rtc.h
  51. ${CMAKE_CURRENT_SOURCE_DIR}/include/rtc/rtc.hpp
  52. )
  53. set(TESTS_SOURCES
  54. ${CMAKE_CURRENT_SOURCE_DIR}/test/main.cpp
  55. ${CMAKE_CURRENT_SOURCE_DIR}/test/connectivity.cpp
  56. ${CMAKE_CURRENT_SOURCE_DIR}/test/capi.cpp
  57. )
  58. set(TESTS_OFFERER_SOURCES
  59. ${CMAKE_CURRENT_SOURCE_DIR}/test/p2p/offerer.cpp
  60. )
  61. set(TESTS_ANSWERER_SOURCES
  62. ${CMAKE_CURRENT_SOURCE_DIR}/test/p2p/answerer.cpp
  63. )
  64. set(JSON_BuildTests OFF CACHE INTERNAL "")
  65. add_subdirectory(deps/json)
  66. set(THREADS_PREFER_PTHREAD_FLAG ON)
  67. find_package(Threads REQUIRED)
  68. add_subdirectory(deps/usrsctp EXCLUDE_FROM_ALL)
  69. if (MSYS OR MINGW)
  70. target_compile_definitions(usrsctp PUBLIC -DSCTP_STDINT_INCLUDE=<stdint.h>)
  71. target_compile_definitions(usrsctp-static PUBLIC -DSCTP_STDINT_INCLUDE=<stdint.h>)
  72. endif()
  73. if (CMAKE_CXX_COMPILER_ID MATCHES "GNU")
  74. target_compile_options(usrsctp PRIVATE -Wno-error=format-truncation)
  75. target_compile_options(usrsctp-static PRIVATE -Wno-error=format-truncation)
  76. endif()
  77. add_library(Usrsctp::Usrsctp ALIAS usrsctp)
  78. add_library(Usrsctp::UsrsctpStatic ALIAS usrsctp-static)
  79. add_library(datachannel SHARED ${LIBDATACHANNEL_SOURCES})
  80. set_target_properties(datachannel PROPERTIES
  81. VERSION ${PROJECT_VERSION}
  82. CXX_STANDARD 17)
  83. target_include_directories(datachannel PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)
  84. target_include_directories(datachannel PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include/rtc)
  85. target_include_directories(datachannel PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src)
  86. target_include_directories(datachannel PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/deps/plog/include)
  87. target_link_libraries(datachannel Threads::Threads Usrsctp::UsrsctpStatic)
  88. add_library(datachannel-static STATIC EXCLUDE_FROM_ALL ${LIBDATACHANNEL_SOURCES})
  89. set_target_properties(datachannel-static PROPERTIES
  90. VERSION ${PROJECT_VERSION}
  91. CXX_STANDARD 17)
  92. target_include_directories(datachannel-static PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)
  93. target_include_directories(datachannel-static PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include/rtc)
  94. target_include_directories(datachannel-static PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src)
  95. target_include_directories(datachannel-static PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/deps/plog/include)
  96. target_link_libraries(datachannel-static Threads::Threads Usrsctp::UsrsctpStatic)
  97. if(WIN32)
  98. target_link_libraries(datachannel "wsock32" "ws2_32") # winsock2
  99. target_link_libraries(datachannel-static "wsock32" "ws2_32") # winsock2
  100. endif()
  101. if (USE_GNUTLS)
  102. find_package(GnuTLS REQUIRED)
  103. if(NOT TARGET GnuTLS::GnuTLS)
  104. add_library(GnuTLS::GnuTLS UNKNOWN IMPORTED)
  105. set_target_properties(GnuTLS::GnuTLS PROPERTIES
  106. INTERFACE_INCLUDE_DIRECTORIES "${GNUTLS_INCLUDE_DIRS}"
  107. INTERFACE_COMPILE_DEFINITIONS "${GNUTLS_DEFINITIONS}"
  108. IMPORTED_LINK_INTERFACE_LANGUAGES "C"
  109. IMPORTED_LOCATION "${GNUTLS_LIBRARIES}")
  110. endif()
  111. target_compile_definitions(datachannel PRIVATE USE_GNUTLS=1)
  112. target_link_libraries(datachannel GnuTLS::GnuTLS)
  113. target_compile_definitions(datachannel-static PRIVATE USE_GNUTLS=1)
  114. target_link_libraries(datachannel-static GnuTLS::GnuTLS)
  115. else()
  116. find_package(OpenSSL REQUIRED)
  117. target_compile_definitions(datachannel PRIVATE USE_GNUTLS=0)
  118. target_link_libraries(datachannel OpenSSL::SSL)
  119. target_compile_definitions(datachannel-static PRIVATE USE_GNUTLS=0)
  120. target_link_libraries(datachannel-static OpenSSL::SSL)
  121. endif()
  122. if (USE_JUICE)
  123. add_subdirectory(deps/libjuice EXCLUDE_FROM_ALL)
  124. target_compile_definitions(datachannel PRIVATE USE_JUICE=1)
  125. target_link_libraries(datachannel LibJuice::LibJuiceStatic)
  126. target_compile_definitions(datachannel-static PRIVATE USE_JUICE=1)
  127. target_link_libraries(datachannel-static LibJuice::LibJuiceStatic)
  128. else()
  129. find_package(LibNice REQUIRED)
  130. target_compile_definitions(datachannel PRIVATE USE_JUICE=0)
  131. target_link_libraries(datachannel LibNice::LibNice)
  132. target_compile_definitions(datachannel-static PRIVATE USE_JUICE=0)
  133. target_link_libraries(datachannel-static LibNice::LibNice)
  134. endif()
  135. add_library(LibDataChannel::LibDataChannel ALIAS datachannel)
  136. add_library(LibDataChannel::LibDataChannelStatic ALIAS datachannel-static)
  137. install(TARGETS datachannel LIBRARY DESTINATION lib)
  138. install(FILES ${LIBDATACHANNEL_HEADERS} DESTINATION include/rtc)
  139. # Main Test
  140. add_executable(datachannel-tests ${TESTS_SOURCES})
  141. set_target_properties(datachannel-tests PROPERTIES
  142. VERSION ${PROJECT_VERSION}
  143. CXX_STANDARD 17)
  144. set_target_properties(datachannel-tests PROPERTIES OUTPUT_NAME tests)
  145. target_include_directories(datachannel-tests PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src)
  146. target_link_libraries(datachannel-tests datachannel nlohmann_json::nlohmann_json)
  147. # P2P Test: offerer
  148. add_executable(datachannel-offerer ${TESTS_OFFERER_SOURCES})
  149. set_target_properties(datachannel-offerer PROPERTIES
  150. VERSION ${PROJECT_VERSION}
  151. CXX_STANDARD 17)
  152. set_target_properties(datachannel-offerer PROPERTIES OUTPUT_NAME offerer)
  153. target_link_libraries(datachannel-offerer datachannel)
  154. target_include_directories(datachannel-offerer PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/deps/httplib)
  155. target_include_directories(datachannel-offerer PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/deps/json/include)
  156. # P2P Test: answerer
  157. add_executable(datachannel-answerer ${TESTS_ANSWERER_SOURCES})
  158. set_target_properties(datachannel-answerer PROPERTIES
  159. VERSION ${PROJECT_VERSION}
  160. CXX_STANDARD 17)
  161. set_target_properties(datachannel-answerer PROPERTIES OUTPUT_NAME answerer)
  162. target_link_libraries(datachannel-answerer datachannel)