CMakeLists.txt 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. cmake_minimum_required (VERSION 3.7)
  2. project (libdatachannel
  3. DESCRIPTION "WebRTC Data Channels Library"
  4. VERSION 0.2.1
  5. LANGUAGES CXX)
  6. set(CMAKE_POSITION_INDEPENDENT_CODE ON)
  7. set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake/Modules)
  8. set(LIBDATACHANNEL_SOURCES
  9. ${CMAKE_CURRENT_SOURCE_DIR}/src/candidate.cpp
  10. ${CMAKE_CURRENT_SOURCE_DIR}/src/certificate.cpp
  11. ${CMAKE_CURRENT_SOURCE_DIR}/src/channel.cpp
  12. ${CMAKE_CURRENT_SOURCE_DIR}/src/configuration.cpp
  13. ${CMAKE_CURRENT_SOURCE_DIR}/src/datachannel.cpp
  14. ${CMAKE_CURRENT_SOURCE_DIR}/src/description.cpp
  15. ${CMAKE_CURRENT_SOURCE_DIR}/src/dtlstransport.cpp
  16. ${CMAKE_CURRENT_SOURCE_DIR}/src/icetransport.cpp
  17. ${CMAKE_CURRENT_SOURCE_DIR}/src/peerconnection.cpp
  18. ${CMAKE_CURRENT_SOURCE_DIR}/src/rtc.cpp
  19. ${CMAKE_CURRENT_SOURCE_DIR}/src/sctptransport.cpp
  20. )
  21. set(TESTS_SOURCES
  22. ${CMAKE_CURRENT_SOURCE_DIR}/test/main.cpp
  23. )
  24. # Hack because usrsctp uses CMAKE_SOURCE_DIR instead of CMAKE_CURRENT_SOURCE_DIR
  25. set(CMAKE_REQUIRED_FLAGS "-I${CMAKE_CURRENT_SOURCE_DIR}/usrsctp/usrsctplib")
  26. add_subdirectory(usrsctp EXCLUDE_FROM_ALL)
  27. # Set include directory and custom options to make usrsctp compile with recent g++
  28. target_include_directories(usrsctp-static PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/usrsctp/usrsctplib)
  29. if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  30. # using regular Clang or AppleClang: Needed since they don't have -Wno-error=format-truncation
  31. target_compile_options(usrsctp-static PRIVATE -Wno-error=address-of-packed-member)
  32. else()
  33. if (CMAKE_CXX_COMPILER_ID MATCHES "GNU")
  34. if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS "9.0")
  35. # GCC version below 9.0 does not support option address-of-packed-member
  36. target_compile_options(usrsctp-static PRIVATE -Wno-error=format-truncation)
  37. else()
  38. target_compile_options(usrsctp-static PRIVATE -Wno-error=address-of-packed-member -Wno-error=format-truncation)
  39. endif()
  40. else()
  41. # all other compilers
  42. target_compile_options(usrsctp-static PRIVATE -Wno-error=address-of-packed-member -Wno-error=format-truncation)
  43. endif()
  44. endif()
  45. option(USE_GNUTLS "Use GnuTLS instead of OpenSSL" OFF)
  46. find_package(LibNice REQUIRED)
  47. add_library(datachannel SHARED ${LIBDATACHANNEL_SOURCES})
  48. set_target_properties(datachannel PROPERTIES
  49. VERSION ${PROJECT_VERSION}
  50. CXX_STANDARD 17)
  51. target_include_directories(datachannel PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)
  52. target_include_directories(datachannel PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include/rtc)
  53. target_include_directories(datachannel PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src)
  54. target_link_libraries(datachannel usrsctp-static LibNice::LibNice)
  55. add_library(datachannel-static STATIC EXCLUDE_FROM_ALL ${LIBDATACHANNEL_SOURCES})
  56. set_target_properties(datachannel-static PROPERTIES
  57. VERSION ${PROJECT_VERSION}
  58. CXX_STANDARD 17)
  59. target_include_directories(datachannel-static PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)
  60. target_include_directories(datachannel-static PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include/rtc)
  61. target_include_directories(datachannel-static PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src)
  62. target_link_libraries(datachannel-static usrsctp-static LibNice::LibNice)
  63. if (USE_GNUTLS)
  64. find_package(GnuTLS REQUIRED)
  65. if(NOT TARGET GnuTLS::GnuTLS)
  66. add_library(GnuTLS::GnuTLS UNKNOWN IMPORTED)
  67. set_target_properties(GnuTLS::GnuTLS PROPERTIES
  68. INTERFACE_INCLUDE_DIRECTORIES "${GNUTLS_INCLUDE_DIRS}"
  69. INTERFACE_COMPILE_DEFINITIONS "${GNUTLS_DEFINITIONS}"
  70. IMPORTED_LINK_INTERFACE_LANGUAGES "C"
  71. IMPORTED_LOCATION "${GNUTLS_LIBRARIES}")
  72. endif()
  73. target_compile_definitions(datachannel PRIVATE USE_GNUTLS=1)
  74. target_link_libraries(datachannel GnuTLS::GnuTLS)
  75. target_compile_definitions(datachannel-static PRIVATE USE_GNUTLS=1)
  76. target_link_libraries(datachannel-static GnuTLS::GnuTLS)
  77. else()
  78. find_package(OpenSSL REQUIRED)
  79. target_compile_definitions(datachannel PRIVATE USE_GNUTLS=0)
  80. target_link_libraries(datachannel OpenSSL::SSL)
  81. target_compile_definitions(datachannel-static PRIVATE USE_GNUTLS=0)
  82. target_link_libraries(datachannel-static OpenSSL::SSL)
  83. endif()
  84. add_library(LibDataChannel::LibDataChannel ALIAS datachannel)
  85. add_library(LibDataChannel::LibDataChannelStatic ALIAS datachannel-static)
  86. add_executable(tests ${TESTS_SOURCES})
  87. set_target_properties(tests PROPERTIES
  88. VERSION ${PROJECT_VERSION}
  89. CXX_STANDARD 17)
  90. target_link_libraries(tests datachannel)