xmake.lua 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. package("libdatachannel")
  2. set_homepage("https://libdatachannel.org/")
  3. set_description("C/C++ WebRTC network library featuring Data Channels, Media Transport, and WebSockets")
  4. set_license("MPL-2.0")
  5. add_urls("https://github.com/paullouisageneau/libdatachannel/archive/refs/tags/$(version).tar.gz",
  6. "https://github.com/paullouisageneau/libdatachannel.git", {submodules = false})
  7. add_versions("v0.23.2", "b9606efc5b2b173f2d22d0be3f6ba4f12af78c00ca02cde5932f3ff902980eb9")
  8. add_versions("v0.23.1", "63e14d619ac4d9cc310a0c7620b80e6da88abf878f27ccc78cd099f95d47b121")
  9. add_configs("gnutls", {description = "Use GnuTLS instead of OpenSSL", default = false, type = "boolean", readonly = true})
  10. add_configs("mbedtls", {description = "Use Mbed TLS instead of OpenSSL", default = false, type = "boolean"})
  11. add_configs("nice", {description = "Use libnice instead of libjuice", default = false, type = "boolean", readonly = true})
  12. add_configs("websocket", {description = "Enable WebSocket support", default = false, type = "boolean"})
  13. add_configs("media", {description = "Enable media transport support", default = false, type = "boolean"})
  14. add_configs("capi_stdcall", {description = "Set calling convention of C API callbacks stdcall", default = false, type = "boolean"})
  15. add_configs("sctp_debug", {description = "Enable SCTP debugging output to verbose log", default = false, type = "boolean"})
  16. add_configs("rtc_update_version_header", {description = "Enable updating the version header", default = false, type = "boolean"})
  17. if is_plat("windows", "mingw") then
  18. add_syslinks("ws2_32")
  19. elseif is_plat("linux", "bsd") then
  20. add_syslinks("pthread")
  21. end
  22. add_deps("cmake")
  23. add_deps("plog", "usrsctp")
  24. add_deps("nlohmann_json", {configs = {cmake = true}})
  25. on_check("wasm", function (target)
  26. raise("package(libdatachannel) dep(usrsctp) unsupported wasm platform")
  27. end)
  28. on_check("android", function (package)
  29. local ndk = package:toolchain("ndk")
  30. local ndk_sdkver = ndk:config("ndk_sdkver")
  31. assert(ndk_sdkver and tonumber(ndk_sdkver) > 23, "package(libdatachannel) dep(usrsctp) need ndk api level > 23")
  32. end)
  33. on_load(function (package)
  34. if package:config("mbedtls") then
  35. raise("Unsupported now, build failed with `src/impl/dtlstransport.cpp:373:7: error: 'mbedtls_ssl_srtp_profile' does not name a type; did you mean 'mbedtls_x509_crt_profile'?`")
  36. package:add("deps", "mbedtls")
  37. elseif package:config("gnutls") then
  38. package:add("deps", "gnutls")
  39. else
  40. package:add("deps", "openssl3")
  41. end
  42. if package:config("nice") then
  43. package:add("deps", "libnice")
  44. else
  45. package:add("deps", "libjuice")
  46. end
  47. if package:config("media") then
  48. package:add("deps", "srtp")
  49. else
  50. package:add("defines", "RTC_ENABLE_MEDIA=0")
  51. end
  52. if package:config("capi_stdcall") then
  53. package:add("defines", "CAPI_STDCALL")
  54. end
  55. package:add("defines", "RTC_ENABLE_WEBSOCKET=" .. (package:config("websocket") and "1" or "0"))
  56. if not package:config("shared") then
  57. package:add("defines", "RTC_STATIC")
  58. end
  59. end)
  60. on_install("!mingw", function (package)
  61. io.replace("CMakeLists.txt", "set(CMAKE_POSITION_INDEPENDENT_CODE ON)", "", {plain = true})
  62. -- add -DJUICE_STATIC from config mode
  63. io.replace("CMakeLists.txt", "find_package(LibJuice REQUIRED)", "find_package(LibJuice CONFIG REQUIRED)", {plain = true})
  64. -- Error evaluating generator expression: $<TARGET_PDB_FILE:datachannel>
  65. -- TARGET_PDB_FILE is allowed only for targets with linker created artifacts.
  66. if package:is_plat("windows") then
  67. io.replace("CMakeLists.txt", "if(MSVC)\n\tinstall", "if(0)\ninstall", {plain = true})
  68. end
  69. local configs = {
  70. "-DNO_EXAMPLES=ON",
  71. "-DNO_TESTS=ON",
  72. "-DWARNINGS_AS_ERRORS=OFF",
  73. "-DPREFER_SYSTEM_LIB=ON",
  74. }
  75. table.insert(configs, "-DCMAKE_BUILD_TYPE=" .. (package:is_debug() and "Debug" or "Release"))
  76. table.insert(configs, "-DBUILD_SHARED_LIBS=" .. (package:config("shared") and "ON" or "OFF"))
  77. local openssl = package:dep("openssl3")
  78. if openssl and not openssl:is_system() then
  79. table.insert(configs, "-DOPENSSL_USE_STATIC_LIBS=" .. (not openssl:config("shared") and "ON" or "OFF"))
  80. table.insert(configs, "-DOPENSSL_ROOT_DIR=" .. openssl:installdir())
  81. end
  82. table.insert(configs, "-DUSE_GNUTLS=" .. (package:config("gnutls") and "ON" or "OFF"))
  83. table.insert(configs, "-DUSE_MBEDTLS=" .. (package:config("mbedtls") and "ON" or "OFF"))
  84. table.insert(configs, "-DUSE_NICE=" .. (package:config("nice") and "ON" or "OFF"))
  85. table.insert(configs, "-DNO_WEBSOCKET=" .. (not package:config("websocket") and "ON" or "OFF"))
  86. table.insert(configs, "-DNO_MEDIA=" .. (not package:config("media") and "ON" or "OFF"))
  87. table.insert(configs, "-DCAPI_STDCALL=" .. (package:config("capi_stdcall") and "ON" or "OFF"))
  88. table.insert(configs, "-DSCTP_DEBUG=" .. (package:config("sctp_debug") and "ON" or "OFF"))
  89. table.insert(configs, "-DRTC_UPDATE_VERSION_HEADER=" .. (package:config("rtc_update_version_header") and "ON" or "OFF"))
  90. import("package.tools.cmake").install(package, configs, {
  91. targets = {
  92. package:config("shared") and "datachannel" or "datachannel-static",
  93. }
  94. })
  95. end)
  96. on_test(function (package)
  97. assert(package:has_cfuncs("rtcSetUserPointer", {includes = "rtc/rtc.h"}))
  98. end)